From d194e865c51462966dd4c458e5d9388314a617d5 Mon Sep 17 00:00:00 2001 From: Sridhar R M Date: Fri, 1 Nov 2024 07:23:23 +0000 Subject: [PATCH] [Enhancement] (nereids)implement showCreateCatalogCommand in nereids --- .../org/apache/doris/nereids/DorisParser.g4 | 3 +- .../apache/doris/datasource/CatalogMgr.java | 17 ++-- .../nereids/parser/LogicalPlanBuilder.java | 8 +- .../doris/nereids/trees/plans/PlanType.java | 1 + .../commands/ShowCreateCatalogCommand.java | 80 +++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 ++ .../show/test_show_create_catalog.out | 4 + .../show/test_show_create_catalog.groovy | 32 ++++++++ 8 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateCatalogCommand.java create mode 100644 regression-test/data/nereids_p0/show/test_show_create_catalog.out create mode 100644 regression-test/suites/nereids_p0/show/test_show_create_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 37c9be99177fb3..cdd7291fa579b0 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 @@ -212,6 +212,7 @@ supportedShowStatement | SHOW PRIVILEGES #showPrivileges | SHOW PROC path=STRING_LITERAL #showProc | SHOW STORAGE? ENGINES #showStorageEngines + | SHOW CREATE CATALOG name=identifier #showCreateCatalog | SHOW SQL_BLOCK_RULE (FOR ruleName=identifier)? #showSqlBlockRule | SHOW CREATE MATERIALIZED VIEW mvName=identifier ON tableName=multipartIdentifier #showCreateMaterializedView @@ -248,7 +249,6 @@ lockTable (READ (LOCAL)? | (LOW_PRIORITY)? WRITE) ; - unsupportedShowStatement : SHOW ROW POLICY (FOR (userIdentify | (ROLE role=identifier)))? #showRowPolicy | SHOW STORAGE POLICY (USING (FOR policy=identifierOrText)?)? #showStoragePolicy @@ -267,7 +267,6 @@ unsupportedShowStatement | SHOW CREATE VIEW name=multipartIdentifier #showCreateView | SHOW CREATE MATERIALIZED VIEW name=multipartIdentifier #showMaterializedView | SHOW CREATE (DATABASE | SCHEMA) name=multipartIdentifier #showCreateDatabase - | SHOW CREATE CATALOG name=identifier #showCreateCatalog | SHOW CREATE (GLOBAL | SESSION | LOCAL)? FUNCTION functionIdentifier LEFT_PAREN functionArguments? RIGHT_PAREN ((FROM | IN) database=multipartIdentifier)? #showCreateFunction 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 91273736ebfecc..1d1a44be7b4834 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 @@ -440,17 +440,16 @@ public static Map getCatalogPropertiesWithPrintable(CatalogIf return sortedMap; } - - public ShowResultSet showCreateCatalog(ShowCreateCatalogStmt showStmt) throws AnalysisException { + public List> showCreateCatalog(String catalogName) throws AnalysisException { List> rows = Lists.newArrayList(); readLock(); try { - CatalogIf catalog = nameToCatalog.get(showStmt.getCatalog()); + CatalogIf catalog = nameToCatalog.get(catalogName); if (catalog == null) { - throw new AnalysisException("No catalog found with name " + showStmt.getCatalog()); + throw new AnalysisException("No catalog found with name " + catalogName); } StringBuilder sb = new StringBuilder(); - sb.append("\nCREATE CATALOG `").append(ClusterNamespace.getNameFromFullName(showStmt.getCatalog())) + sb.append("\nCREATE CATALOG `").append(ClusterNamespace.getNameFromFullName(catalogName)) .append("`"); if (!Strings.isNullOrEmpty(catalog.getComment())) { sb.append("\nCOMMENT \"").append(catalog.getComment()).append("\"\n"); @@ -464,11 +463,17 @@ public ShowResultSet showCreateCatalog(ShowCreateCatalogStmt showStmt) throws An sb.append("\n);"); } - rows.add(Lists.newArrayList(ClusterNamespace.getNameFromFullName(showStmt.getCatalog()), sb.toString())); + rows.add(Lists.newArrayList(ClusterNamespace.getNameFromFullName(catalogName), sb.toString())); } finally { readUnlock(); } + return rows; + } + + public ShowResultSet showCreateCatalog(ShowCreateCatalogStmt showStmt) throws AnalysisException { + List> rows = showCreateCatalog(showStmt.getCatalog()); + return new ShowResultSet(showStmt.getMetaData(), rows); } 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 32f85a52a1282f..c1b551a960d575 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 @@ -199,6 +199,7 @@ import org.apache.doris.nereids.DorisParser.ShowBackendsContext; import org.apache.doris.nereids.DorisParser.ShowConfigContext; import org.apache.doris.nereids.DorisParser.ShowConstraintContext; +import org.apache.doris.nereids.DorisParser.ShowCreateCatalogContext; import org.apache.doris.nereids.DorisParser.ShowCreateMTMVContext; import org.apache.doris.nereids.DorisParser.ShowCreateMaterializedViewContext; import org.apache.doris.nereids.DorisParser.ShowCreateProcedureContext; @@ -450,6 +451,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowBackendsCommand; 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; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; @@ -4059,7 +4061,6 @@ public SetDefaultStorageVaultCommand visitSetDefaultStorageVault(SetDefaultStora } @Override - public Object visitRefreshCatalog(RefreshCatalogContext ctx) { if (ctx.name != null) { String catalogName = ctx.name.getText(); @@ -4171,6 +4172,11 @@ public LogicalPlan visitShowProc(ShowProcContext ctx) { return new ShowProcCommand(path); } + @Override + public LogicalPlan visitShowCreateCatalog(ShowCreateCatalogContext ctx) { + return new ShowCreateCatalogCommand(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 8f68cd7287efd6..8a7e108c58de6e 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 @@ -180,6 +180,7 @@ public enum PlanType { SHOW_BACKENDS_COMMAND, SHOW_BLOCK_RULE_COMMAND, SHOW_CONFIG_COMMAND, + SHOW_CREATE_CATALOG_COMMAND, SHOW_CREATE_MATERIALIZED_VIEW_COMMAND, SHOW_FRONTENDS_COMMAND, SHOW_GRANTS_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateCatalogCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateCatalogCommand.java new file mode 100644 index 00000000000000..c00cb1e9464330 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateCatalogCommand.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.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 CREATE CATALOG. + */ +public class ShowCreateCatalogCommand extends ShowCommand { + private static final ShowResultSetMetaData META_DATA = + ShowResultSetMetaData.builder() + .addColumn(new Column("Catalog", ScalarType.createVarchar(20))) + .addColumn(new Column("CreateCatalog", ScalarType.createVarchar(30))) + .build(); + + private final String catalogName; + + public ShowCreateCatalogCommand(String catalogName) { + super(PlanType.SHOW_CREATE_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().showCreateCatalog(catalogName); + + return new ShowResultSet(getMetaData(), rows); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowCreateCatalogCommand(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 d80a24cd347172..8d9d350ee7aae7 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 @@ -54,6 +54,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowBackendsCommand; 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; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; @@ -311,6 +312,10 @@ default R visitShowStorageEnginesCommand(ShowStorageEnginesCommand showStorageEn return visitCommand(showStorageEnginesCommand, context); } + default R visitShowCreateCatalogCommand(ShowCreateCatalogCommand showCreateCatalogCommand, C context) { + return visitCommand(showCreateCatalogCommand, context); + } + default R visitShowCreateMaterializedViewCommand(ShowCreateMaterializedViewCommand showCreateMtlzViewCommand, C context) { return visitCommand(showCreateMtlzViewCommand, context); diff --git a/regression-test/data/nereids_p0/show/test_show_create_catalog.out b/regression-test/data/nereids_p0/show/test_show_create_catalog.out new file mode 100644 index 00000000000000..ecc7164312f560 --- /dev/null +++ b/regression-test/data/nereids_p0/show/test_show_create_catalog.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !cmd -- +es \nCREATE CATALOG `es` PROPERTIES (\n"type" = "es",\n"hosts" = "http://127.0.0.1:9200"\n); + diff --git a/regression-test/suites/nereids_p0/show/test_show_create_catalog.groovy b/regression-test/suites/nereids_p0/show/test_show_create_catalog.groovy new file mode 100644 index 00000000000000..a90ed334ffe64c --- /dev/null +++ b/regression-test/suites/nereids_p0/show/test_show_create_catalog.groovy @@ -0,0 +1,32 @@ +// 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_create_catalog", "p0,external,hive,external_docker,external_docker_hive") { + + 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 create catalog ${catalog_name}""") + qt_cmd("""show create catalog ${catalog_name}""") + + sql """drop catalog if exists ${catalog_name}""" +}