This is an automated email from the ASF dual-hosted git repository.
starocean999 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new ae1e6bc878c [Enhancement] (nereids)implement SHOW CATALOG COMMAND in
nereids (#44633)
ae1e6bc878c is described below
commit ae1e6bc878ca4c02b924aa8d5f969c1b34fc48ba
Author: Yao-MR <[email protected]>
AuthorDate: Thu Jan 9 14:43:31 2025 +0800
[Enhancement] (nereids)implement SHOW CATALOG COMMAND in nereids (#44633)
Issue Number: close #42745
---
.../antlr4/org/apache/doris/nereids/DorisParser.g4 | 4 +-
.../org/apache/doris/datasource/CatalogMgr.java | 31 +++---
.../doris/nereids/parser/LogicalPlanBuilder.java | 19 ++++
.../apache/doris/nereids/trees/plans/PlanType.java | 1 +
.../trees/plans/commands/ShowCatalogCommand.java | 104 +++++++++++++++++++++
.../trees/plans/visitor/CommandVisitor.java | 5 +
.../nereids_p0/show/test_show_catalog.groovy | 33 +++++++
7 files changed, 184 insertions(+), 13 deletions(-)
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index 7e89accefca..7045733bafd 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -273,6 +273,8 @@ supportedShowStatement
| SHOW FILE ((FROM | IN) database=multipartIdentifier)?
#showSmallFiles
| SHOW STORAGE? ENGINES
#showStorageEngines
| SHOW CREATE CATALOG name=identifier
#showCreateCatalog
+ | SHOW CATALOG name=identifier
#showCatalog
+ | SHOW CATALOGS wildWhere?
#showCatalogs
| SHOW PROPERTY (FOR user=identifierOrText)? (LIKE STRING_LITERAL)?
#showUserProperties
| SHOW ALL PROPERTIES (LIKE STRING_LITERAL)?
#showAllProperties
| SHOW COLLATION wildWhere?
#showCollation
@@ -351,8 +353,6 @@ unsupportedShowStatement
LEFT_PAREN functionArguments? RIGHT_PAREN
((FROM | IN) database=multipartIdentifier)?
#showCreateFunction
| SHOW (DATABASES | SCHEMAS) (FROM catalog=identifier)? wildWhere?
#showDatabases
- | SHOW CATALOGS wildWhere?
#showCatalogs
- | SHOW CATALOG name=identifier
#showCatalog
| SHOW FULL? (COLUMNS | FIELDS) (FROM | IN) tableName=multipartIdentifier
((FROM | IN) database=multipartIdentifier)? wildWhere?
#showColumns
| SHOW LOAD WARNINGS ((((FROM | IN) database=multipartIdentifier)?
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
index d73d2b85b26..b3d561e518f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
@@ -405,14 +405,21 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
}
public ShowResultSet showCatalogs(ShowCatalogStmt showStmt, String
currentCtlg) throws AnalysisException {
+ List<List<String>> rows = showCatalogs(showStmt.getCatalogName(),
showStmt.getPattern(), currentCtlg);
+
+ return new ShowResultSet(showStmt.getMetaData(), rows);
+ }
+
+ public List<List<String>> showCatalogs(
+ String catalogName, String pattern, String currentCatalogName)
throws AnalysisException {
List<List<String>> rows = Lists.newArrayList();
readLock();
try {
- if (showStmt.getCatalogName() == null) {
+ if (catalogName == null) {
PatternMatcher matcher = null;
- if (showStmt.getPattern() != null) {
- matcher =
PatternMatcherWrapper.createMysqlPattern(showStmt.getPattern(),
- CaseSensibility.CATALOG.getCaseSensibility());
+ if (pattern != null) {
+ matcher = PatternMatcherWrapper.createMysqlPattern(pattern,
+ CaseSensibility.CATALOG.getCaseSensibility());
}
for (CatalogIf catalog :
listCatalogsWithCheckPriv(ConnectContext.get().getCurrentUserIdentity())) {
String name = catalog.getName();
@@ -424,7 +431,7 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
row.add(String.valueOf(catalog.getId()));
row.add(name);
row.add(catalog.getType());
- if (name.equals(currentCtlg)) {
+ if (name.equals(currentCatalogName)) {
row.add("Yes");
} else {
row.add("No");
@@ -442,14 +449,16 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
});
}
} else {
- if (!nameToCatalog.containsKey(showStmt.getCatalogName())) {
- throw new AnalysisException("No catalog found with name: "
+ showStmt.getCatalogName());
+ if (!nameToCatalog.containsKey(catalogName)) {
+ throw new AnalysisException("No catalog found with name: "
+ catalogName);
}
- CatalogIf<DatabaseIf> catalog =
nameToCatalog.get(showStmt.getCatalogName());
+ CatalogIf<DatabaseIf> catalog = nameToCatalog.get(catalogName);
if (!Env.getCurrentEnv().getAccessManager()
.checkCtlPriv(ConnectContext.get(), catalog.getName(),
PrivPredicate.SHOW)) {
-
ErrorReport.reportAnalysisException(ErrorCode.ERR_CATALOG_ACCESS_DENIED,
- ConnectContext.get().getQualifiedUser(),
catalog.getName());
+ ErrorReport.reportAnalysisException(
+ ErrorCode.ERR_CATALOG_ACCESS_DENIED,
+ ConnectContext.get().getQualifiedUser(),
+ catalog.getName());
}
if (!Strings.isNullOrEmpty(catalog.getResource())) {
rows.add(Arrays.asList("resource", catalog.getResource()));
@@ -461,7 +470,7 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
readUnlock();
}
- return new ShowResultSet(showStmt.getMetaData(), rows);
+ return rows;
}
public static Map<String, String>
getCatalogPropertiesWithPrintable(CatalogIf<?> catalog) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 66ee9c33c09..b3a62e604c5 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -558,6 +558,7 @@ import
org.apache.doris.nereids.trees.plans.commands.SetUserPropertiesCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowAuthorsCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowBackendsCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowBrokerCommand;
+import org.apache.doris.nereids.trees.plans.commands.ShowCatalogCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowCharsetCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowCollationCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowConfigCommand;
@@ -4884,6 +4885,24 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
return new ShowCreateCatalogCommand(ctx.identifier().getText());
}
+ @Override
+ public LogicalPlan visitShowCatalog(DorisParser.ShowCatalogContext ctx) {
+ return new ShowCatalogCommand(ctx.identifier().getText(), null);
+ }
+
+ @Override
+ public LogicalPlan visitShowCatalogs(DorisParser.ShowCatalogsContext ctx) {
+ String wild = null;
+ if (ctx.wildWhere() != null) {
+ if (ctx.wildWhere().LIKE() != null) {
+ wild = stripQuotes(ctx.wildWhere().STRING_LITERAL().getText());
+ } else if (ctx.wildWhere().WHERE() != null) {
+ wild = ctx.wildWhere().expression().getText();
+ }
+ }
+ return new ShowCatalogCommand(null, wild);
+ }
+
@Override
public LogicalPlan visitShowStorageEngines(ShowStorageEnginesContext ctx) {
return new ShowStorageEnginesCommand();
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
index 01152dc3d17..adbf3720c05 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
@@ -213,6 +213,7 @@ public enum PlanType {
SHOW_BACKENDS_COMMAND,
SHOW_BLOCK_RULE_COMMAND,
SHOW_BROKER_COMMAND,
+ SHOW_CATALOG_COMMAND,
SHOW_CHARSET_COMMAND,
SHOW_COLLATION_COMMAND,
SHOW_CONFIG_COMMAND,
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCatalogCommand.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCatalogCommand.java
new file mode 100644
index 00000000000..32ccee97380
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCatalogCommand.java
@@ -0,0 +1,104 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.plans.commands;
+
+import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.ShowResultSet;
+import org.apache.doris.qe.ShowResultSetMetaData;
+import org.apache.doris.qe.StmtExecutor;
+
+import java.util.List;
+
+/**
+ * Represents the command for show all catalog or desc the specific catalog.
+ */
+public class ShowCatalogCommand extends ShowCommand {
+ private static final ShowResultSetMetaData META_DATA_ALL =
+ ShowResultSetMetaData.builder().addColumn(new Column("CatalogId",
ScalarType.BIGINT))
+ .addColumn(new Column("CatalogName",
ScalarType.createVarchar(64)))
+ .addColumn(new Column("Type", ScalarType.createStringType()))
+ .addColumn(new Column("IsCurrent",
ScalarType.createStringType()))
+ .addColumn(new Column("CreateTime",
ScalarType.createStringType()))
+ .addColumn(new Column("LastUpdateTime",
ScalarType.createStringType()))
+ .addColumn(new Column("Comment",
ScalarType.createStringType()))
+ .build();
+
+ private static final ShowResultSetMetaData META_DATA_SPECIFIC =
+ ShowResultSetMetaData.builder()
+ .addColumn(new Column("Key", ScalarType.createStringType()))
+ .addColumn(new Column("Value", ScalarType.createStringType()))
+ .build();
+
+ private final String catalogName;
+ private final String pattern;
+
+ public ShowCatalogCommand(String catalogName, String pattern) {
+ super(PlanType.SHOW_CATALOG_COMMAND);
+ this.catalogName = catalogName;
+ this.pattern = pattern;
+ }
+
+ @Override
+ public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor)
throws Exception {
+ List<List<String>> rows = Env.getCurrentEnv().getCatalogMgr()
+ .showCatalogs(catalogName, pattern, ctx.getCurrentCatalog() !=
null
+ ? ctx.getCurrentCatalog().getName() : null);
+
+ return new ShowResultSet(getMetaData(), rows);
+ }
+
+ @Override
+ public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+ return visitor.visitShowCatalogCommand(this, context);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("SHOW");
+
+ if (catalogName != null) {
+ sb.append(" CATALOG ");
+ sb.append(catalogName);
+ } else {
+ sb.append(" CATALOGS");
+
+ if (pattern != null) {
+ sb.append(" LIKE ");
+ sb.append("'");
+ sb.append(pattern);
+ sb.append("'");
+ }
+ }
+
+ return sb.toString();
+ }
+
+ public ShowResultSetMetaData getMetaData() {
+ if (catalogName == null) {
+ return META_DATA_ALL;
+ } else {
+ return META_DATA_SPECIFIC;
+ }
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
index ed4a1bdb1b3..2c926c1de1a 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
@@ -93,6 +93,7 @@ import
org.apache.doris.nereids.trees.plans.commands.SetUserPropertiesCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowAuthorsCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowBackendsCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowBrokerCommand;
+import org.apache.doris.nereids.trees.plans.commands.ShowCatalogCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowCharsetCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowCollationCommand;
import org.apache.doris.nereids.trees.plans.commands.ShowConfigCommand;
@@ -527,6 +528,10 @@ public interface CommandVisitor<R, C> {
return visitCommand(showCreateCatalogCommand, context);
}
+ default R visitShowCatalogCommand(ShowCatalogCommand showCatalogCommand, C
context) {
+ return visitCommand(showCatalogCommand, context);
+ }
+
default R
visitShowCreateMaterializedViewCommand(ShowCreateMaterializedViewCommand
showCreateMtlzViewCommand,
C context) {
return visitCommand(showCreateMtlzViewCommand, context);
diff --git a/regression-test/suites/nereids_p0/show/test_show_catalog.groovy
b/regression-test/suites/nereids_p0/show/test_show_catalog.groovy
new file mode 100644
index 00000000000..cc730068289
--- /dev/null
+++ b/regression-test/suites/nereids_p0/show/test_show_catalog.groovy
@@ -0,0 +1,33 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_show_catalog", "query,catalog") {
+
+ String catalog_name = "es"
+
+ sql """drop catalog if exists ${catalog_name}"""
+ sql """create catalog if not exists ${catalog_name} properties (
+ "type"="es",
+ "hosts"="http://127.0.0.1:9200"
+ );"""
+
+ checkNereidsExecute("""show catalog ${catalog_name}""")
+ checkNereidsExecute("""show catalogs like 'e%'""")
+ checkNereidsExecute("""show catalogs """)
+
+ sql """drop catalog if exists ${catalog_name}"""
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]