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 <yao.mr...@gmail.com>
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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to