From 18d9fc12be2985f940d8463f838c0682fe485579 Mon Sep 17 00:00:00 2001 From: Yao-MR Date: Tue, 26 Nov 2024 17:11:41 +0800 Subject: [PATCH] [Enhancement] (nereids)implement SHOW CATALOG COMMAND in nereids --- .../org/apache/doris/nereids/DorisParser.g4 | 2 +- .../apache/doris/datasource/CatalogMgr.java | 31 ++++--- .../nereids/parser/LogicalPlanBuilder.java | 6 ++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../plans/commands/ShowCatalogCommand.java | 80 +++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 ++ .../nereids_p0/show/test_show_catalog.out | 6 ++ .../nereids_p0/show/test_show_catalog.groovy | 34 ++++++++ 8 files changed, 153 insertions(+), 12 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCatalogCommand.java create mode 100644 regression-test/data/nereids_p0/show/test_show_catalog.out 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 47214c8c271af69..872b57bc025b6a4 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,7 @@ supportedShowStatement | SHOW PROC path=STRING_LITERAL #showProc | SHOW STORAGE? ENGINES #showStorageEngines | SHOW CREATE CATALOG name=identifier #showCreateCatalog + | SHOW CATALOG name=identifier #showCatalog | SHOW SQL_BLOCK_RULE (FOR ruleName=identifier)? #showSqlBlockRule | SHOW CREATE MATERIALIZED VIEW mvName=identifier ON tableName=multipartIdentifier #showCreateMaterializedView @@ -289,7 +290,6 @@ unsupportedShowStatement | 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 1d1a44be7b48340..eab94b2da68737e 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 5d31b284e15562e..a1a2d4e5ee11cba 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,11 @@ public LogicalPlan visitShowCreateCatalog(ShowCreateCatalogContext ctx) { return new ShowCreateCatalogCommand(ctx.identifier().getText()); } + @Override + public LogicalPlan visitShowCatalog(DorisParser.ShowCatalogContext ctx) { + return new ShowCatalogCommand(ctx.identifier().getText()); + } + @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 f36af26e89273e3..6701b701e4f33d7 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 000000000000000..0282608b2404d00 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCatalogCommand.java @@ -0,0 +1,80 @@ +// 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.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.datasource.InternalCatalog; +import org.apache.doris.mysql.privilege.PrivPredicate; +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 com.google.common.base.Strings; + +import java.util.List; +import java.util.Objects; + +/** + * Represents the command for SHOW CATALOG. + */ +public class ShowCatalogCommand extends ShowCommand { + private static final ShowResultSetMetaData META_DATA = ShowResultSetMetaData.builder() + .addColumn(new Column("Key", ScalarType.createStringType())) + .addColumn(new Column("Value", ScalarType.createStringType())) + .build(); + + private final String catalogName; + + public ShowCatalogCommand(String catalogName) { + super(PlanType.SHOW_CATALOG_COMMAND); + this.catalogName = Objects.requireNonNull(catalogName, "Catalog name cannot be null"); + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + if (Strings.isNullOrEmpty(catalogName)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_CATALOG_NAME, catalogName); + } + + if (!Env.getCurrentEnv().getAccessManager() + .checkCtlPriv(ConnectContext.get(), catalogName, PrivPredicate.SHOW)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_CATALOG_ACCESS_DENIED, + ConnectContext.get().getQualifiedUser(), catalogName); + } + + List> rows = Env.getCurrentEnv().getCatalogMgr() + .showCatalogs(catalogName, null, InternalCatalog.INTERNAL_CATALOG_NAME); + return new ShowResultSet(getMetaData(), rows); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowCatalogCommand(this, context); + } + + public ShowResultSetMetaData getMetaData() { + return META_DATA; + } +} 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 4383ebc01a0b9e8..b6584b65d4aa535 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/data/nereids_p0/show/test_show_catalog.out b/regression-test/data/nereids_p0/show/test_show_catalog.out new file mode 100644 index 000000000000000..2108ed8ade811d9 --- /dev/null +++ b/regression-test/data/nereids_p0/show/test_show_catalog.out @@ -0,0 +1,6 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !cmd -- +create_time 2024-11-28 06:51:03.507996236 +hosts http://127.0.0.1:9200 +type es +use_meta_cache true 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 000000000000000..0415e7eb2fc755d --- /dev/null +++ b/regression-test/suites/nereids_p0/show/test_show_catalog.groovy @@ -0,0 +1,34 @@ +// 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") { + + 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}""") + + def result = sql "show catalog ${catalog_name}"; + logger.info("${result}"); + + sql """drop catalog if exists ${catalog_name}""" +}