From d360f666dddb5aba01746f38be5717d3812befc7 Mon Sep 17 00:00:00 2001 From: Yao-MR Date: Tue, 26 Nov 2024 17:11:41 +0800 Subject: [PATCH 1/2] [Enhancement] (nereids)implement SHOW CATALOG COMMAND in nereids --- .../org/apache/doris/nereids/DorisParser.g4 | 4 +- .../apache/doris/datasource/CatalogMgr.java | 31 ++++-- .../nereids/parser/LogicalPlanBuilder.java | 19 ++++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../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(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCatalogCommand.java create mode 100644 regression-test/suites/nereids_p0/show/test_show_catalog.groovy 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 47214c8c271af6..d2ad97091eecce 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 @@ -223,6 +223,8 @@ supportedShowStatement | SHOW PROC path=STRING_LITERAL #showProc | SHOW STORAGE? ENGINES #showStorageEngines | SHOW CREATE CATALOG name=identifier #showCreateCatalog + | SHOW CATALOG name=identifier #showCatalog + | SHOW CATALOGS wildWhere? #showCatalogs | SHOW SQL_BLOCK_RULE (FOR ruleName=identifier)? #showSqlBlockRule | SHOW CREATE MATERIALIZED VIEW mvName=identifier ON tableName=multipartIdentifier #showCreateMaterializedView @@ -288,8 +290,6 @@ unsupportedShowStatement | SHOW (DATABASES | SCHEMAS) (FROM catalog=identifier)? wildWhere? #showDatabases | SHOW DATABASE databaseId=INTEGER_VALUE #showDatabaseId | SHOW DATA TYPES #showDataTypes - | SHOW CATALOGS wildWhere? #showCatalogs - | SHOW CATALOG name=identifier #showCatalog | SHOW FULL? (COLUMNS | FIELDS) (FROM | IN) tableName=multipartIdentifier ((FROM | IN) database=multipartIdentifier)? wildWhere? #showColumns | SHOW COLLATION wildWhere? #showCollation 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 1d1a44be7b4834..eab94b2da68737 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 @@ -363,14 +363,21 @@ public ShowResultSet showCatalogs(ShowCatalogStmt showStmt) throws AnalysisExcep } public ShowResultSet showCatalogs(ShowCatalogStmt showStmt, String currentCtlg) throws AnalysisException { + List> rows = showCatalogs(showStmt.getCatalogName(), showStmt.getPattern(), currentCtlg); + + return new ShowResultSet(showStmt.getMetaData(), rows); + } + + public List> showCatalogs( + String catalogName, String pattern, String currentCatalogName) throws AnalysisException { List> 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(); @@ -382,7 +389,7 @@ public ShowResultSet showCatalogs(ShowCatalogStmt showStmt, String currentCtlg) 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"); @@ -400,14 +407,16 @@ public ShowResultSet showCatalogs(ShowCatalogStmt showStmt, String currentCtlg) }); } } 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 catalog = nameToCatalog.get(showStmt.getCatalogName()); + CatalogIf 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())); @@ -419,7 +428,7 @@ public ShowResultSet showCatalogs(ShowCatalogStmt showStmt, String currentCtlg) readUnlock(); } - return new ShowResultSet(showStmt.getMetaData(), rows); + return rows; } public static Map 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 5d31b284e15562..56868847825b04 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 @@ -471,6 +471,7 @@ 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.ShowConfigCommand; import org.apache.doris.nereids.trees.plans.commands.ShowConstraintsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateCatalogCommand; @@ -4259,6 +4260,24 @@ public LogicalPlan visitShowCreateCatalog(ShowCreateCatalogContext ctx) { 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 f36af26e89273e..6701b701e4f33d 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 @@ -187,6 +187,7 @@ public enum PlanType { SHOW_BACKENDS_COMMAND, SHOW_BLOCK_RULE_COMMAND, SHOW_BROKER_COMMAND, + SHOW_CATALOG_COMMAND, SHOW_CONFIG_COMMAND, SHOW_CREATE_CATALOG_COMMAND, SHOW_CREATE_MATERIALIZED_VIEW_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 00000000000000..32ccee97380a88 --- /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> rows = Env.getCurrentEnv().getCatalogMgr() + .showCatalogs(catalogName, pattern, ctx.getCurrentCatalog() != null + ? ctx.getCurrentCatalog().getName() : null); + + return new ShowResultSet(getMetaData(), rows); + } + + @Override + public R accept(PlanVisitor 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 4383ebc01a0b9e..b6584b65d4aa53 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 @@ -63,6 +63,7 @@ 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.ShowConfigCommand; import org.apache.doris.nereids.trees.plans.commands.ShowConstraintsCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateCatalogCommand; @@ -361,6 +362,10 @@ default R visitShowCreateCatalogCommand(ShowCreateCatalogCommand showCreateCatal 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 00000000000000..cc730068289668 --- /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}""" +} From a96b821c4c41a33509b5274816fcad5e5c681134 Mon Sep 17 00:00:00 2001 From: Yao-MR Date: Wed, 8 Jan 2025 19:26:53 +0800 Subject: [PATCH 2/2] reoslve conflict with master --- .../src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 | 3 --- 1 file changed, 3 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 b1c6c7734fc158..7045733bafdba7 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 @@ -353,9 +353,6 @@ unsupportedShowStatement LEFT_PAREN functionArguments? RIGHT_PAREN ((FROM | IN) database=multipartIdentifier)? #showCreateFunction | SHOW (DATABASES | SCHEMAS) (FROM catalog=identifier)? wildWhere? #showDatabases - | SHOW DATA TYPES #showDataTypes - | 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)?