From 97ee4c6a9d94a6293cfb6931cb235c3efd77a009 Mon Sep 17 00:00:00 2001 From: Sridhar R Manikarnike Date: Sun, 8 Dec 2024 17:45:50 +0000 Subject: [PATCH] [Enhancement] (nereids)implement alterCatalogPropertiesCommand in nereids --- .../org/apache/doris/nereids/DorisParser.g4 | 4 +- .../apache/doris/datasource/CatalogMgr.java | 23 +++++--- .../nereids/parser/LogicalPlanBuilder.java | 9 +++ .../doris/nereids/trees/plans/PlanType.java | 1 + .../AlterCatalogPropertiesCommand.java | 52 ++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 ++ .../test_alter_catalog_properties_command.out | 7 +++ ...st_alter_catalog_properties_command.groovy | 55 +++++++++++++++++++ 8 files changed, 147 insertions(+), 9 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogPropertiesCommand.java create mode 100644 regression-test/data/nereids_p0/test_alter_catalog_properties_command.out create mode 100644 regression-test/suites/nereids_p0/test_alter_catalog_properties_command.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 97876c231fec69..0fe5cc707681f1 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 @@ -207,6 +207,8 @@ supportedAlterStatement | ALTER ROLE role=identifier commentSpec #alterRole | ALTER WORKLOAD GROUP name=identifierOrText properties=propertyClause? #alterWorkloadGroup + | ALTER CATALOG name=identifier SET PROPERTIES + LEFT_PAREN propertyItemList RIGHT_PAREN #alterCatalogProperties | ALTER WORKLOAD POLICY name=identifierOrText properties=propertyClause? #alterWorkloadPolicy | ALTER SQL_BLOCK_RULE name=identifier properties=propertyClause? #alterSqlBlockRule @@ -586,8 +588,6 @@ unsupportedAlterStatement | ALTER DATABASE name=identifier SET PROPERTIES LEFT_PAREN propertyItemList RIGHT_PAREN #alterDatabaseProperties | ALTER CATALOG name=identifier RENAME newName=identifier #alterCatalogRename - | ALTER CATALOG name=identifier SET PROPERTIES - LEFT_PAREN propertyItemList RIGHT_PAREN #alterCatalogProperties | ALTER RESOURCE name=identifierOrText properties=propertyClause? #alterResource | ALTER COLOCATE GROUP name=multipartIdentifier SET LEFT_PAREN propertyItemList RIGHT_PAREN #alterColocateGroup 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 f90a2a32fdc3ec..50a3ea0a5bc28b 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 @@ -364,19 +364,21 @@ public void alterCatalogComment(AlterCatalogCommentStmt stmt) throws UserExcepti /** * Modify the catalog property and write the meta log. */ - public void alterCatalogProps(AlterCatalogPropertyStmt stmt) throws UserException { + public void alterCatalogProps(String catalogName, Map newProperties) throws UserException { writeLock(); try { - CatalogIf catalog = nameToCatalog.get(stmt.getCatalogName()); + CatalogIf catalog = nameToCatalog.get(catalogName); if (catalog == null) { - throw new DdlException("No catalog found with name: " + stmt.getCatalogName()); + throw new DdlException("No catalog found with name: " + catalogName); } Map oldProperties = catalog.getProperties(); - if (stmt.getNewProperties().containsKey("type") && !catalog.getType() - .equalsIgnoreCase(stmt.getNewProperties().get("type"))) { - throw new DdlException("Can't modify the type of catalog property with name: " + stmt.getCatalogName()); + if (newProperties.containsKey("type") && !catalog.getType() + .equalsIgnoreCase(newProperties.get("type"))) { + throw new DdlException("Can't modify the type of catalog property with name: " + catalogName); } - CatalogLog log = CatalogFactory.createCatalogLog(catalog.getId(), stmt); + CatalogLog log = new CatalogLog(); + log.setCatalogId(catalog.getId()); + log.setNewProps(newProperties); replayAlterCatalogProps(log, oldProperties, false); Env.getCurrentEnv().getEditLog().logCatalogLog(OperationType.OP_ALTER_CATALOG_PROPS, log); } finally { @@ -384,6 +386,13 @@ public void alterCatalogProps(AlterCatalogPropertyStmt stmt) throws UserExceptio } } + /** + * Modify the catalog property and write the meta log. + */ + public void alterCatalogProps(AlterCatalogPropertyStmt stmt) throws UserException { + alterCatalogProps(stmt.getCatalogName(), stmt.getNewProperties()); + } + /** * List all catalog or get the special catalog with a name. */ 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 bb344e1b376deb..271a77b14b53d9 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 @@ -64,6 +64,7 @@ import org.apache.doris.nereids.DorisParser.AliasQueryContext; import org.apache.doris.nereids.DorisParser.AliasedQueryContext; import org.apache.doris.nereids.DorisParser.AlterCatalogCommentContext; +import org.apache.doris.nereids.DorisParser.AlterCatalogPropertiesContext; import org.apache.doris.nereids.DorisParser.AlterMTMVContext; import org.apache.doris.nereids.DorisParser.AlterRoleContext; import org.apache.doris.nereids.DorisParser.AlterSqlBlockRuleContext; @@ -498,6 +499,7 @@ import org.apache.doris.nereids.trees.plans.commands.AdminSetTableStatusCommand; import org.apache.doris.nereids.trees.plans.commands.AdminShowReplicaStatusCommand; import org.apache.doris.nereids.trees.plans.commands.AlterCatalogCommentCommand; +import org.apache.doris.nereids.trees.plans.commands.AlterCatalogPropertiesCommand; import org.apache.doris.nereids.trees.plans.commands.AlterMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.AlterRoleCommand; import org.apache.doris.nereids.trees.plans.commands.AlterSqlBlockRuleCommand; @@ -4952,6 +4954,13 @@ public LogicalPlan visitShowWarningErrors(ShowWarningErrorsContext ctx) { return new ShowWarningErrorsCommand(isWarning, limit); } + @Override + public LogicalPlan visitAlterCatalogProperties(AlterCatalogPropertiesContext ctx) { + String catalogName = stripQuotes(ctx.name.getText()); + Map properties = visitPropertyItemList(ctx.propertyItemList()); + return new AlterCatalogPropertiesCommand(catalogName, properties); + } + @Override public RecoverTableCommand visitRecoverTable(RecoverTableContext ctx) { List dbTblNameParts = visitMultipartIdentifier(ctx.name); 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 dfc129f10b0fd6..9eb36923f63828 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 @@ -153,6 +153,7 @@ public enum PlanType { DROP_JOB_COMMAND, RESUME_JOB_COMMAND, ALTER_MTMV_COMMAND, + ALTER_CATALOG_PROPERTIES_COMMAND, ADD_CONSTRAINT_COMMAND, ADMIN_COMPACT_TABLE_COMMAND, DROP_CONSTRAINT_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogPropertiesCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogPropertiesCommand.java new file mode 100644 index 00000000000000..1a4f5fbf6fdbce --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogPropertiesCommand.java @@ -0,0 +1,52 @@ +// 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.Env; +import org.apache.doris.common.util.PropertyAnalyzer; +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.StmtExecutor; + +import java.util.Map; +import java.util.Objects; + +/** + * Represents the command for ALTER CATALOG ... SET PROPERTIES. + */ +public class AlterCatalogPropertiesCommand extends AlterCatalogCommand { + private final Map newProperties; + + public AlterCatalogPropertiesCommand(String catalogName, Map properties) { + super(PlanType.ALTER_CATALOG_PROPERTIES_COMMAND, catalogName); + this.newProperties = Objects.requireNonNull(properties, "Properties cannot be null"); + } + + @Override + public void doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + PropertyAnalyzer.checkCatalogProperties(newProperties, true); + + Env.getCurrentEnv().getCatalogMgr().alterCatalogProps(catalogName, newProperties); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitAlterCatalogPropertiesCommand(this, context); + } +} 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 d3749e94d57d0f..5d406ea5192cdf 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 @@ -26,6 +26,7 @@ import org.apache.doris.nereids.trees.plans.commands.AdminSetTableStatusCommand; import org.apache.doris.nereids.trees.plans.commands.AdminShowReplicaStatusCommand; import org.apache.doris.nereids.trees.plans.commands.AlterCatalogCommentCommand; +import org.apache.doris.nereids.trees.plans.commands.AlterCatalogPropertiesCommand; import org.apache.doris.nereids.trees.plans.commands.AlterJobStatusCommand; import org.apache.doris.nereids.trees.plans.commands.AlterMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.AlterRoleCommand; @@ -551,6 +552,10 @@ default R visitShowWhiteListCommand(ShowWhiteListCommand whiteListCommand, C con return visitCommand(whiteListCommand, context); } + default R visitAlterCatalogPropertiesCommand(AlterCatalogPropertiesCommand alterCatalogPropsCmd, C context) { + return visitCommand(alterCatalogPropsCmd, context); + } + default R visitRecoverDatabaseCommand(RecoverDatabaseCommand recoverDatabaseCommand, C context) { return visitCommand(recoverDatabaseCommand, context); } diff --git a/regression-test/data/nereids_p0/test_alter_catalog_properties_command.out b/regression-test/data/nereids_p0/test_alter_catalog_properties_command.out new file mode 100644 index 00000000000000..6695bc26bda400 --- /dev/null +++ b/regression-test/data/nereids_p0/test_alter_catalog_properties_command.out @@ -0,0 +1,7 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !cmd -- +test_alter_catalog_properties \nCREATE CATALOG `test_alter_catalog_properties`\nCOMMENT "Catalog for property test"\n PROPERTIES (\n"type" = "es",\n"hosts" = "http://127.0.0.1:9200"\n); + +-- !cmd -- +test_alter_catalog_properties \nCREATE CATALOG `test_alter_catalog_properties`\nCOMMENT "Catalog for property test"\n PROPERTIES (\n"type" = "es",\n"hosts" = "http://192.168.0.1:9200"\n); + diff --git a/regression-test/suites/nereids_p0/test_alter_catalog_properties_command.groovy b/regression-test/suites/nereids_p0/test_alter_catalog_properties_command.groovy new file mode 100644 index 00000000000000..72bd89d11b7369 --- /dev/null +++ b/regression-test/suites/nereids_p0/test_alter_catalog_properties_command.groovy @@ -0,0 +1,55 @@ +// 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_alter_catalog_properties_command", "nereids_p0") { + def catalogName = "test_alter_catalog_properties" + def catalogProperties = "\"type\"=\"es\", \"hosts\"=\"http://127.0.0.1:9200\"" + def newProperties = "\"type\"=\"es\", \"hosts\"=\"http://192.168.0.1:9200\"" + + try { + // Drop catalog if it already exists + sql("DROP CATALOG IF EXISTS ${catalogName}") + + // Create a new catalog + sql( + """ + CREATE CATALOG ${catalogName} + COMMENT 'Catalog for property test' + PROPERTIES (${catalogProperties}) + """ + ) + // Verify the catalog was created + checkNereidsExecute("""SHOW CREATE CATALOG ${catalogName}""") + qt_cmd("""SHOW CREATE CATALOG ${catalogName}""") + + // Alter the catalog properties + checkNereidsExecute( + """ + ALTER CATALOG ${catalogName} SET PROPERTIES (${newProperties}) + """ + ) + + // Verify the properties were changed + checkNereidsExecute("""SHOW CREATE CATALOG ${catalogName}""") + qt_cmd("""SHOW CREATE CATALOG ${catalogName}""") + + } finally { + // Clean up + sql("DROP CATALOG IF EXISTS ${catalogName}") + } +} +