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