This is an automated email from the ASF dual-hosted git repository.
starocean999 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 5a938791d98 [Enhancement] (nereids)implement
alterCatalogPropertiesCommand in nereids (#45164)
5a938791d98 is described below
commit 5a938791d988f7b85aeeb6a1b0b77a2c7b0b56ae
Author: Sridhar R Manikarnike <[email protected]>
AuthorDate: Tue Mar 4 08:08:23 2025 +0530
[Enhancement] (nereids)implement alterCatalogPropertiesCommand in nereids
(#45164)
Issue Number: close #42789
---
.../antlr4/org/apache/doris/nereids/DorisParser.g4 | 4 +-
.../org/apache/doris/datasource/CatalogMgr.java | 23 ++++++---
.../doris/nereids/parser/LogicalPlanBuilder.java | 9 ++++
.../apache/doris/nereids/trees/plans/PlanType.java | 1 +
.../plans/commands/AlterCatalogCommentCommand.java | 1 +
...and.java => AlterCatalogPropertiesCommand.java} | 29 +++++------
.../trees/plans/visitor/CommandVisitor.java | 5 ++
.../test_alter_catalog_properties_command.out | Bin 0 -> 493 bytes
.../test_alter_catalog_properties_command.groovy | 55 +++++++++++++++++++++
9 files changed, 101 insertions(+), 26 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 74b73f0c023..c6e479c4483 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
@@ -229,6 +229,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
@@ -619,8 +621,6 @@ privilegeList
unsupportedAlterStatement
: ALTER DATABASE name=identifier SET PROPERTIES
LEFT_PAREN propertyItemList RIGHT_PAREN
#alterDatabaseProperties
- | 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 80c568b0b56..ca8d3147bc9 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
@@ -377,19 +377,21 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
/**
* Modify the catalog property and write the meta log.
*/
- public void alterCatalogProps(AlterCatalogPropertyStmt stmt) throws
UserException {
+ public void alterCatalogProps(String catalogName, Map<String, String>
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<String, String> 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 {
@@ -397,6 +399,13 @@ public class CatalogMgr implements Writable,
GsonPostProcessable {
}
}
+ /**
+ * 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 a8db953f76d..9a95767aeec 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
@@ -76,6 +76,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.AlterCatalogCommentContext;
+import org.apache.doris.nereids.DorisParser.AlterCatalogPropertiesContext;
import org.apache.doris.nereids.DorisParser.AlterCatalogRenameContext;
import org.apache.doris.nereids.DorisParser.AlterDatabaseRenameContext;
import org.apache.doris.nereids.DorisParser.AlterDatabaseSetQuotaContext;
@@ -516,6 +517,7 @@ import
org.apache.doris.nereids.trees.plans.commands.AdminRebalanceDiskCommand;
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.AlterCatalogRenameCommand;
import org.apache.doris.nereids.trees.plans.commands.AlterMTMVCommand;
import org.apache.doris.nereids.trees.plans.commands.AlterRoleCommand;
@@ -5382,6 +5384,13 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
return new ShowWarningErrorsCommand(isWarning, limit);
}
+ @Override
+ public LogicalPlan
visitAlterCatalogProperties(AlterCatalogPropertiesContext ctx) {
+ String catalogName = stripQuotes(ctx.name.getText());
+ Map<String, String> properties =
visitPropertyItemList(ctx.propertyItemList());
+ return new AlterCatalogPropertiesCommand(catalogName, properties);
+ }
+
@Override
public RecoverTableCommand visitRecoverTable(RecoverTableContext ctx) {
List<String> 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 bf7b10a1063..8269058a47b 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
@@ -158,6 +158,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/AlterCatalogCommentCommand.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogCommentCommand.java
index eafe1f7c2c1..474f3f6f3c8 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogCommentCommand.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogCommentCommand.java
@@ -42,6 +42,7 @@ public class AlterCatalogCommentCommand extends
AlterCatalogCommand {
@Override
public void doRun(ConnectContext ctx, StmtExecutor executor) throws
Exception {
+ validate(ctx);
// Validate the catalog name
if (Strings.isNullOrEmpty(comment)) {
throw new AnalysisException("New comment is not set.");
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogCommentCommand.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogPropertiesCommand.java
similarity index 61%
copy from
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogCommentCommand.java
copy to
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogPropertiesCommand.java
index eafe1f7c2c1..042a552f2d1 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogCommentCommand.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterCatalogPropertiesCommand.java
@@ -18,41 +18,36 @@
package org.apache.doris.nereids.trees.plans.commands;
import org.apache.doris.catalog.Env;
-import org.apache.doris.common.AnalysisException;
+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 com.google.common.base.Strings;
-
+import java.util.Map;
import java.util.Objects;
/**
- * Represents the command for ALTER CATALOG MODIFY COMMENT.
+ * Represents the command for ALTER CATALOG ... SET PROPERTIES.
*/
-public class AlterCatalogCommentCommand extends AlterCatalogCommand {
-
- private final String comment;
+public class AlterCatalogPropertiesCommand extends AlterCatalogCommand {
+ private final Map<String, String> newProperties;
- public AlterCatalogCommentCommand(String catalogName, String comment) {
- super(PlanType.ALTER_CATALOG_COMMENT_COMMAND, catalogName);
- this.comment = Objects.requireNonNull(comment, "Comment cannot be
null");
+ public AlterCatalogPropertiesCommand(String catalogName, Map<String,
String> 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 {
- // Validate the catalog name
- if (Strings.isNullOrEmpty(comment)) {
- throw new AnalysisException("New comment is not set.");
- }
+ validate(ctx);
+ PropertyAnalyzer.checkCatalogProperties(newProperties, true);
- // Fetch and modify the catalog's comment
- Env.getCurrentEnv().getCatalogMgr().alterCatalogComment(catalogName,
comment);
+ Env.getCurrentEnv().getCatalogMgr().alterCatalogProps(catalogName,
newProperties);
}
@Override
public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
- return visitor.visitAlterCatalogCommentCommand(this, 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 c990a7c496c..2d4b5e321bc 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.AdminRebalanceDiskCommand;
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.AlterCatalogRenameCommand;
import org.apache.doris.nereids.trees.plans.commands.AlterJobStatusCommand;
import org.apache.doris.nereids.trees.plans.commands.AlterMTMVCommand;
@@ -618,6 +619,10 @@ public interface CommandVisitor<R, C> {
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 00000000000..6695bc26bda
Binary files /dev/null and
b/regression-test/data/nereids_p0/test_alter_catalog_properties_command.out
differ
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 00000000000..72bd89d11b7
--- /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}")
+ }
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]