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 f229a1b2f4a7b1e..6ef6b75898663aa 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 @@ -201,6 +201,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 @@ -576,8 +578,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 CATALOG name=identifier MODIFY COMMENT comment=STRING_LITERAL #alterCatalogComment | ALTER RESOURCE name=identifierOrText properties=propertyClause? #alterResource | ALTER COLOCATE GROUP name=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 1d1a44be7b48340..c0c53bfc8708116 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 @@ -332,22 +332,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 { @@ -355,6 +354,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 71ea972c4ab2a21..ad040ca890ca327 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 @@ -58,6 +58,7 @@ import org.apache.doris.nereids.DorisParser.AggStateDataTypeContext; import org.apache.doris.nereids.DorisParser.AliasQueryContext; import org.apache.doris.nereids.DorisParser.AliasedQueryContext; +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; @@ -472,6 +473,7 @@ import org.apache.doris.nereids.trees.plans.commands.AddConstraintCommand; import org.apache.doris.nereids.trees.plans.commands.AdminCompactTableCommand; import org.apache.doris.nereids.trees.plans.commands.AdminShowReplicaStatusCommand; +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; @@ -4816,6 +4818,13 @@ public LogicalPlan visitRecoverDatabase(RecoverDatabaseContext ctx) { return new RecoverDatabaseCommand(dbName, dbId, newDbName); } + @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 bc8ccf83093b258..aa509e7fe49c725 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 @@ -151,6 +151,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 000000000000000..675ba311039b8d4 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogPropertiesCommand.java @@ -0,0 +1,54 @@ +// 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 AlterCommand { + private final String catalogName; + private final Map newProperties; + + public AlterCatalogPropertiesCommand(String catalogName, Map properties) { + super(PlanType.ALTER_CATALOG_PROPERTIES_COMMAND); + this.catalogName = Objects.requireNonNull(catalogName, "Catalog name cannot be null"); + 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 77846ff3ad5328c..3eb23dab68e1060 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 @@ -20,6 +20,7 @@ import org.apache.doris.nereids.trees.plans.commands.AddConstraintCommand; import org.apache.doris.nereids.trees.plans.commands.AdminCompactTableCommand; import org.apache.doris.nereids.trees.plans.commands.AdminShowReplicaStatusCommand; +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; @@ -483,6 +484,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 000000000000000..6695bc26bda400c --- /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 000000000000000..2a2e8331bca8454 --- /dev/null +++ b/regression-test/suites/nereids_p0/test_alter_catalog_properties_command.groovy @@ -0,0 +1,56 @@ +// 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, +// 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}") + } +} +