You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by st...@apache.org on 2025/12/03 06:31:49 UTC

(doris) branch master updated: [Enhancement](nereids) optimize to delete translateToLegacyAlterClause (#57121)

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 6c632884c7b [Enhancement](nereids) optimize to delete translateToLegacyAlterClause (#57121)
6c632884c7b is described below

commit 6c632884c7b170762cbccb8d436e985277f6ec34
Author: yaoxiao <yx...@163.com>
AuthorDate: Wed Dec 3 14:31:42 2025 +0800

    [Enhancement](nereids) optimize to delete translateToLegacyAlterClause (#57121)
---
 .../main/java/org/apache/doris/alter/Alter.java    | 387 ++++++++++-----------
 .../java/org/apache/doris/alter/AlterHandler.java  |  10 +-
 .../org/apache/doris/alter/AlterOperations.java    |  58 +--
 .../doris/alter/MaterializedViewHandler.java       |  78 ++---
 .../apache/doris/alter/SchemaChangeHandler.java    | 234 ++++++-------
 .../java/org/apache/doris/alter/SystemHandler.java | 119 +++----
 .../apache/doris/analysis/DistributionDesc.java    |   5 +
 .../doris/analysis/HashDistributionDesc.java       |   6 +
 .../apache/doris/analysis/PartitionExprUtil.java   |  18 +-
 .../apache/doris/analysis/PartitionKeyDesc.java    |   3 +-
 .../doris/analysis/RandomDistributionDesc.java     |   7 +
 .../java/org/apache/doris/catalog/BrokerMgr.java   |  17 +
 .../main/java/org/apache/doris/catalog/Env.java    |  97 +++---
 .../doris/clone/DynamicPartitionScheduler.java     |  91 ++---
 .../apache/doris/common/util/IdGeneratorUtil.java  |   2 +-
 .../apache/doris/datasource/InternalCatalog.java   |  96 ++---
 .../datasource/iceberg/IcebergExternalCatalog.java |  18 +-
 .../datasource/iceberg/IcebergMetadataOps.java     |  48 +--
 .../doris/insertoverwrite/InsertOverwriteUtil.java |  16 +-
 .../org/apache/doris/mtmv/MTMVPartitionUtil.java   |  13 +-
 .../doris/nereids/parser/LogicalPlanBuilder.java   |   8 +-
 .../trees/plans/commands/AlterSystemCommand.java   |   4 +-
 .../trees/plans/commands/AlterTableCommand.java    |  49 ++-
 .../trees/plans/commands/info/AddColumnOp.java     |  72 ++--
 .../trees/plans/commands/info/AddColumnsOp.java    |   7 -
 .../plans/commands/info/AddPartitionFieldOp.java   |   7 -
 ...DistributionOp.java => AddPartitionLikeOp.java} |  52 +--
 .../trees/plans/commands/info/AddPartitionOp.java  |  47 ++-
 .../trees/plans/commands/info/AddRollupOp.java     |   7 -
 .../plans/commands/info/AlterMultiPartitionOp.java |  10 +-
 .../info/{AlterSystemOp.java => AlterOp.java}      |  26 +-
 .../trees/plans/commands/info/AlterSystemOp.java   |   3 +-
 .../trees/plans/commands/info/AlterTableOp.java    |   6 +-
 .../trees/plans/commands/info/BuildIndexOp.java    |   8 -
 .../trees/plans/commands/info/CreateIndexOp.java   |   7 -
 .../commands/info/CreateOrReplaceBranchOp.java     |   7 +-
 .../plans/commands/info/CreateOrReplaceTagOp.java  |   7 +-
 .../trees/plans/commands/info/CreateTableInfo.java |   9 +-
 .../trees/plans/commands/info/DropBranchOp.java    |   7 +-
 .../trees/plans/commands/info/DropColumnOp.java    |   7 -
 .../trees/plans/commands/info/DropIndexOp.java     |   7 -
 .../plans/commands/info/DropPartitionFieldOp.java  |   7 -
 .../commands/info/DropPartitionFromIndexOp.java    |   7 -
 .../trees/plans/commands/info/DropPartitionOp.java |   7 -
 .../trees/plans/commands/info/DropRollupOp.java    |   7 -
 .../trees/plans/commands/info/DropTagOp.java       |   7 +-
 .../trees/plans/commands/info/EnableFeatureOp.java |   7 -
 ...rSystemOp.java => ModifyBackendHostNameOp.java} |  37 +-
 .../trees/plans/commands/info/ModifyBrokerOp.java  | 113 ++++++
 .../plans/commands/info/ModifyColumnCommentOp.java |   7 -
 .../trees/plans/commands/info/ModifyColumnOp.java  |   7 -
 .../plans/commands/info/ModifyDistributionOp.java  |   7 -
 .../trees/plans/commands/info/ModifyEngineOp.java  |   7 -
 ...SystemOp.java => ModifyFrontendHostNameOp.java} |  38 +-
 ...ndHostNameOp.java => ModifyNodeHostNameOp.java} |  16 +-
 .../plans/commands/info/ModifyPartitionOp.java     |  11 +-
 .../plans/commands/info/ModifyTableCommentOp.java  |   7 -
 .../commands/info/ModifyTablePropertiesOp.java     |   7 -
 .../trees/plans/commands/info/RenameColumnOp.java  |   7 -
 .../plans/commands/info/RenamePartitionOp.java     |   7 -
 .../trees/plans/commands/info/RenameRollupOp.java  |   7 -
 .../trees/plans/commands/info/RenameTableOp.java   |   7 -
 .../plans/commands/info/ReorderColumnsOp.java      |   7 -
 .../commands/info/ReplacePartitionFieldOp.java     |   8 -
 .../plans/commands/info/ReplacePartitionOp.java    |   8 -
 .../trees/plans/commands/info/ReplaceTableOp.java  |  11 +-
 .../plans/commands/info/RollupDefinition.java      |   4 +
 .../apache/doris/service/FrontendServiceImpl.java  |   8 +-
 .../org/apache/doris/system/SystemInfoService.java |  15 +
 .../org/apache/doris/alter/CloudIndexTest.java     |  66 ++--
 .../org/apache/doris/alter/IndexChangeJobTest.java | 248 ++++++-------
 .../org/apache/doris/alter/RollupJobV2Test.java    |  49 +--
 .../apache/doris/alter/SchemaChangeJobV2Test.java  |  91 ++---
 .../plans/commands/AlterSystemCommandTest.java     |   8 +-
 .../commands/info/AddPartitionFieldOpTest.java     |  27 --
 .../commands/info/DropPartitionFieldOpTest.java    |  13 -
 .../commands/info/ReplacePartitionFieldOpTest.java |  13 -
 77 files changed, 1231 insertions(+), 1352 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java
index 2253781c7ec..10ea0c5e55f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java
@@ -17,36 +17,6 @@
 
 package org.apache.doris.alter;
 
-import org.apache.doris.analysis.AddColumnClause;
-import org.apache.doris.analysis.AddColumnsClause;
-import org.apache.doris.analysis.AddPartitionClause;
-import org.apache.doris.analysis.AddPartitionFieldClause;
-import org.apache.doris.analysis.AddPartitionLikeClause;
-import org.apache.doris.analysis.AlterClause;
-import org.apache.doris.analysis.AlterMultiPartitionClause;
-import org.apache.doris.analysis.ColumnRenameClause;
-import org.apache.doris.analysis.CreateOrReplaceBranchClause;
-import org.apache.doris.analysis.CreateOrReplaceTagClause;
-import org.apache.doris.analysis.DropBranchClause;
-import org.apache.doris.analysis.DropColumnClause;
-import org.apache.doris.analysis.DropPartitionClause;
-import org.apache.doris.analysis.DropPartitionFieldClause;
-import org.apache.doris.analysis.DropPartitionFromIndexClause;
-import org.apache.doris.analysis.DropTagClause;
-import org.apache.doris.analysis.ModifyColumnClause;
-import org.apache.doris.analysis.ModifyColumnCommentClause;
-import org.apache.doris.analysis.ModifyDistributionClause;
-import org.apache.doris.analysis.ModifyEngineClause;
-import org.apache.doris.analysis.ModifyPartitionClause;
-import org.apache.doris.analysis.ModifyTableCommentClause;
-import org.apache.doris.analysis.ModifyTablePropertiesClause;
-import org.apache.doris.analysis.PartitionRenameClause;
-import org.apache.doris.analysis.ReorderColumnsClause;
-import org.apache.doris.analysis.ReplacePartitionClause;
-import org.apache.doris.analysis.ReplacePartitionFieldClause;
-import org.apache.doris.analysis.ReplaceTableClause;
-import org.apache.doris.analysis.RollupRenameClause;
-import org.apache.doris.analysis.TableRenameClause;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.DataProperty;
 import org.apache.doris.catalog.Database;
@@ -87,6 +57,36 @@ import org.apache.doris.nereids.trees.plans.commands.AlterTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.AlterViewCommand;
 import org.apache.doris.nereids.trees.plans.commands.CreateMaterializedViewCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropMaterializedViewCommand;
+import org.apache.doris.nereids.trees.plans.commands.info.AddColumnOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AddColumnsOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionFieldOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionLikeOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterMultiPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
+import org.apache.doris.nereids.trees.plans.commands.info.CreateOrReplaceBranchOp;
+import org.apache.doris.nereids.trees.plans.commands.info.CreateOrReplaceTagOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropBranchOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropColumnOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionFieldOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionFromIndexOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropTagOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyColumnCommentOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyColumnOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyDistributionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyEngineOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyTableCommentOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyTablePropertiesOp;
+import org.apache.doris.nereids.trees.plans.commands.info.RenameColumnOp;
+import org.apache.doris.nereids.trees.plans.commands.info.RenamePartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.RenameRollupOp;
+import org.apache.doris.nereids.trees.plans.commands.info.RenameTableOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ReorderColumnsOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ReplacePartitionFieldOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ReplacePartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ReplaceTableOp;
 import org.apache.doris.persist.AlterMTMV;
 import org.apache.doris.persist.AlterViewInfo;
 import org.apache.doris.persist.BatchModifyPartitionsInfo;
@@ -163,7 +163,7 @@ public class Alter {
     }
 
     private boolean processAlterOlapTable(AlterTableCommand command, OlapTable olapTable,
-            List<AlterClause> alterClauses,
+            List<AlterOp> alterOps,
             Database db) throws UserException {
         if (olapTable.getDataSortInfo() != null
                 && olapTable.getDataSortInfo().getSortType() == TSortType.ZORDER) {
@@ -171,12 +171,12 @@ public class Alter {
         }
 
         // check conflict alter ops first
-        alterClauses.addAll(command.getOps());
-        return processAlterOlapTableInternal(alterClauses, olapTable, db, command.toSql());
+        alterOps.addAll(command.getOps());
+        return processAlterOlapTableInternal(alterOps, olapTable, db, command.toSql());
     }
 
-    private boolean processAlterOlapTableInternal(List<AlterClause> alterClauses, OlapTable olapTable,
-                                          Database db, String sql) throws UserException {
+    private boolean processAlterOlapTableInternal(List<AlterOp> alterOps, OlapTable olapTable,
+                                                  Database db, String sql) throws UserException {
         if (olapTable.getDataSortInfo() != null
                 && olapTable.getDataSortInfo().getSortType() == TSortType.ZORDER) {
             throw new UserException("z-order table can not support schema change!");
@@ -184,25 +184,22 @@ public class Alter {
 
         // check conflict alter ops first
         AlterOperations currentAlterOps = new AlterOperations();
-        currentAlterOps.checkConflict(alterClauses);
-
-        // Check for unsupported operations on internal tables
-        for (AlterClause clause : alterClauses) {
-            if (clause instanceof AddPartitionFieldClause) {
+        currentAlterOps.checkConflict(alterOps);
+        for (AlterOp alterOp : alterOps) {
+            // Check for unsupported operations on internal tables
+            if (alterOp instanceof AddPartitionFieldOp) {
                 throw new UserException("ADD PARTITION KEY is only supported for Iceberg tables");
             }
-            if (clause instanceof DropPartitionFieldClause) {
+            if (alterOp instanceof DropPartitionFieldOp) {
                 throw new UserException("DROP PARTITION KEY is only supported for Iceberg tables");
             }
-            if (clause instanceof ReplacePartitionFieldClause) {
+            if (alterOp instanceof ReplacePartitionFieldOp) {
                 throw new UserException("REPLACE PARTITION KEY is only supported for Iceberg tables");
             }
-        }
 
-        for (AlterClause clause : alterClauses) {
             Map<String, String> properties = null;
             try {
-                properties = clause.getProperties();
+                properties = alterOp.getProperties();
             } catch (Exception e) {
                 continue;
             }
@@ -213,7 +210,7 @@ public class Alter {
         }
 
         if (olapTable instanceof MTMV) {
-            currentAlterOps.checkMTMVAllow(alterClauses);
+            currentAlterOps.checkMTMVAllow(alterOps);
         }
 
         // check cluster capacity and db quota, only need to check once.
@@ -225,9 +222,9 @@ public class Alter {
         boolean needProcessOutsideTableLock = false;
         BaseTableInfo oldBaseTableInfo = new BaseTableInfo(olapTable);
         Optional<BaseTableInfo> newBaseTableInfo = Optional.empty();
-        if (currentAlterOps.checkTableStoragePolicy(alterClauses)) {
+        if (currentAlterOps.checkTableStoragePolicy(alterOps)) {
             String tableStoragePolicy = olapTable.getStoragePolicy();
-            String currentStoragePolicy = currentAlterOps.getTableStoragePolicy(alterClauses);
+            String currentStoragePolicy = currentAlterOps.getTableStoragePolicy(alterOps);
 
             // If the two policy has one same resource, then it's safe for the table to change policy
             // There would only be the cooldown ttl or cooldown time would be affected
@@ -237,8 +234,8 @@ public class Alter {
                 for (Partition partition : olapTable.getAllPartitions()) {
                     if (Partition.PARTITION_INIT_VERSION < partition.getVisibleVersion()) {
                         throw new DdlException("Do not support alter table's storage policy , this table ["
-                                + olapTable.getName() + "] has storage policy " + tableStoragePolicy
-                                + ", the table need to be empty.");
+                            + olapTable.getName() + "] has storage policy " + tableStoragePolicy
+                            + ", the table need to be empty.");
                     }
                 }
             }
@@ -259,47 +256,47 @@ public class Alter {
             }
             olapTable.setStoragePolicy(currentStoragePolicy);
             needProcessOutsideTableLock = true;
-        } else if (currentAlterOps.checkIsBeingSynced(alterClauses)) {
-            olapTable.setIsBeingSynced(currentAlterOps.isBeingSynced(alterClauses));
+        } else if (currentAlterOps.checkIsBeingSynced(alterOps)) {
+            olapTable.setIsBeingSynced(currentAlterOps.isBeingSynced(alterOps));
             needProcessOutsideTableLock = true;
-        } else if (currentAlterOps.checkMinLoadReplicaNum(alterClauses)) {
-            Preconditions.checkState(alterClauses.size() == 1);
-            AlterClause alterClause = alterClauses.get(0);
-            processModifyMinLoadReplicaNum(db, olapTable, alterClause);
-        } else if (currentAlterOps.checkBinlogConfigChange(alterClauses)) {
+        } else if (currentAlterOps.checkMinLoadReplicaNum(alterOps)) {
+            Preconditions.checkState(alterOps.size() == 1);
+            AlterOp alterOp = alterOps.get(0);
+            processModifyMinLoadReplicaNum(db, olapTable, alterOp);
+        } else if (currentAlterOps.checkBinlogConfigChange(alterOps)) {
             if (!Config.enable_feature_binlog) {
                 throw new DdlException("Binlog feature is not enabled");
             }
             // TODO(Drogon): check error
-            ((SchemaChangeHandler) schemaChangeHandler).updateBinlogConfig(db, olapTable, alterClauses);
+            ((SchemaChangeHandler) schemaChangeHandler).updateBinlogConfig(db, olapTable, alterOps);
         } else if (currentAlterOps.hasSchemaChangeOp()) {
             // schema change, or change properties that need schema change(dynamic partition, storage_medium...)
-            schemaChangeHandler.process(sql, alterClauses, db, olapTable);
+            schemaChangeHandler.process(sql, alterOps, db, olapTable);
         } else if (currentAlterOps.hasRollupOp()) {
-            materializedViewHandler.process(alterClauses, db, olapTable);
+            materializedViewHandler.process(alterOps, db, olapTable);
         } else if (currentAlterOps.hasPartitionOp()) {
-            Preconditions.checkState(!alterClauses.isEmpty());
-            for (AlterClause alterClause : alterClauses) {
+            Preconditions.checkState(!alterOps.isEmpty());
+            for (AlterOp alterOp : alterOps) {
                 olapTable.writeLockOrDdlException();
                 try {
-                    if (alterClause instanceof DropPartitionClause) {
-                        if (!((DropPartitionClause) alterClause).isTempPartition()) {
+                    if (alterOp instanceof DropPartitionOp) {
+                        if (!((DropPartitionOp) alterOp).isTempPartition()) {
                             DynamicPartitionUtil.checkAlterAllowed(olapTable);
                         }
-                        Env.getCurrentEnv().dropPartition(db, olapTable, ((DropPartitionClause) alterClause));
-                    } else if (alterClause instanceof ReplacePartitionClause) {
-                        Env.getCurrentEnv().replaceTempPartition(db, olapTable, (ReplacePartitionClause) alterClause);
-                    } else if (alterClause instanceof ModifyPartitionClause) {
-                        ModifyPartitionClause clause = ((ModifyPartitionClause) alterClause);
+                        Env.getCurrentEnv().dropPartition(db, olapTable, ((DropPartitionOp) alterOp));
+                    } else if (alterOp instanceof ReplacePartitionOp) {
+                        Env.getCurrentEnv().replaceTempPartition(db, olapTable, (ReplacePartitionOp) alterOp);
+                    } else if (alterOp instanceof ModifyPartitionOp) {
+                        ModifyPartitionOp op = ((ModifyPartitionOp) alterOp);
                         // expand the partition names if it is 'Modify Partition(*)'
-                        if (clause.isNeedExpand()) {
-                            List<String> partitionNames = clause.getPartitionNames();
+                        if (op.isNeedExpand()) {
+                            List<String> partitionNames = op.getPartitionNames();
                             partitionNames.clear();
                             for (Partition partition : olapTable.getPartitions()) {
                                 partitionNames.add(partition.getName());
                             }
                         }
-                        Map<String, String> properties = clause.getProperties();
+                        Map<String, String> properties = op.getProperties();
                         if (properties.containsKey(PropertyAnalyzer.PROPERTIES_INMEMORY)) {
                             boolean isInMemory =
                                     Boolean.parseBoolean(properties.get(PropertyAnalyzer.PROPERTIES_INMEMORY));
@@ -308,56 +305,56 @@ public class Alter {
                             }
                             needProcessOutsideTableLock = true;
                         } else {
-                            List<String> partitionNames = clause.getPartitionNames();
+                            List<String> partitionNames = op.getPartitionNames();
                             if (!properties.containsKey(PropertyAnalyzer.PROPERTIES_STORAGE_POLICY)) {
                                 modifyPartitionsProperty(db, olapTable, partitionNames, properties,
-                                        clause.isTempPartition());
+                                        op.isTempPartition());
                             } else {
                                 needProcessOutsideTableLock = true;
                             }
                         }
-                    } else if (alterClause instanceof DropPartitionFromIndexClause) {
+                    } else if (alterOp instanceof DropPartitionFromIndexOp) {
                         // do nothing
-                    } else if (alterClause instanceof AddPartitionClause
-                            || alterClause instanceof AddPartitionLikeClause
-                            || alterClause instanceof AlterMultiPartitionClause) {
+                    } else if (alterOp instanceof AddPartitionOp
+                            || alterOp instanceof AddPartitionLikeOp
+                            || alterOp instanceof AlterMultiPartitionOp) {
                         needProcessOutsideTableLock = true;
                     } else {
-                        throw new DdlException("Invalid alter operation: " + alterClause.getOpType());
+                        throw new DdlException("Invalid alter operation: " + alterOp.getOpType());
                     }
                 } finally {
                     olapTable.writeUnlock();
                 }
             }
         } else if (currentAlterOps.hasRenameOp()) {
-            processRename(db, olapTable, alterClauses);
+            processRename(db, olapTable, alterOps);
             newBaseTableInfo = Optional.of(new BaseTableInfo(olapTable));
         } else if (currentAlterOps.hasReplaceTableOp()) {
-            processReplaceTable(db, olapTable, alterClauses);
+            processReplaceTable(db, olapTable, alterOps);
             // after replace table, olapTable may still be old name, so need set it to new name
-            ReplaceTableClause clause = (ReplaceTableClause) alterClauses.get(0);
-            String newTblName = clause.getTblName();
+            ReplaceTableOp op = (ReplaceTableOp) alterOps.get(0);
+            String newTblName = op.getTblName();
             newBaseTableInfo = Optional.of(new BaseTableInfo(olapTable));
             newBaseTableInfo.get().setTableName(newTblName);
         } else if (currentAlterOps.contains(AlterOpType.MODIFY_TABLE_PROPERTY_SYNC)) {
             needProcessOutsideTableLock = true;
         } else if (currentAlterOps.contains(AlterOpType.MODIFY_DISTRIBUTION)) {
-            Preconditions.checkState(alterClauses.size() == 1);
-            AlterClause alterClause = alterClauses.get(0);
+            Preconditions.checkState(alterOps.size() == 1);
+            AlterOp alterOp = alterOps.get(0);
             Env.getCurrentEnv()
-                    .modifyDefaultDistributionBucketNum(db, olapTable, (ModifyDistributionClause) alterClause);
+                    .modifyDefaultDistributionBucketNum(db, olapTable, (ModifyDistributionOp) alterOp);
         } else if (currentAlterOps.contains(AlterOpType.MODIFY_COLUMN_COMMENT)) {
-            processModifyColumnComment(db, olapTable, alterClauses);
+            processModifyColumnComment(db, olapTable, alterOps);
         } else if (currentAlterOps.contains(AlterOpType.MODIFY_TABLE_COMMENT)) {
-            Preconditions.checkState(alterClauses.size() == 1);
-            AlterClause alterClause = alterClauses.get(0);
-            processModifyTableComment(db, olapTable, alterClause);
+            Preconditions.checkState(alterOps.size() == 1);
+            AlterOp alterOp = alterOps.get(0);
+            processModifyTableComment(db, olapTable, alterOp);
         } else {
             throw new DdlException("Invalid alter operations: " + currentAlterOps);
         }
-        if (needChangeMTMVState(alterClauses)) {
+        if (needChangeMTMVState(alterOps)) {
             Env.getCurrentEnv().getMtmvService()
-                    .alterTable(oldBaseTableInfo, newBaseTableInfo, currentAlterOps.hasReplaceTableOp());
+                .alterTable(oldBaseTableInfo, newBaseTableInfo, currentAlterOps.hasReplaceTableOp());
         }
 
         olapTable.writeLock();
@@ -370,11 +367,11 @@ public class Alter {
         return needProcessOutsideTableLock;
     }
 
-    private void setExternalTableAutoAnalyzePolicy(ExternalTable table, List<AlterClause> alterClauses) {
-        Preconditions.checkState(alterClauses.size() == 1);
-        AlterClause alterClause = alterClauses.get(0);
-        Preconditions.checkState(alterClause instanceof ModifyTablePropertiesClause);
-        Map<String, String> properties = alterClause.getProperties();
+    private void setExternalTableAutoAnalyzePolicy(ExternalTable table, List<AlterOp> alterOps) {
+        Preconditions.checkState(alterOps.size() == 1);
+        AlterOp alterOp = alterOps.get(0);
+        Preconditions.checkState(alterOp instanceof ModifyTablePropertiesOp);
+        Map<String, String> properties = alterOp.getProperties();
         Preconditions.checkState(properties.size() == 1);
         Preconditions.checkState(properties.containsKey(PropertyAnalyzer.PROPERTIES_AUTO_ANALYZE_POLICY));
         String value = properties.get(PropertyAnalyzer.PROPERTIES_AUTO_ANALYZE_POLICY);
@@ -389,68 +386,63 @@ public class Alter {
     }
 
     private void processAlterTableForExternalTable(
-            ExternalTable table,
-            List<AlterClause> alterClauses) throws UserException {
-        for (AlterClause alterClause : alterClauses) {
-            if (alterClause instanceof ModifyTablePropertiesClause) {
-                setExternalTableAutoAnalyzePolicy(table, alterClauses);
-            } else if (alterClause instanceof CreateOrReplaceBranchClause) {
+            ExternalTable table, List<AlterOp> alterOps) throws UserException {
+        for (AlterOp alterOp : alterOps) {
+            if (alterOp instanceof ModifyTablePropertiesOp) {
+                setExternalTableAutoAnalyzePolicy(table, alterOps);
+            } else if (alterOp instanceof CreateOrReplaceBranchOp) {
                 table.getCatalog().createOrReplaceBranch(
-                        table,
-                        ((CreateOrReplaceBranchClause) alterClause).getBranchInfo());
-            } else if (alterClause instanceof CreateOrReplaceTagClause) {
+                        table, ((CreateOrReplaceBranchOp) alterOp).getBranchInfo());
+            } else if (alterOp instanceof CreateOrReplaceTagOp) {
                 table.getCatalog().createOrReplaceTag(
-                        table,
-                        ((CreateOrReplaceTagClause) alterClause).getTagInfo());
-            } else if (alterClause instanceof DropBranchClause) {
+                        table, ((CreateOrReplaceTagOp) alterOp).getTagInfo());
+            } else if (alterOp instanceof DropBranchOp) {
                 table.getCatalog().dropBranch(
-                        table,
-                        ((DropBranchClause) alterClause).getDropBranchInfo());
-            } else if (alterClause instanceof DropTagClause) {
+                        table, ((DropBranchOp) alterOp).getDropBranchInfo());
+            } else if (alterOp instanceof DropTagOp) {
                 table.getCatalog().dropTag(
-                        table,
-                        ((DropTagClause) alterClause).getDropTagInfo());
-            } else if (alterClause instanceof TableRenameClause) {
-                TableRenameClause tableRename = (TableRenameClause) alterClause;
+                        table, ((DropTagOp) alterOp).getDropTagInfo());
+            } else if (alterOp instanceof RenameTableOp) {
+                RenameTableOp renameTableOp = (RenameTableOp) alterOp;
                 table.getCatalog().renameTable(
-                        table.getDbName(), table.getName(), tableRename.getNewTableName());
-            } else if (alterClause instanceof AddColumnClause) {
-                AddColumnClause addColumn = (AddColumnClause) alterClause;
+                        table.getDbName(), table.getName(), renameTableOp.getNewTableName());
+            } else if (alterOp instanceof AddColumnOp) {
+                AddColumnOp addColumn = (AddColumnOp) alterOp;
                 table.getCatalog().addColumn(table, addColumn.getColumn(), addColumn.getColPos());
-            } else if (alterClause instanceof AddColumnsClause) {
-                AddColumnsClause addColumns = (AddColumnsClause) alterClause;
+            } else if (alterOp instanceof AddColumnsOp) {
+                AddColumnsOp addColumns = (AddColumnsOp) alterOp;
                 table.getCatalog().addColumns(table, addColumns.getColumns());
-            } else if (alterClause instanceof DropColumnClause) {
-                DropColumnClause dropColumn = (DropColumnClause) alterClause;
+            } else if (alterOp instanceof DropColumnOp) {
+                DropColumnOp dropColumn = (DropColumnOp) alterOp;
                 table.getCatalog().dropColumn(table, dropColumn.getColName());
-            } else if (alterClause instanceof ColumnRenameClause) {
-                ColumnRenameClause columnRename = (ColumnRenameClause) alterClause;
+            } else if (alterOp instanceof RenameColumnOp) {
+                RenameColumnOp columnRename = (RenameColumnOp) alterOp;
                 table.getCatalog().renameColumn(
                         table, columnRename.getColName(), columnRename.getNewColName());
-            } else if (alterClause instanceof ModifyColumnClause) {
-                ModifyColumnClause modifyColumn = (ModifyColumnClause) alterClause;
+            } else if (alterOp instanceof ModifyColumnOp) {
+                ModifyColumnOp modifyColumn = (ModifyColumnOp) alterOp;
                 table.getCatalog().modifyColumn(table, modifyColumn.getColumn(), modifyColumn.getColPos());
-            } else if (alterClause instanceof ReorderColumnsClause) {
-                ReorderColumnsClause reorderColumns = (ReorderColumnsClause) alterClause;
+            } else if (alterOp instanceof ReorderColumnsOp) {
+                ReorderColumnsOp reorderColumns = (ReorderColumnsOp) alterOp;
                 table.getCatalog().reorderColumns(table, reorderColumns.getColumnsByPos());
-            } else if (alterClause instanceof AddPartitionFieldClause) {
-                AddPartitionFieldClause addPartitionField = (AddPartitionFieldClause) alterClause;
+            } else if (alterOp instanceof AddPartitionFieldOp) {
+                AddPartitionFieldOp addPartitionField = (AddPartitionFieldOp) alterOp;
                 if (table instanceof IcebergExternalTable) {
                     ((IcebergExternalCatalog) table.getCatalog()).addPartitionField(
                             (IcebergExternalTable) table, addPartitionField);
                 } else {
                     throw new UserException("ADD PARTITION KEY is only supported for Iceberg tables");
                 }
-            } else if (alterClause instanceof DropPartitionFieldClause) {
-                DropPartitionFieldClause dropPartitionField = (DropPartitionFieldClause) alterClause;
+            } else if (alterOp instanceof DropPartitionFieldOp) {
+                DropPartitionFieldOp dropPartitionField = (DropPartitionFieldOp) alterOp;
                 if (table instanceof IcebergExternalTable) {
                     ((IcebergExternalCatalog) table.getCatalog()).dropPartitionField(
                             (IcebergExternalTable) table, dropPartitionField);
                 } else {
                     throw new UserException("DROP PARTITION KEY is only supported for Iceberg tables");
                 }
-            } else if (alterClause instanceof ReplacePartitionFieldClause) {
-                ReplacePartitionFieldClause replacePartitionField = (ReplacePartitionFieldClause) alterClause;
+            } else if (alterOp instanceof ReplacePartitionFieldOp) {
+                ReplacePartitionFieldOp replacePartitionField = (ReplacePartitionFieldOp) alterOp;
                 if (table instanceof IcebergExternalTable) {
                     ((IcebergExternalCatalog) table.getCatalog()).replacePartitionField(
                             (IcebergExternalTable) table, replacePartitionField);
@@ -458,25 +450,25 @@ public class Alter {
                     throw new UserException("REPLACE PARTITION KEY is only supported for Iceberg tables");
                 }
             } else {
-                throw new UserException("Invalid alter operations for external table: " + alterClauses);
+                throw new UserException("Invalid alter operations for external table: " + alterOps);
             }
         }
     }
 
-    private boolean needChangeMTMVState(List<AlterClause> alterClauses) {
-        for (AlterClause alterClause : alterClauses) {
-            if (alterClause.needChangeMTMVState()) {
+    private boolean needChangeMTMVState(List<AlterOp> alterOps) {
+        for (AlterOp alterOp : alterOps) {
+            if (alterOp.needChangeMTMVState()) {
                 return true;
             }
         }
         return false;
     }
 
-    private void processModifyTableComment(Database db, OlapTable tbl, AlterClause alterClause)
+    private void processModifyTableComment(Database db, OlapTable tbl, AlterOp alterOp)
             throws DdlException {
         tbl.writeLockOrDdlException();
         try {
-            ModifyTableCommentClause clause = (ModifyTableCommentClause) alterClause;
+            ModifyTableCommentOp clause = (ModifyTableCommentOp) alterOp;
             tbl.setComment(clause.getComment());
             // log
             ModifyCommentOperationLog op = ModifyCommentOperationLog
@@ -487,23 +479,23 @@ public class Alter {
         }
     }
 
-    private void processModifyColumnComment(Database db, OlapTable tbl, List<AlterClause> alterClauses)
+    private void processModifyColumnComment(Database db, OlapTable tbl, List<AlterOp> alterOps)
             throws DdlException {
         tbl.writeLockOrDdlException();
         try {
             // check first
             Map<String, String> colToComment = Maps.newHashMap();
-            for (AlterClause alterClause : alterClauses) {
-                Preconditions.checkState(alterClause instanceof ModifyColumnCommentClause);
-                ModifyColumnCommentClause clause = (ModifyColumnCommentClause) alterClause;
-                String colName = clause.getColName();
+            for (AlterOp alterOp : alterOps) {
+                Preconditions.checkState(alterOp instanceof ModifyColumnCommentOp);
+                ModifyColumnCommentOp op = (ModifyColumnCommentOp) alterOp;
+                String colName = op.getColName();
                 if (tbl.getColumn(colName) == null) {
                     throw new DdlException("Unknown column: " + colName);
                 }
                 if (colToComment.containsKey(colName)) {
                     throw new DdlException("Duplicate column: " + colName);
                 }
-                colToComment.put(colName, clause.getComment());
+                colToComment.put(colName, op.getComment());
             }
 
             // modify comment
@@ -547,33 +539,32 @@ public class Alter {
 
     private void processAlterExternalTable(AlterTableCommand command, Table externalTable, Database db)
             throws UserException {
-        List<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.addAll(command.getOps());
-        processAlterExternalTableInternal(alterClauses, externalTable, db);
+        List<AlterOp> alterOps = new ArrayList<>(command.getOps());
+        processAlterExternalTableInternal(alterOps, externalTable, db);
     }
 
-    private void processAlterExternalTableInternal(List<AlterClause> alterClauses, Table externalTable, Database db)
+    private void processAlterExternalTableInternal(List<AlterOp> alterOps, Table externalTable, Database db)
             throws UserException {
         // check conflict alter ops first
         AlterOperations currentAlterOps = new AlterOperations();
-        currentAlterOps.checkConflict(alterClauses);
+        currentAlterOps.checkConflict(alterOps);
         if (currentAlterOps.hasRenameOp()) {
-            processRename(db, externalTable, alterClauses);
+            processRename(db, externalTable, alterOps);
         } else if (currentAlterOps.hasSchemaChangeOp()) {
-            schemaChangeHandler.processExternalTable(alterClauses, db, externalTable);
+            schemaChangeHandler.processExternalTable(alterOps, db, externalTable);
         } else if (currentAlterOps.contains(AlterOpType.MODIFY_ENGINE)) {
-            ModifyEngineClause modifyEngineClause = (ModifyEngineClause) alterClauses.get(0);
-            processModifyEngine(db, externalTable, modifyEngineClause);
+            ModifyEngineOp modifyEngineOp = (ModifyEngineOp) alterOps.get(0);
+            processModifyEngine(db, externalTable, modifyEngineOp);
         }
     }
 
-    public void processModifyEngine(Database db, Table externalTable, ModifyEngineClause clause) throws DdlException {
+    public void processModifyEngine(Database db, Table externalTable, ModifyEngineOp op) throws DdlException {
         externalTable.writeLockOrDdlException();
         try {
             if (externalTable.getType() != TableType.MYSQL) {
                 throw new DdlException("Only support modify table engine from MySQL to ODBC");
             }
-            processModifyEngineInternal(db, externalTable, clause.getProperties(), false);
+            processModifyEngineInternal(db, externalTable, op.getProperties(), false);
         } finally {
             externalTable.writeUnlock();
         }
@@ -645,14 +636,14 @@ public class Alter {
                 .getCatalogOrDdlException(ctlName)
                 .getDbOrDdlException(dbName);
         TableIf tableIf = dbIf.getTableOrDdlException(tableName);
-        List<AlterClause> alterClauses = Lists.newArrayList();
+        List<AlterOp> alterOps = Lists.newArrayList();
         // some operations will take long time to process, need to be done outside the table lock
         boolean needProcessOutsideTableLock = false;
         switch (tableIf.getType()) {
             case MATERIALIZED_VIEW:
             case OLAP:
                 OlapTable olapTable = (OlapTable) tableIf;
-                needProcessOutsideTableLock = processAlterOlapTable(command, olapTable, alterClauses, (Database) dbIf);
+                needProcessOutsideTableLock = processAlterOlapTable(command, olapTable, alterOps, (Database) dbIf);
                 break;
             case ODBC:
             case JDBC:
@@ -668,8 +659,8 @@ public class Alter {
             case MAX_COMPUTE_EXTERNAL_TABLE:
             case HUDI_EXTERNAL_TABLE:
             case TRINO_CONNECTOR_EXTERNAL_TABLE:
-                alterClauses.addAll(command.getOps());
-                processAlterTableForExternalTable((ExternalTable) tableIf, alterClauses);
+                alterOps.addAll(command.getOps());
+                processAlterTableForExternalTable((ExternalTable) tableIf, alterOps);
                 return;
             default:
                 throw new DdlException("Do not support alter "
@@ -679,22 +670,22 @@ public class Alter {
         Database db = (Database) dbIf;
         // the following ops should done outside table lock. because it contain synchronized create operation
         if (needProcessOutsideTableLock) {
-            Preconditions.checkState(alterClauses.size() == 1);
-            AlterClause alterClause = alterClauses.get(0);
-            if (alterClause instanceof AddPartitionClause) {
-                if (!((AddPartitionClause) alterClause).isTempPartition()) {
+            Preconditions.checkState(alterOps.size() == 1);
+            AlterOp alterOp = alterOps.get(0);
+            if (alterOp instanceof AddPartitionOp) {
+                if (!((AddPartitionOp) alterOp).isTempPartition()) {
                     DynamicPartitionUtil.checkAlterAllowed(
                             (OlapTable) db.getTableOrMetaException(tableName, TableType.OLAP));
                 }
-                Env.getCurrentEnv().addPartition(db, tableName, (AddPartitionClause) alterClause, false, 0, true);
-            } else if (alterClause instanceof AddPartitionLikeClause) {
-                if (!((AddPartitionLikeClause) alterClause).getIsTempPartition()) {
+                Env.getCurrentEnv().addPartition(db, tableName, (AddPartitionOp) alterOp, false, 0, true);
+            } else if (alterOp instanceof AddPartitionLikeOp) {
+                if (!((AddPartitionLikeOp) alterOp).getTempPartition()) {
                     DynamicPartitionUtil.checkAlterAllowed(
                             (OlapTable) db.getTableOrMetaException(tableName, TableType.OLAP));
                 }
-                Env.getCurrentEnv().addPartitionLike(db, tableName, (AddPartitionLikeClause) alterClause);
-            } else if (alterClause instanceof ModifyPartitionClause) {
-                ModifyPartitionClause clause = ((ModifyPartitionClause) alterClause);
+                Env.getCurrentEnv().addPartitionLike(db, tableName, (AddPartitionLikeOp) alterOp);
+            } else if (alterOp instanceof ModifyPartitionOp) {
+                ModifyPartitionOp clause = ((ModifyPartitionOp) alterOp);
                 Map<String, String> properties = clause.getProperties();
                 List<String> partitionNames = clause.getPartitionNames();
                 ((SchemaChangeHandler) schemaChangeHandler).updatePartitionsProperties(
@@ -706,25 +697,25 @@ public class Alter {
                 } finally {
                     olapTable.writeUnlock();
                 }
-            } else if (alterClause instanceof ModifyTablePropertiesClause) {
-                Map<String, String> properties = alterClause.getProperties();
+            } else if (alterOp instanceof ModifyTablePropertiesOp) {
+                Map<String, String> properties = alterOp.getProperties();
                 ((SchemaChangeHandler) schemaChangeHandler).updateTableProperties(db, tableName, properties);
-            } else if (alterClause instanceof AlterMultiPartitionClause) {
-                if (!((AlterMultiPartitionClause) alterClause).isTempPartition()) {
+            } else if (alterOp instanceof AlterMultiPartitionOp) {
+                if (!((AlterMultiPartitionOp) alterOp).isTempPartition()) {
                     DynamicPartitionUtil.checkAlterAllowed(
                              (OlapTable) db.getTableOrMetaException(tableName, TableType.OLAP));
                 }
-                Env.getCurrentEnv().addMultiPartitions(db, tableName, (AlterMultiPartitionClause) alterClause);
+                Env.getCurrentEnv().addMultiPartitions(db, tableName, (AlterMultiPartitionOp) alterOp);
             } else {
-                throw new DdlException("Invalid alter operation: " + alterClause.getOpType());
+                throw new DdlException("Invalid alter operation: " + alterOp.getOpType());
             }
         }
     }
 
     // entry of processing replace table
-    private void processReplaceTable(Database db, OlapTable origTable, List<AlterClause> alterClauses)
+    private void processReplaceTable(Database db, OlapTable origTable, List<AlterOp> alterOps)
             throws UserException {
-        ReplaceTableClause clause = (ReplaceTableClause) alterClauses.get(0);
+        ReplaceTableOp clause = (ReplaceTableOp) alterOps.get(0);
         String newTblName = clause.getTblName();
         Table newTable = db.getTableOrMetaException(newTblName);
         if (newTable.getType() == TableType.MATERIALIZED_VIEW) {
@@ -918,20 +909,20 @@ public class Alter {
         systemHandler.processForNereids(Collections.singletonList(command), null, null);
     }
 
-    private void processRename(Database db, OlapTable table, List<AlterClause> alterClauses) throws DdlException {
-        for (AlterClause alterClause : alterClauses) {
-            if (alterClause instanceof TableRenameClause) {
-                Env.getCurrentEnv().renameTable(db, table, (TableRenameClause) alterClause);
+    private void processRename(Database db, OlapTable table, List<AlterOp> alterOps) throws DdlException {
+        for (AlterOp alterOp : alterOps) {
+            if (alterOp instanceof RenameTableOp) {
+                Env.getCurrentEnv().renameTable(db, table, (RenameTableOp) alterOp);
                 break;
             } else {
-                if (alterClause instanceof RollupRenameClause) {
-                    Env.getCurrentEnv().renameRollup(db, table, (RollupRenameClause) alterClause);
+                if (alterOp instanceof RenameRollupOp) {
+                    Env.getCurrentEnv().renameRollup(db, table, (RenameRollupOp) alterOp);
                     break;
-                } else if (alterClause instanceof PartitionRenameClause) {
-                    Env.getCurrentEnv().renamePartition(db, table, (PartitionRenameClause) alterClause);
+                } else if (alterOp instanceof RenamePartitionOp) {
+                    Env.getCurrentEnv().renamePartition(db, table, (RenamePartitionOp) alterOp);
                     break;
-                } else if (alterClause instanceof ColumnRenameClause) {
-                    Env.getCurrentEnv().renameColumn(db, table, (ColumnRenameClause) alterClause);
+                } else if (alterOp instanceof RenameColumnOp) {
+                    Env.getCurrentEnv().renameColumn(db, table, (RenameColumnOp) alterOp);
                     break;
                 } else {
                     Preconditions.checkState(false);
@@ -940,10 +931,10 @@ public class Alter {
         }
     }
 
-    private void processRename(Database db, Table table, List<AlterClause> alterClauses) throws DdlException {
-        for (AlterClause alterClause : alterClauses) {
-            if (alterClause instanceof TableRenameClause) {
-                Env.getCurrentEnv().renameTable(db, table, (TableRenameClause) alterClause);
+    private void processRename(Database db, Table table, List<AlterOp> alterOps) throws DdlException {
+        for (AlterOp alterOp : alterOps) {
+            if (alterOp instanceof RenameTableOp) {
+                Env.getCurrentEnv().renameTable(db, table, (RenameTableOp) alterOp);
                 break;
             } else {
                 Preconditions.checkState(false);
@@ -1212,9 +1203,9 @@ public class Alter {
         }
     }
 
-    private void processModifyMinLoadReplicaNum(Database db, OlapTable olapTable, AlterClause alterClause)
+    private void processModifyMinLoadReplicaNum(Database db, OlapTable olapTable, AlterOp alterOp)
             throws DdlException {
-        Map<String, String> properties = alterClause.getProperties();
+        Map<String, String> properties = alterOp.getProperties();
         short minLoadReplicaNum = -1;
         try {
             minLoadReplicaNum = PropertyAnalyzer.analyzeMinLoadReplicaNum(properties);
@@ -1224,13 +1215,13 @@ public class Alter {
         ReplicaAllocation replicaAlloc = olapTable.getDefaultReplicaAllocation();
         if (minLoadReplicaNum > replicaAlloc.getTotalReplicaNum()) {
             throw new DdlException("Failed to check min load replica num [" + minLoadReplicaNum + "]  <= "
-                    + "default replica num [" + replicaAlloc.getTotalReplicaNum() + "]");
+                + "default replica num [" + replicaAlloc.getTotalReplicaNum() + "]");
         }
         if (olapTable.dynamicPartitionExists()) {
             replicaAlloc = olapTable.getTableProperty().getDynamicPartitionProperty().getReplicaAllocation();
             if (!replicaAlloc.isNotSet() && minLoadReplicaNum > replicaAlloc.getTotalReplicaNum()) {
                 throw new DdlException("Failed to check min load replica num [" + minLoadReplicaNum + "]  <= "
-                        + "dynamic partition replica num [" + replicaAlloc.getTotalReplicaNum() + "]");
+                    + "dynamic partition replica num [" + replicaAlloc.getTotalReplicaNum() + "]");
             }
         }
         properties.put(PropertyAnalyzer.PROPERTIES_MIN_LOAD_REPLICA_NUM, Short.toString(minLoadReplicaNum));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java
index a938640baa6..798bfdbdacb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java
@@ -17,7 +17,6 @@
 
 package org.apache.doris.alter;
 
-import org.apache.doris.analysis.AlterClause;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.MaterializedIndex;
@@ -35,6 +34,7 @@ import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.MasterDaemon;
 import org.apache.doris.common.util.TimeUtils;
 import org.apache.doris.nereids.trees.plans.commands.AlterCommand;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
 import org.apache.doris.persist.RemoveAlterJobV2OperationLog;
 import org.apache.doris.persist.ReplicaPersistInfo;
 import org.apache.doris.task.AlterReplicaTask;
@@ -174,7 +174,7 @@ public abstract class AlterHandler extends MasterDaemon {
     /*
      * entry function. handle alter ops
      */
-    public abstract void process(String rawSql, List<AlterClause> alterClauses, Database db,
+    public abstract void process(String rawSql, List<AlterOp> alterOps, Database db,
                                  OlapTable olapTable)
             throws UserException;
 
@@ -185,9 +185,9 @@ public abstract class AlterHandler extends MasterDaemon {
     /*
      * entry function. handle alter ops
      */
-    public void process(List<AlterClause> alterClauses, Database db, OlapTable olapTable)
+    public void process(List<AlterOp> alterOps, Database db, OlapTable olapTable)
             throws UserException {
-        process("", alterClauses, db, olapTable);
+        process("", alterOps, db, olapTable);
     }
 
     public void processForNereids(List<AlterCommand> alterSystemCommands, Database db, OlapTable olapTable)
@@ -198,7 +198,7 @@ public abstract class AlterHandler extends MasterDaemon {
     /*
      * entry function. handle alter ops for external table
      */
-    public void processExternalTable(List<AlterClause> alterClauses, Database db, Table externalTable)
+    public void processExternalTable(List<AlterOp> alterOps, Database db, Table externalTable)
             throws UserException {}
 
     /*
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/AlterOperations.java b/fe/fe-core/src/main/java/org/apache/doris/alter/AlterOperations.java
index ba5175b6fa9..371d04c464c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/AlterOperations.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/AlterOperations.java
@@ -17,10 +17,10 @@
 
 package org.apache.doris.alter;
 
-import org.apache.doris.analysis.AlterClause;
-import org.apache.doris.analysis.ModifyTablePropertiesClause;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.util.PropertyAnalyzer;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyTablePropertiesOp;
 
 import com.google.common.base.Joiner;
 
@@ -41,16 +41,16 @@ public class AlterOperations {
         return currentOps;
     }
 
-    // check the conflicts of the given list of alter clauses
-    public void checkConflict(List<AlterClause> alterClauses) throws DdlException {
-        for (AlterClause alterClause : alterClauses) {
-            checkOp(alterClause.getOpType());
+    // check the conflicts of the given list of alter ops
+    public void checkConflict(List<AlterOp> alterTableOps) throws DdlException {
+        for (AlterOp alterTableOp : alterTableOps) {
+            checkOp(alterTableOp.getOpType());
         }
     }
 
-    public void checkMTMVAllow(List<AlterClause> alterClauses) throws DdlException {
-        for (AlterClause alterClause : alterClauses) {
-            if (!(alterClause.allowOpMTMV())) {
+    public void checkMTMVAllow(List<AlterOp> alterOps) throws DdlException {
+        for (AlterOp alterOp : alterOps) {
+            if (!alterOp.allowOpMTMV()) {
                 throw new DdlException("Not allowed to perform current operation on async materialized view");
             }
         }
@@ -74,43 +74,43 @@ public class AlterOperations {
                 || currentOps.contains(AlterOpType.MODIFY_PARTITION);
     }
 
-    public boolean checkTableStoragePolicy(List<AlterClause> alterClauses) {
-        return alterClauses.stream().filter(clause ->
-            clause instanceof ModifyTablePropertiesClause
+    public boolean checkTableStoragePolicy(List<AlterOp> alterOps) {
+        return alterOps.stream().filter(tableOp ->
+            tableOp instanceof ModifyTablePropertiesOp
         ).anyMatch(clause -> clause.getProperties().containsKey(PropertyAnalyzer.PROPERTIES_STORAGE_POLICY));
     }
 
-    public String getTableStoragePolicy(List<AlterClause> alterClauses) {
-        return alterClauses.stream().filter(clause ->
-            clause instanceof ModifyTablePropertiesClause
-        ).map(c -> ((ModifyTablePropertiesClause) c).getStoragePolicy()).findFirst().orElse("");
+    public String getTableStoragePolicy(List<AlterOp> alterOps) {
+        return alterOps.stream().filter(tableOp ->
+            tableOp instanceof ModifyTablePropertiesOp
+        ).map(c -> ((ModifyTablePropertiesOp) c).getStoragePolicy()).findFirst().orElse("");
     }
 
-    public boolean checkIsBeingSynced(List<AlterClause> alterClauses) {
-        return alterClauses.stream().filter(clause ->
-            clause instanceof ModifyTablePropertiesClause
+    public boolean checkIsBeingSynced(List<AlterOp> alterOps) {
+        return alterOps.stream().filter(tableOp ->
+            tableOp instanceof ModifyTablePropertiesOp
         ).anyMatch(clause -> clause.getProperties().containsKey(PropertyAnalyzer.PROPERTIES_IS_BEING_SYNCED));
     }
 
-    public boolean checkMinLoadReplicaNum(List<AlterClause> alterClauses) {
-        return alterClauses.stream().filter(clause ->
-            clause instanceof ModifyTablePropertiesClause
+    public boolean checkMinLoadReplicaNum(List<AlterOp> alterOps) {
+        return alterOps.stream().filter(tableOp ->
+            tableOp instanceof ModifyTablePropertiesOp
         ).anyMatch(clause -> clause.getProperties().containsKey(PropertyAnalyzer.PROPERTIES_MIN_LOAD_REPLICA_NUM));
     }
 
-    public boolean checkBinlogConfigChange(List<AlterClause> alterClauses) {
-        return alterClauses.stream().filter(clause ->
-            clause instanceof ModifyTablePropertiesClause
+    public boolean checkBinlogConfigChange(List<AlterOp> alterOps) {
+        return alterOps.stream().filter(tableOp ->
+            tableOp instanceof ModifyTablePropertiesOp
         ).anyMatch(clause -> clause.getProperties().containsKey(PropertyAnalyzer.PROPERTIES_BINLOG_ENABLE)
             || clause.getProperties().containsKey(PropertyAnalyzer.PROPERTIES_BINLOG_TTL_SECONDS)
             || clause.getProperties().containsKey(PropertyAnalyzer.PROPERTIES_BINLOG_MAX_BYTES)
             || clause.getProperties().containsKey(PropertyAnalyzer.PROPERTIES_BINLOG_MAX_HISTORY_NUMS));
     }
 
-    public boolean isBeingSynced(List<AlterClause> alterClauses) {
-        return alterClauses.stream().filter(clause ->
-            clause instanceof ModifyTablePropertiesClause
-        ).map(c -> ((ModifyTablePropertiesClause) c).isBeingSynced()).findFirst().orElse(false);
+    public boolean isBeingSynced(List<AlterOp> alterOps) {
+        return alterOps.stream().filter(tableOp ->
+            tableOp instanceof ModifyTablePropertiesOp
+        ).map(c -> ((ModifyTablePropertiesOp) c).isBeingSynced()).findFirst().orElse(false);
     }
 
     // MODIFY_TABLE_PROPERTY is also processed by SchemaChangeHandler
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
index c9764681028..81a541c334c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
@@ -17,10 +17,7 @@
 
 package org.apache.doris.alter;
 
-import org.apache.doris.analysis.AddRollupClause;
-import org.apache.doris.analysis.AlterClause;
 import org.apache.doris.analysis.CastExpr;
-import org.apache.doris.analysis.DropRollupClause;
 import org.apache.doris.analysis.MVColumnItem;
 import org.apache.doris.analysis.SlotRef;
 import org.apache.doris.catalog.AggregateType;
@@ -59,6 +56,9 @@ import org.apache.doris.nereids.trees.plans.commands.AlterCommand;
 import org.apache.doris.nereids.trees.plans.commands.CancelAlterTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.CreateMaterializedViewCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropMaterializedViewCommand;
+import org.apache.doris.nereids.trees.plans.commands.info.AddRollupOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropRollupOp;
 import org.apache.doris.persist.BatchDropInfo;
 import org.apache.doris.persist.DropInfo;
 import org.apache.doris.persist.EditLog;
@@ -261,13 +261,13 @@ public class MaterializedViewHandler extends AlterHandler {
      *   Step1.1: base table validation: the status of base table and partition could be NORMAL.
      *   Step1.2: rollup validation: the name and columns of rollup is checked.
      * Step2: create rollup job
-     * @param alterClauses
+     * @param alterOps
      * @param db
      * @param olapTable
      * @throws DdlException
      * @throws AnalysisException
      */
-    public void processBatchAddRollup(String rawSql, List<AlterClause> alterClauses, Database db, OlapTable olapTable)
+    public void processBatchAddRollup(String rawSql, List<AlterOp> alterOps, Database db, OlapTable olapTable)
             throws DdlException, AnalysisException {
         checkReplicaCount(olapTable);
 
@@ -286,27 +286,27 @@ public class MaterializedViewHandler extends AlterHandler {
             }
 
             // 1 check and make rollup job
-            for (AlterClause alterClause : alterClauses) {
-                AddRollupClause addRollupClause = (AddRollupClause) alterClause;
+            for (AlterOp alterOp : alterOps) {
+                AddRollupOp addRollupOp = (AddRollupOp) alterOp;
 
                 // step 1 check whether current alter is change storage format
-                String rollupIndexName = addRollupClause.getRollupName();
+                String rollupIndexName = addRollupOp.getRollupName();
                 boolean changeStorageFormat = false;
                 if (rollupIndexName.equalsIgnoreCase(olapTable.getName())) {
                     // for upgrade test to create segment v2 rollup index by using the sql:
                     // alter table table_name add rollup table_name (columns) properties ("storage_format" = "v2");
-                    Map<String, String> properties = addRollupClause.getProperties();
+                    Map<String, String> properties = addRollupOp.getProperties();
                     if (properties == null || !properties.containsKey(PropertyAnalyzer.PROPERTIES_STORAGE_FORMAT)
                             || !properties.get(PropertyAnalyzer.PROPERTIES_STORAGE_FORMAT).equalsIgnoreCase("v2")) {
                         throw new DdlException("Table[" + olapTable.getName() + "] can not "
-                                + "add segment v2 rollup index without setting storage format to v2.");
+                            + "add segment v2 rollup index without setting storage format to v2.");
                     }
                     rollupIndexName = NEW_STORAGE_FORMAT_INDEX_NAME_PREFIX + olapTable.getName();
                     changeStorageFormat = true;
                 }
 
                 // get base index schema
-                String baseIndexName = addRollupClause.getBaseRollupName();
+                String baseIndexName = addRollupOp.getBaseRollupName();
                 if (baseIndexName == null) {
                     // use table name as base table name
                     baseIndexName = olapTable.getName();
@@ -318,15 +318,15 @@ public class MaterializedViewHandler extends AlterHandler {
 
                 // step 2.2  check rollup schema
                 List<Column> rollupSchema = checkAndPrepareMaterializedView(
-                        addRollupClause, olapTable, baseIndexId, changeStorageFormat);
+                        addRollupOp, olapTable, baseIndexId, changeStorageFormat);
 
                 // step 3 create rollup job
                 RollupJobV2 alterJobV2 =
                         createMaterializedViewJob(rawSql, rollupIndexName, baseIndexName, rollupSchema, null,
-                                addRollupClause.getProperties(), olapTable, db, baseIndexId, olapTable.getKeysType(),
-                                null);
+                        addRollupOp.getProperties(), olapTable, db, baseIndexId, olapTable.getKeysType(),
+                        null);
 
-                rollupNameJobMap.put(addRollupClause.getRollupName(), alterJobV2);
+                rollupNameJobMap.put(addRollupOp.getRollupName(), alterJobV2);
                 logJobIdSet.add(alterJobV2.getJobId());
             }
 
@@ -673,14 +673,14 @@ public class MaterializedViewHandler extends AlterHandler {
         return newMVColumns;
     }
 
-    public List<Column> checkAndPrepareMaterializedView(AddRollupClause addRollupClause, OlapTable olapTable,
-            long baseIndexId, boolean changeStorageFormat)
+    public List<Column> checkAndPrepareMaterializedView(AddRollupOp addRollupOp, OlapTable olapTable,
+                                                        long baseIndexId, boolean changeStorageFormat)
             throws DdlException {
         if (olapTable.getRowStoreCol() != null) {
             throw new DdlException("RowStore table can't create materialized view.");
         }
-        String rollupIndexName = addRollupClause.getRollupName();
-        List<String> rollupColumnNames = addRollupClause.getColumnNames();
+        String rollupIndexName = addRollupOp.getRollupName();
+        List<String> rollupColumnNames = addRollupOp.getColumnNames();
         if (changeStorageFormat) {
             String newStorageFormatIndexName = NEW_STORAGE_FORMAT_INDEX_NAME_PREFIX + olapTable.getName();
             rollupIndexName = newStorageFormatIndexName;
@@ -728,7 +728,7 @@ public class MaterializedViewHandler extends AlterHandler {
                 if (baseColumn.isKey()) {
                     if (baseColumn.getType().isFloatingPointType()) {
                         throw new DdlException(
-                                "Do not support float/double type on group by, you can change it to decimal");
+                            "Do not support float/double type on group by, you can change it to decimal");
                     }
                     keysNumOfRollup += 1;
                     hasKey = true;
@@ -777,12 +777,12 @@ public class MaterializedViewHandler extends AlterHandler {
                 }
                 if (allKeysMatch) {
                     throw new DdlException("Rollup contains all keys in base table with same order for "
-                            + "aggregation or unique table is useless.");
+                        + "aggregation or unique table is useless.");
                 }
             }
         } else if (KeysType.DUP_KEYS == keysType) {
             // supplement the duplicate key
-            if (addRollupClause.getDupKeys() == null || addRollupClause.getDupKeys().isEmpty()) {
+            if (addRollupOp.getDupKeys() == null || addRollupOp.getDupKeys().isEmpty()) {
                 // check the column meta
                 boolean allColumnsMatch = true;
                 for (int i = 0; i < rollupColumnNames.size(); i++) {
@@ -834,7 +834,7 @@ public class MaterializedViewHandler extends AlterHandler {
                 }
                 if (allColumnsMatch) {
                     throw new DdlException("Rollup contain the columns of the base table in prefix order for "
-                            + "duplicate table is useless.");
+                        + "duplicate table is useless.");
                 }
             } else {
                 /*
@@ -854,7 +854,7 @@ public class MaterializedViewHandler extends AlterHandler {
                  * 1. (k1) dup key (k1)
                  */
                 // user specify the duplicate keys for rollup index
-                List<String> dupKeys = addRollupClause.getDupKeys();
+                List<String> dupKeys = addRollupOp.getDupKeys();
                 if (dupKeys.size() > rollupColumnNames.size()) {
                     throw new DdlException("Num of duplicate keys should less than or equal to num of rollup columns.");
                 }
@@ -897,7 +897,7 @@ public class MaterializedViewHandler extends AlterHandler {
                 }
                 if (allColumnsMatch) {
                     throw new DdlException("Rollup contain the columns of the base table in prefix order for "
-                            + "duplicate table is useless.");
+                        + "duplicate table is useless.");
                 }
             }
         }
@@ -944,7 +944,7 @@ public class MaterializedViewHandler extends AlterHandler {
         return baseIndexId;
     }
 
-    public void processBatchDropRollup(List<AlterClause> dropRollupClauses, Database db, OlapTable olapTable)
+    public void processBatchDropRollup(List<AlterOp> alterOps, Database db, OlapTable olapTable)
             throws DdlException, MetaNotFoundException {
         List<Long> deleteIndexList = null;
         olapTable.writeLockOrDdlException();
@@ -955,16 +955,16 @@ public class MaterializedViewHandler extends AlterHandler {
             }
 
             // check drop rollup index operation
-            for (AlterClause alterClause : dropRollupClauses) {
-                DropRollupClause dropRollupClause = (DropRollupClause) alterClause;
-                checkDropMaterializedView(dropRollupClause.getRollupName(), olapTable);
+            for (AlterOp alterOp : alterOps) {
+                DropRollupOp dropRollupOp = (DropRollupOp) alterOp;
+                checkDropMaterializedView(dropRollupOp.getRollupName(), olapTable);
             }
 
             // drop data in memory
             Map<Long, String> rollupNameMap = new HashMap<>();
-            for (AlterClause alterClause : dropRollupClauses) {
-                DropRollupClause dropRollupClause = (DropRollupClause) alterClause;
-                String rollupIndexName = dropRollupClause.getRollupName();
+            for (AlterOp alterOp : alterOps) {
+                DropRollupOp dropRollupOp = (DropRollupOp) alterOp;
+                String rollupIndexName = dropRollupOp.getRollupName();
                 long rollupIndexId = dropMaterializedView(rollupIndexName, olapTable);
                 rollupNameMap.put(rollupIndexId, rollupIndexName);
             }
@@ -1290,18 +1290,18 @@ public class MaterializedViewHandler extends AlterHandler {
     }
 
     @Override
-    public void process(String rawSql, List<AlterClause> alterClauses, Database db,
+    public void process(String rawSql, List<AlterOp> alterOps, Database db,
                         OlapTable olapTable)
             throws DdlException, AnalysisException, MetaNotFoundException {
         if (olapTable.isDuplicateWithoutKey()) {
             throw new DdlException("Duplicate table without keys do not support alter rollup!");
         }
-        Optional<AlterClause> alterClauseOptional = alterClauses.stream().findAny();
-        if (alterClauseOptional.isPresent()) {
-            if (alterClauseOptional.get() instanceof AddRollupClause) {
-                processBatchAddRollup(rawSql, alterClauses, db, olapTable);
-            } else if (alterClauseOptional.get() instanceof DropRollupClause) {
-                processBatchDropRollup(alterClauses, db, olapTable);
+        Optional<AlterOp> alterOpOptional = alterOps.stream().findAny();
+        if (alterOpOptional.isPresent()) {
+            if (alterOpOptional.get() instanceof AddRollupOp) {
+                processBatchAddRollup(rawSql, alterOps, db, olapTable);
+            } else if (alterOpOptional.get() instanceof DropRollupOp) {
+                processBatchDropRollup(alterOps, db, olapTable);
             } else {
                 Preconditions.checkState(false);
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
index dc26aea6bf7..0b0a01ece9d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
@@ -17,20 +17,10 @@
 
 package org.apache.doris.alter;
 
-import org.apache.doris.analysis.AddColumnClause;
-import org.apache.doris.analysis.AddColumnsClause;
-import org.apache.doris.analysis.AlterClause;
 import org.apache.doris.analysis.AnnIndexPropertiesChecker;
-import org.apache.doris.analysis.BuildIndexClause;
 import org.apache.doris.analysis.ColumnPosition;
-import org.apache.doris.analysis.CreateIndexClause;
-import org.apache.doris.analysis.DropColumnClause;
-import org.apache.doris.analysis.DropIndexClause;
 import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.InvertedIndexUtil;
-import org.apache.doris.analysis.ModifyColumnClause;
-import org.apache.doris.analysis.ModifyTablePropertiesClause;
-import org.apache.doris.analysis.ReorderColumnsClause;
 import org.apache.doris.analysis.SlotRef;
 import org.apache.doris.catalog.AggregateType;
 import org.apache.doris.catalog.BinlogConfig;
@@ -87,9 +77,19 @@ import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.nereids.trees.plans.commands.AlterCommand;
 import org.apache.doris.nereids.trees.plans.commands.CancelAlterTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.CancelBuildIndexCommand;
+import org.apache.doris.nereids.trees.plans.commands.info.AddColumnOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AddColumnsOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
+import org.apache.doris.nereids.trees.plans.commands.info.BuildIndexOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ColumnDefinition;
+import org.apache.doris.nereids.trees.plans.commands.info.CreateIndexOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropColumnOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropIndexOp;
 import org.apache.doris.nereids.trees.plans.commands.info.IndexDefinition;
 import org.apache.doris.nereids.trees.plans.commands.info.IndexDefinition.IndexType;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyColumnOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyTablePropertiesOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ReorderColumnsOp;
 import org.apache.doris.persist.AlterLightSchemaChangeInfo;
 import org.apache.doris.persist.RemoveAlterJobV2OperationLog;
 import org.apache.doris.persist.TableAddOrDropColumnsInfo;
@@ -168,20 +168,20 @@ public class SchemaChangeHandler extends AlterHandler {
     }
 
     /**
-     * @param alterClause
+     * @param addColumnOp
      * @param olapTable
      * @param indexSchemaMap
      * @param colUniqueIdSupplierMap for multi add columns clause, we need stash middle state of maxColUniqueId
      * @return true: can light schema change, false: cannot light schema change
      * @throws DdlException
      */
-    private boolean processAddColumn(AddColumnClause alterClause, OlapTable olapTable,
+    private boolean processAddColumn(AddColumnOp addColumnOp, OlapTable olapTable,
                                      Map<Long, LinkedList<Column>> indexSchemaMap,
                                      Map<Long, IntSupplier> colUniqueIdSupplierMap)
             throws DdlException {
-        Column column = alterClause.getColumn();
-        ColumnPosition columnPos = alterClause.getColPos();
-        String targetIndexName = alterClause.getRollupName();
+        Column column = addColumnOp.getColumn();
+        ColumnPosition columnPos = addColumnOp.getColPos();
+        String targetIndexName = addColumnOp.getRollupName();
         checkIndexExists(olapTable, targetIndexName);
 
         String baseIndexName = olapTable.getName();
@@ -196,23 +196,23 @@ public class SchemaChangeHandler extends AlterHandler {
         Set<String> newColNameSet = Sets.newHashSet(column.getName());
 
         return addColumnInternal(olapTable, column, columnPos, targetIndexId, baseIndexId, indexSchemaMap,
-                newColNameSet, false, colUniqueIdSupplierMap);
+            newColNameSet, false, colUniqueIdSupplierMap);
     }
 
-    private void processAddColumn(AddColumnClause alterClause, Table externalTable, List<Column> newSchema)
+    private void processAddColumn(AddColumnOp addColumnOp, Table externalTable, List<Column> newSchema)
             throws DdlException {
-        Column column = alterClause.getColumn();
-        ColumnPosition columnPos = alterClause.getColPos();
+        Column column = addColumnOp.getColumn();
+        ColumnPosition columnPos = addColumnOp.getColPos();
         Set<String> newColNameSet = Sets.newHashSet(column.getName());
 
         addColumnInternal(column, columnPos, newSchema, newColNameSet);
     }
 
-    private void processAddColumns(AddColumnsClause alterClause, Table externalTable, List<Column> newSchema)
+    private void processAddColumns(AddColumnsOp addColumnsOp, Table externalTable, List<Column> newSchema)
             throws DdlException {
-        List<Column> columns = alterClause.getColumns();
+        List<Column> columns = addColumnsOp.getColumns();
         Set<String> newColNameSet = Sets.newHashSet();
-        for (Column column : alterClause.getColumns()) {
+        for (Column column : addColumnsOp.getColumns()) {
             newColNameSet.add(column.getName());
         }
 
@@ -222,7 +222,7 @@ public class SchemaChangeHandler extends AlterHandler {
     }
 
     /**
-     * @param alterClause
+     * @param addColumnsOp
      * @param olapTable
      * @param indexSchemaMap
      * @param ignoreSameColumn
@@ -230,11 +230,11 @@ public class SchemaChangeHandler extends AlterHandler {
      * @return true: can light schema change, false: cannot light schema change
      * @throws DdlException
      */
-    public boolean processAddColumns(AddColumnsClause alterClause, OlapTable olapTable,
+    public boolean processAddColumns(AddColumnsOp addColumnsOp, OlapTable olapTable,
                                      Map<Long, LinkedList<Column>> indexSchemaMap, boolean ignoreSameColumn,
                                      Map<Long, IntSupplier> colUniqueIdSupplierMap) throws DdlException {
-        List<Column> columns = alterClause.getColumns();
-        String targetIndexName = alterClause.getRollupName();
+        List<Column> columns = addColumnsOp.getColumns();
+        String targetIndexName = addColumnsOp.getRollupName();
         checkIndexExists(olapTable, targetIndexName);
 
         Set<String> newColNameSet = Sets.newHashSet();
@@ -262,9 +262,9 @@ public class SchemaChangeHandler extends AlterHandler {
         return lightSchemaChange;
     }
 
-    private void processDropColumn(DropColumnClause alterClause, Table externalTable, List<Column> newSchema)
+    private void processDropColumn(DropColumnOp dropColumnOp, Table externalTable, List<Column> newSchema)
             throws DdlException {
-        String dropColName = alterClause.getColName();
+        String dropColName = dropColumnOp.getColName();
 
         // find column in base index and remove it
         boolean found = false;
@@ -277,8 +277,8 @@ public class SchemaChangeHandler extends AlterHandler {
                     found = true;
                 } else {
                     throw new DdlException(
-                            "Do not allow remove last column of table: " + externalTable.getName() + " column: "
-                                    + dropColName);
+                        "Do not allow remove last column of table: " + externalTable.getName() + " column: "
+                            + dropColName);
                 }
                 break;
             }
@@ -290,19 +290,19 @@ public class SchemaChangeHandler extends AlterHandler {
     }
 
     /**
-     * @param alterClause
+     * @param dropColumnOp
      * @param olapTable
      * @param indexSchemaMap
      * @param indexes
      * @return true: can light schema change, false: cannot
      * @throws DdlException
      */
-    private boolean processDropColumn(DropColumnClause alterClause, OlapTable olapTable,
+    private boolean processDropColumn(DropColumnOp dropColumnOp, OlapTable olapTable,
                                       Map<Long, LinkedList<Column>> indexSchemaMap, List<Index> indexes)
             throws DdlException {
 
-        String dropColName = alterClause.getColName();
-        String targetIndexName = alterClause.getRollupName();
+        String dropColName = dropColumnOp.getColName();
+        String targetIndexName = dropColumnOp.getRollupName();
         checkIndexExists(olapTable, targetIndexName);
 
         String baseIndexName = olapTable.getName();
@@ -334,7 +334,7 @@ public class SchemaChangeHandler extends AlterHandler {
             }
             if (olapTable.hasSequenceCol() && dropColName.equalsIgnoreCase(olapTable.getSequenceMapCol())) {
                 throw new DdlException("Can not drop sequence mapping column[" + dropColName
-                        + "] in Unique data model table[" + olapTable.getName() + "]");
+                    + "] in Unique data model table[" + olapTable.getName() + "]");
             }
         } else if (KeysType.AGG_KEYS == olapTable.getKeysType()) {
             if (null == targetIndexName) {
@@ -353,7 +353,7 @@ public class SchemaChangeHandler extends AlterHandler {
                 }
                 if (isKey && hasReplaceColumn) {
                     throw new DdlException(
-                            "Can not drop key column when table has value column with REPLACE aggregation method");
+                        "Can not drop key column when table has value column with REPLACE aggregation method");
                 }
             } else {
                 // drop column in rollup and base index
@@ -372,7 +372,7 @@ public class SchemaChangeHandler extends AlterHandler {
                 }
                 if (isKey && hasReplaceColumn) {
                     throw new DdlException(
-                            "Can not drop key column when rollup has value column with REPLACE aggregation method");
+                        "Can not drop key column when rollup has value column with REPLACE aggregation method");
                 }
             }
         } else if (KeysType.DUP_KEYS == olapTable.getKeysType()) {
@@ -469,7 +469,7 @@ public class SchemaChangeHandler extends AlterHandler {
                     }
                     if (containedByMV) {
                         throw new DdlException("Can not drop column contained by mv, mv="
-                                + olapTable.getIndexNameById(indexIds.get(i)));
+                            + olapTable.getIndexNameById(indexIds.get(i)));
                     }
                 }
             }
@@ -498,10 +498,10 @@ public class SchemaChangeHandler extends AlterHandler {
     }
 
     // User can modify column type and column position
-    private void processModifyColumn(ModifyColumnClause alterClause, Table externalTable, List<Column> newSchema)
+    private void processModifyColumn(ModifyColumnOp modifyColumnOp, Table externalTable, List<Column> newSchema)
             throws DdlException {
-        Column modColumn = alterClause.getColumn();
-        ColumnPosition columnPos = alterClause.getColPos();
+        Column modColumn = modifyColumnOp.getColumn();
+        ColumnPosition columnPos = modifyColumnOp.getColPos();
 
         // find modified column
         String newColName = modColumn.getName();
@@ -565,9 +565,9 @@ public class SchemaChangeHandler extends AlterHandler {
     }
 
     // User can modify column type and column position
-    private boolean processModifyColumn(ModifyColumnClause alterClause, OlapTable olapTable,
+    private boolean processModifyColumn(ModifyColumnOp modifyColumnOp, OlapTable olapTable,
                                         Map<Long, LinkedList<Column>> indexSchemaMap) throws DdlException {
-        Column modColumn = alterClause.getColumn();
+        Column modColumn = modifyColumnOp.getColumn();
         boolean lightSchemaChange = false;
 
         if (KeysType.AGG_KEYS == olapTable.getKeysType()) {
@@ -579,7 +579,7 @@ public class SchemaChangeHandler extends AlterHandler {
         } else if (KeysType.UNIQUE_KEYS == olapTable.getKeysType()) {
             if (null != modColumn.getAggregationType() && modColumn.isKey()) {
                 throw new DdlException("Can not assign aggregation method" + " on column in Unique data model table: "
-                        + modColumn.getName());
+                    + modColumn.getName());
             }
             if (!modColumn.isKey()) {
                 if (olapTable.getEnableUniqueKeyMergeOnWrite()) {
@@ -591,15 +591,15 @@ public class SchemaChangeHandler extends AlterHandler {
         } else {
             if (null != modColumn.getAggregationType() && modColumn.isKey()) {
                 throw new DdlException(
-                        "Can not assign aggregation method" + " on column in Duplicate data model table: "
-                                + modColumn.getName());
+                    "Can not assign aggregation method" + " on column in Duplicate data model table: "
+                        + modColumn.getName());
             }
             if (!modColumn.isKey()) {
                 modColumn.setAggregationType(AggregateType.NONE, true);
             }
         }
-        ColumnPosition columnPos = alterClause.getColPos();
-        String targetIndexName = alterClause.getRollupName();
+        ColumnPosition columnPos = modifyColumnOp.getColPos();
+        String targetIndexName = modifyColumnOp.getRollupName();
         checkIndexExists(olapTable, targetIndexName);
 
         String baseIndexName = olapTable.getName();
@@ -687,7 +687,7 @@ public class SchemaChangeHandler extends AlterHandler {
 
         if (!modColumn.equals(oriColumn) && oriColumn.isAutoInc() != modColumn.isAutoInc()) {
             throw new DdlException("Can't modify the column["
-                    + oriColumn.getName() + "]'s auto-increment attribute.");
+                + oriColumn.getName() + "]'s auto-increment attribute.");
         }
 
         // handle the move operation in 'indexForFindingColumn' if has
@@ -723,7 +723,7 @@ public class SchemaChangeHandler extends AlterHandler {
                     String columnName = column.getName();
                     if (column.isMaterializedViewColumn()) {
                         throw new DdlException("Can not modify column contained by mv, mv="
-                                + olapTable.getIndexNameById(entry.getKey()));
+                            + olapTable.getIndexNameById(entry.getKey()));
                     }
                     if (columnName.equalsIgnoreCase(modColumn.getName())) {
                         otherIndexIds.add(entry.getKey());
@@ -740,7 +740,7 @@ public class SchemaChangeHandler extends AlterHandler {
                     String columnName = col.getName();
                     if (col.isMaterializedViewColumn()) {
                         throw new DdlException("Can not modify column contained by mv, mv="
-                                + olapTable.getIndexNameById(otherIndexId));
+                            + olapTable.getIndexNameById(otherIndexId));
                     }
                     if (!columnName.equalsIgnoreCase(modColumn.getName())) {
                         continue;
@@ -786,9 +786,9 @@ public class SchemaChangeHandler extends AlterHandler {
         return lightSchemaChange;
     }
 
-    private void processReorderColumn(ReorderColumnsClause alterClause, Table externalTable, List<Column> newSchema)
+    private void processReorderColumn(ReorderColumnsOp reorderColumnsOp, Table externalTable, List<Column> newSchema)
             throws DdlException {
-        List<String> orderedColNames = alterClause.getColumnsByPos();
+        List<String> orderedColNames = reorderColumnsOp.getColumnsByPos();
 
         newSchema.clear();
         List<Column> targetIndexSchema = externalTable.getBaseSchema();
@@ -819,10 +819,10 @@ public class SchemaChangeHandler extends AlterHandler {
         }
     }
 
-    private void processReorderColumn(ReorderColumnsClause alterClause, OlapTable olapTable,
+    private void processReorderColumn(ReorderColumnsOp reorderColumnsOp, OlapTable olapTable,
                                       Map<Long, LinkedList<Column>> indexSchemaMap) throws DdlException {
-        List<String> orderedColNames = alterClause.getColumnsByPos();
-        String targetIndexName = alterClause.getRollupName();
+        List<String> orderedColNames = reorderColumnsOp.getColumnsByPos();
+        String targetIndexName = reorderColumnsOp.getRollupName();
         checkIndexExists(olapTable, targetIndexName);
 
         String baseIndexName = olapTable.getName();
@@ -837,7 +837,7 @@ public class SchemaChangeHandler extends AlterHandler {
         List<Column> targetIndexSchema = indexSchemaMap.get(targetIndexId);
         // When rollup is specified, there is no need to check the order of generated columns.
         // When rollup is not specified and the order of baseIndex needs to be modified, the order needs to be checked.
-        if (alterClause.getRollupName() == null) {
+        if (reorderColumnsOp.getRollupName() == null) {
             checkOrder(targetIndexSchema, orderedColNames);
         }
         // check and create new ordered column list
@@ -1910,7 +1910,7 @@ public class SchemaChangeHandler extends AlterHandler {
     }
 
     @Override
-    public void process(String rawSql, List<AlterClause> alterClauses, Database db,
+    public void process(String rawSql, List<AlterOp> alterOps, Database db,
                         OlapTable olapTable)
             throws UserException {
         olapTable.writeLockOrDdlException();
@@ -1970,8 +1970,8 @@ public class SchemaChangeHandler extends AlterHandler {
             Map<Long, Set<String>> indexOnPartitions = new HashMap<>();
             boolean isDropIndex = false;
             Map<String, String> propertyMap = new HashMap<>();
-            for (AlterClause alterClause : alterClauses) {
-                Map<String, String> properties = alterClause.getProperties();
+            for (AlterOp alterOp : alterOps) {
+                Map<String, String> properties = alterOp.getProperties();
                 // alter table properties
                 if (properties != null) {
                     if (propertyMap.isEmpty()) {
@@ -1991,7 +1991,7 @@ public class SchemaChangeHandler extends AlterHandler {
                         String distributionType = properties.get(PropertyAnalyzer.PROPERTIES_DISTRIBUTION_TYPE);
                         if (!distributionType.equalsIgnoreCase("random")) {
                             throw new DdlException(
-                                    "Only support modifying distribution type of table from" + " hash to random");
+                                "Only support modifying distribution type of table from" + " hash to random");
                         }
                         Env.getCurrentEnv().convertDistributionType(db, olapTable);
                         return;
@@ -2015,8 +2015,8 @@ public class SchemaChangeHandler extends AlterHandler {
                                 // This table is not a dynamic partition table
                                 // and didn't supply all dynamic partition properties
                                 throw new DdlException("Table " + db.getFullName() + "." + olapTable.getName()
-                                        + " is not a dynamic partition table." + " Use command `HELP ALTER TABLE` "
-                                        + "to see how to change a normal table to a dynamic partition table.");
+                                    + " is not a dynamic partition table." + " Use command `HELP ALTER TABLE` "
+                                    + "to see how to change a normal table to a dynamic partition table.");
                             }
                         }
                         Env.getCurrentEnv().modifyTableDynamicPartition(db, olapTable, properties);
@@ -2035,7 +2035,7 @@ public class SchemaChangeHandler extends AlterHandler {
                         return;
                     } else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_ENABLE_LIGHT_SCHEMA_CHANGE)) {
                         lightSchemaChange = Boolean.parseBoolean(
-                                properties.get(PropertyAnalyzer.PROPERTIES_ENABLE_LIGHT_SCHEMA_CHANGE));
+                            properties.get(PropertyAnalyzer.PROPERTIES_ENABLE_LIGHT_SCHEMA_CHANGE));
                         if (Objects.equals(olapTable.getEnableLightSchemaChange(), lightSchemaChange)) {
                             return;
                         }
@@ -2045,7 +2045,7 @@ public class SchemaChangeHandler extends AlterHandler {
                         enableLightSchemaChange(db, olapTable);
                         return;
                     } else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_STORE_ROW_COLUMN)
-                                || properties.containsKey(PropertyAnalyzer.PROPERTIES_ROW_STORE_COLUMNS)) {
+                            || properties.containsKey(PropertyAnalyzer.PROPERTIES_ROW_STORE_COLUMNS)) {
                         String value = properties.get(PropertyAnalyzer.PROPERTIES_STORE_ROW_COLUMN);
                         if (value != null && value.equalsIgnoreCase("false")) {
                             throw new DdlException("Can not alter store_row_column from true to false currently");
@@ -2069,46 +2069,46 @@ public class SchemaChangeHandler extends AlterHandler {
                     throw new DdlException("Can not alter table when there are temp partitions in table");
                 }
 
-                if (alterClause instanceof AddColumnClause) {
+                if (alterOp instanceof AddColumnOp) {
                     // add column
-                    boolean clauseCanLightSchemaChange = processAddColumn((AddColumnClause) alterClause, olapTable,
+                    boolean clauseCanLightSchemaChange = processAddColumn((AddColumnOp) alterOp, olapTable,
                             indexSchemaMap, colUniqueIdSupplierMap);
                     if (!clauseCanLightSchemaChange) {
                         lightSchemaChange = false;
                     }
-                } else if (alterClause instanceof AddColumnsClause) {
+                } else if (alterOp instanceof AddColumnsOp) {
                     // add columns
-                    boolean clauseCanLightSchemaChange = processAddColumns((AddColumnsClause) alterClause, olapTable,
+                    boolean clauseCanLightSchemaChange = processAddColumns((AddColumnsOp) alterOp, olapTable,
                             indexSchemaMap, false, colUniqueIdSupplierMap);
                     if (!clauseCanLightSchemaChange) {
                         lightSchemaChange = false;
                     }
-                } else if (alterClause instanceof DropColumnClause) {
+                } else if (alterOp instanceof DropColumnOp) {
                     // drop column and drop indexes on this column
-                    boolean clauseCanLightSchemaChange = processDropColumn((DropColumnClause) alterClause, olapTable,
+                    boolean clauseCanLightSchemaChange = processDropColumn((DropColumnOp) alterOp, olapTable,
                             indexSchemaMap, newIndexes);
                     if (!clauseCanLightSchemaChange) {
                         lightSchemaChange = false;
                     }
-                } else if (alterClause instanceof ModifyColumnClause) {
+                } else if (alterOp instanceof ModifyColumnOp) {
                     // modify column
-                    boolean clauseCanLightSchemaChange = processModifyColumn((ModifyColumnClause) alterClause,
+                    boolean clauseCanLightSchemaChange = processModifyColumn((ModifyColumnOp) alterOp,
                             olapTable, indexSchemaMap);
                     if (!clauseCanLightSchemaChange) {
                         lightSchemaChange = false;
                     }
-                } else if (alterClause instanceof ReorderColumnsClause) {
+                } else if (alterOp instanceof ReorderColumnsOp) {
                     // reorder column
-                    processReorderColumn((ReorderColumnsClause) alterClause, olapTable, indexSchemaMap);
+                    processReorderColumn((ReorderColumnsOp) alterOp, olapTable, indexSchemaMap);
                     lightSchemaChange = false;
-                } else if (alterClause instanceof ModifyTablePropertiesClause) {
+                } else if (alterOp instanceof ModifyTablePropertiesOp) {
                     // modify table properties
                     // do nothing, properties are already in propertyMap
                     lightSchemaChange = false;
-                } else if (alterClause instanceof CreateIndexClause) {
-                    CreateIndexClause createIndexClause = (CreateIndexClause) alterClause;
-                    Index index = createIndexClause.getIndex();
-                    if (processAddIndex(createIndexClause, olapTable, newIndexes)) {
+                } else if (alterOp instanceof CreateIndexOp) {
+                    CreateIndexOp createIndexOp = (CreateIndexOp) alterOp;
+                    Index index = createIndexOp.getIndex();
+                    if (processAddIndex(createIndexOp, olapTable, newIndexes)) {
                         return;
                     }
                     lightSchemaChange = false;
@@ -2120,10 +2120,10 @@ public class SchemaChangeHandler extends AlterHandler {
                         isDropIndex = false;
                         lightIndexChange = true;
                     }
-                } else if (alterClause instanceof BuildIndexClause) {
-                    BuildIndexClause buildIndexClause = (BuildIndexClause) alterClause;
-                    IndexDefinition indexDef = buildIndexClause.getIndexDef();
-                    Index index = buildIndexClause.getIndex();
+                } else if (alterOp instanceof BuildIndexOp) {
+                    BuildIndexOp buildIndexOp = (BuildIndexOp) alterOp;
+                    IndexDefinition indexDef = buildIndexOp.getIndexDef();
+                    Index index = buildIndexOp.getIndex();
 
                     for (Column column : olapTable.getBaseSchema()) {
                         if (!column.getType().isVariantType()) {
@@ -2133,8 +2133,8 @@ public class SchemaChangeHandler extends AlterHandler {
                         for (String indexColumn : index.getColumns()) {
                             if (column.getName().equalsIgnoreCase(indexColumn)) {
                                 throw new DdlException("BUILD INDEX operation failed: The "
-                                        + indexDef.getIndexName() + " index can not be built on the "
-                                        + indexColumn + " column, because it is a variant type column.");
+                                    + indexDef.getIndexName() + " index can not be built on the "
+                                    + indexColumn + " column, because it is a variant type column.");
                             }
                         }
                     }
@@ -2149,17 +2149,17 @@ public class SchemaChangeHandler extends AlterHandler {
                     alterIndexes.add(index);
                     buildIndexChange = true;
                     lightSchemaChange = false;
-                } else if (alterClause instanceof DropIndexClause) {
-                    if (processDropIndex((DropIndexClause) alterClause, olapTable, newIndexes)) {
+                } else if (alterOp instanceof DropIndexOp) {
+                    if (processDropIndex((DropIndexOp) alterOp, olapTable, newIndexes)) {
                         return;
                     }
                     lightSchemaChange = false;
 
-                    DropIndexClause dropIndexClause = (DropIndexClause) alterClause;
+                    DropIndexOp dropIndexOp = (DropIndexOp) alterOp;
                     List<Index> existedIndexes = olapTable.getIndexes();
                     Index found = null;
                     for (Index existedIdx : existedIndexes) {
-                        if (existedIdx.getIndexName().equalsIgnoreCase(dropIndexClause.getIndexName())) {
+                        if (existedIdx.getIndexName().equalsIgnoreCase(dropIndexOp.getIndexName())) {
                             found = existedIdx;
                             break;
                         }
@@ -2198,12 +2198,12 @@ public class SchemaChangeHandler extends AlterHandler {
                 long jobId = Env.getCurrentEnv().getNextId();
                 //for schema change add/drop value column optimize, direct modify table meta.
                 modifyTableLightSchemaChange(rawSql, db, olapTable, indexSchemaMap, newIndexes,
-                                             null, isDropIndex, jobId, false, propertyMap);
+                        null, isDropIndex, jobId, false, propertyMap);
             } else if (Config.enable_light_index_change && lightIndexChange) {
                 long jobId = Env.getCurrentEnv().getNextId();
                 //for schema change add/drop inverted index and ngram_bf optimize, direct modify table meta firstly.
                 modifyTableLightSchemaChange(rawSql, db, olapTable, indexSchemaMap, newIndexes,
-                                             alterIndexes, isDropIndex, jobId, false, propertyMap);
+                        alterIndexes, isDropIndex, jobId, false, propertyMap);
             } else if (buildIndexChange) {
                 if (alterIndexes.isEmpty()) {
                     throw new DdlException("Altered index is empty. please check your alter stmt.");
@@ -2252,7 +2252,7 @@ public class SchemaChangeHandler extends AlterHandler {
     }
 
     @Override
-    public void processExternalTable(List<AlterClause> alterClauses, Database db, Table externalTable)
+    public void processExternalTable(List<AlterOp> alterOps, Database db, Table externalTable)
             throws UserException {
         externalTable.writeLockOrDdlException();
         try {
@@ -2260,22 +2260,22 @@ public class SchemaChangeHandler extends AlterHandler {
             List<Column> newSchema = Lists.newArrayList();
             newSchema.addAll(externalTable.getBaseSchema(true));
 
-            for (AlterClause alterClause : alterClauses) {
-                if (alterClause instanceof AddColumnClause) {
+            for (AlterOp alterOp : alterOps) {
+                if (alterOp instanceof AddColumnOp) {
                     // add column
-                    processAddColumn((AddColumnClause) alterClause, externalTable, newSchema);
-                } else if (alterClause instanceof AddColumnsClause) {
+                    processAddColumn((AddColumnOp) alterOp, externalTable, newSchema);
+                } else if (alterOp instanceof AddColumnsOp) {
                     // add columns
-                    processAddColumns((AddColumnsClause) alterClause, externalTable, newSchema);
-                } else if (alterClause instanceof DropColumnClause) {
+                    processAddColumns((AddColumnsOp) alterOp, externalTable, newSchema);
+                } else if (alterOp instanceof DropColumnOp) {
                     // drop column and drop indexes on this column
-                    processDropColumn((DropColumnClause) alterClause, externalTable, newSchema);
-                } else if (alterClause instanceof ModifyColumnClause) {
+                    processDropColumn((DropColumnOp) alterOp, externalTable, newSchema);
+                } else if (alterOp instanceof ModifyColumnOp) {
                     // modify column
-                    processModifyColumn((ModifyColumnClause) alterClause, externalTable, newSchema);
-                } else if (alterClause instanceof ReorderColumnsClause) {
+                    processModifyColumn((ModifyColumnOp) alterOp, externalTable, newSchema);
+                } else if (alterOp instanceof ReorderColumnsOp) {
                     // reorder column
-                    processReorderColumn((ReorderColumnsClause) alterClause, externalTable, newSchema);
+                    processReorderColumn((ReorderColumnsOp) alterOp, externalTable, newSchema);
                 } else {
                     Preconditions.checkState(false);
                 }
@@ -2740,15 +2740,15 @@ public class SchemaChangeHandler extends AlterHandler {
      * Returns true if the index already exists, there is no need to create the job to add the index.
      * Otherwise, return false, there is need to create a job to add the index.
      */
-    private boolean processAddIndex(CreateIndexClause alterClause, OlapTable olapTable, List<Index> newIndexes)
-            throws UserException {
-        Index alterIndex = alterClause.getIndex();
+    private boolean processAddIndex(CreateIndexOp createIndexOp, OlapTable olapTable, List<Index> newIndexes)
+             throws UserException {
+        Index alterIndex = createIndexOp.getIndex();
         if (alterIndex == null) {
             return false;
         }
 
         List<Index> existedIndexes = olapTable.getIndexes();
-        IndexDefinition indexDef = alterClause.getIndexDef();
+        IndexDefinition indexDef = createIndexOp.getIndexDef();
         Set<String> newColset = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER);
         newColset.addAll(indexDef.getColumnNames());
         Set<Long> existedIndexIdSet = Sets.newHashSet();
@@ -2812,7 +2812,7 @@ public class SchemaChangeHandler extends AlterHandler {
             if (index.getIndexType() == indexDef.getIndexType() && newColset.equals(existedIdxColSet)) {
                 if (newColset.size() == 1
                         && olapTable.getInvertedIndexFileStorageFormat()
-                            .compareTo(TInvertedIndexFileStorageFormat.V2) >= 0) {
+                        .compareTo(TInvertedIndexFileStorageFormat.V2) >= 0) {
                     String columnName = indexDef.getColumnNames().get(0);
                     Column column = olapTable.getColumn(columnName);
                     if (column != null && (column.getType().isStringType() || column.getType().isVariantType())) {
@@ -2842,9 +2842,9 @@ public class SchemaChangeHandler extends AlterHandler {
      * Returns true if the index does not exist, there is no need to create the job to drop the index.
      * Otherwise return false, there is need to create a job to drop the index.
      */
-    private boolean processDropIndex(DropIndexClause alterClause, OlapTable olapTable, List<Index> indexes)
+    private boolean processDropIndex(DropIndexOp dropIndexOp, OlapTable olapTable, List<Index> indexes)
             throws DdlException {
-        String indexName = alterClause.getIndexName();
+        String indexName = dropIndexOp.getIndexName();
         List<Index> existedIndexes = olapTable.getIndexes();
         Index found = null;
         for (Index existedIdx : existedIndexes) {
@@ -2854,7 +2854,7 @@ public class SchemaChangeHandler extends AlterHandler {
             }
         }
         if (found == null) {
-            if (alterClause.isSetIfExists()) {
+            if (dropIndexOp.isSetIfExists()) {
                 LOG.info("drop index[{}] which does not exist on table[{}]", indexName, olapTable.getName());
                 return true;
             }
@@ -2868,7 +2868,7 @@ public class SchemaChangeHandler extends AlterHandler {
         Iterator<Index> itr = indexes.iterator();
         while (itr.hasNext()) {
             Index idx = itr.next();
-            if (idx.getIndexName().equalsIgnoreCase(alterClause.getIndexName())) {
+            if (idx.getIndexName().equalsIgnoreCase(dropIndexOp.getIndexName())) {
                 itr.remove();
                 break;
             }
@@ -3382,7 +3382,7 @@ public class SchemaChangeHandler extends AlterHandler {
         }
     }
 
-    public boolean updateBinlogConfig(Database db, OlapTable olapTable, List<AlterClause> alterClauses)
+    public boolean updateBinlogConfig(Database db, OlapTable olapTable, List<AlterOp> alterOps)
             throws DdlException, UserException {
         List<Partition> partitions = Lists.newArrayList();
         BinlogConfig oldBinlogConfig;
@@ -3399,8 +3399,8 @@ public class SchemaChangeHandler extends AlterHandler {
             olapTable.readUnlock();
         }
 
-        for (AlterClause alterClause : alterClauses) {
-            Map<String, String> properties = alterClause.getProperties();
+        for (AlterOp alterOp : alterOps) {
+            Map<String, String> properties = alterOp.getProperties();
             if (properties == null) {
                 continue;
             }
@@ -3461,7 +3461,7 @@ public class SchemaChangeHandler extends AlterHandler {
 
         for (Partition partition : partitions) {
             updatePartitionProperties(db, olapTable.getName(), partition.getName(), -1, -1,
-                                                newBinlogConfig, null, null, -1, -1, -1);
+                    newBinlogConfig, null, null, -1, -1, -1);
         }
 
         olapTable.writeLockOrDdlException();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java
index 0daacffea49..23e5fae545e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java
@@ -17,18 +17,6 @@
 
 package org.apache.doris.alter;
 
-import org.apache.doris.analysis.AddBackendClause;
-import org.apache.doris.analysis.AddFollowerClause;
-import org.apache.doris.analysis.AddObserverClause;
-import org.apache.doris.analysis.AlterClause;
-import org.apache.doris.analysis.DecommissionBackendClause;
-import org.apache.doris.analysis.DropBackendClause;
-import org.apache.doris.analysis.DropFollowerClause;
-import org.apache.doris.analysis.DropObserverClause;
-import org.apache.doris.analysis.ModifyBackendClause;
-import org.apache.doris.analysis.ModifyBackendHostNameClause;
-import org.apache.doris.analysis.ModifyBrokerClause;
-import org.apache.doris.analysis.ModifyFrontendHostNameClause;
 import org.apache.doris.catalog.CatalogRecycleBin;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.Env;
@@ -54,14 +42,18 @@ import org.apache.doris.nereids.trees.plans.commands.info.AddBackendOp;
 import org.apache.doris.nereids.trees.plans.commands.info.AddBrokerOp;
 import org.apache.doris.nereids.trees.plans.commands.info.AddFollowerOp;
 import org.apache.doris.nereids.trees.plans.commands.info.AddObserverOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DecommissionBackendOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropAllBrokerOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropBackendOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropBrokerOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropFollowerOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropObserverOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyBackendHostNameOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyBackendOp;
-import org.apache.doris.nereids.trees.plans.commands.info.ModifyFrontendOrBackendHostNameOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyBrokerOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyFrontendHostNameOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyNodeHostNameOp;
 import org.apache.doris.resource.Tag;
 import org.apache.doris.system.Backend;
 import org.apache.doris.system.SystemInfoService;
@@ -151,37 +143,36 @@ public class SystemHandler extends AlterHandler {
 
     @Override
     // add synchronized to avoid process 2 or more stmts at same time
-    public synchronized void process(String rawSql, List<AlterClause> alterClauses,
-            Database dummyDb,
-            OlapTable dummyTbl) throws UserException {
-        Preconditions.checkArgument(alterClauses.size() == 1);
-        AlterClause alterClause = alterClauses.get(0);
+    public synchronized void process(String rawSql, List<AlterOp> alterOps, Database dummyDb,
+                                     OlapTable dummyTbl) throws UserException {
+        Preconditions.checkArgument(alterOps.size() == 1);
+        AlterOp alterOp = alterOps.get(0);
 
-        if (alterClause instanceof AddBackendClause) {
+        if (alterOp instanceof AddBackendOp) {
             // add backend
-            AddBackendClause addBackendClause = (AddBackendClause) alterClause;
-            Env.getCurrentSystemInfo().addBackends(addBackendClause.getHostInfos(), addBackendClause.getTagMap());
-        } else if (alterClause instanceof DropBackendClause) {
+            AddBackendOp addBackendOp = (AddBackendOp) alterOp;
+            Env.getCurrentSystemInfo().addBackends(addBackendOp.getHostInfos(), addBackendOp.getTagMap());
+        } else if (alterOp instanceof DropBackendOp) {
             // drop backend
-            DropBackendClause dropBackendClause = (DropBackendClause) alterClause;
-            if (!dropBackendClause.isForce()) {
+            DropBackendOp dropBackendOp = (DropBackendOp) alterOp;
+            if (!dropBackendOp.isForce()) {
                 throw new DdlException("It is highly NOT RECOMMENDED to use DROP BACKEND stmt."
                         + "It is not safe to directly drop a backend. "
                         + "All data on this backend will be discarded permanently. "
                         + "If you insist, use DROPP instead of DROP");
             }
-            if (dropBackendClause.getHostInfos().isEmpty()) {
+            if (dropBackendOp.getHostInfos().isEmpty()) {
                 // drop by id
-                Env.getCurrentSystemInfo().dropBackendsByIds(dropBackendClause.getIds());
+                Env.getCurrentSystemInfo().dropBackendsByIds(dropBackendOp.getIds());
             } else {
                 // drop by host
-                Env.getCurrentSystemInfo().dropBackends(dropBackendClause.getHostInfos());
+                Env.getCurrentSystemInfo().dropBackends(dropBackendOp.getHostInfos());
             }
-        } else if (alterClause instanceof DecommissionBackendClause) {
+        } else if (alterOp instanceof DecommissionBackendOp) {
             // decommission
-            DecommissionBackendClause decommissionBackendClause = (DecommissionBackendClause) alterClause;
+            DecommissionBackendOp decommissionBackendOp = (DecommissionBackendOp) alterOp;
             // check request
-            List<Backend> decommissionBackends = checkDecommission(decommissionBackendClause);
+            List<Backend> decommissionBackends = checkDecommission(decommissionBackendOp);
 
             // set backend's state as 'decommissioned'
             // for decommission operation, here is no decommission job. the system handler will check
@@ -190,34 +181,34 @@ public class SystemHandler extends AlterHandler {
                 Env.getCurrentSystemInfo().decommissionBackend(backend);
             }
 
-        } else if (alterClause instanceof AddObserverClause) {
-            AddObserverClause clause = (AddObserverClause) alterClause;
-            Env.getCurrentEnv().addFrontend(FrontendNodeType.OBSERVER, clause.getHost(),
-                    clause.getPort());
-        } else if (alterClause instanceof DropObserverClause) {
-            DropObserverClause clause = (DropObserverClause) alterClause;
-            Env.getCurrentEnv().dropFrontend(FrontendNodeType.OBSERVER, clause.getHost(),
-                    clause.getPort());
-        } else if (alterClause instanceof AddFollowerClause) {
-            AddFollowerClause clause = (AddFollowerClause) alterClause;
-            Env.getCurrentEnv().addFrontend(FrontendNodeType.FOLLOWER, clause.getHost(),
-                    clause.getPort());
-        } else if (alterClause instanceof DropFollowerClause) {
-            DropFollowerClause clause = (DropFollowerClause) alterClause;
-            Env.getCurrentEnv().dropFrontend(FrontendNodeType.FOLLOWER, clause.getHost(),
-                    clause.getPort());
-        } else if (alterClause instanceof ModifyBrokerClause) {
-            ModifyBrokerClause clause = (ModifyBrokerClause) alterClause;
-            Env.getCurrentEnv().getBrokerMgr().execute(clause);
-        } else if (alterClause instanceof ModifyBackendClause) {
-            Env.getCurrentSystemInfo().modifyBackends(((ModifyBackendClause) alterClause));
-        } else if (alterClause instanceof ModifyFrontendHostNameClause) {
-            ModifyFrontendHostNameClause clause = (ModifyFrontendHostNameClause) alterClause;
-            Env.getCurrentEnv().modifyFrontendHostName(clause.getHost(), clause.getPort(), clause.getNewHost());
-        } else if (alterClause instanceof ModifyBackendHostNameClause) {
-            Env.getCurrentSystemInfo().modifyBackendHost((ModifyBackendHostNameClause) alterClause);
+        } else if (alterOp instanceof AddObserverOp) {
+            AddObserverOp op = (AddObserverOp) alterOp;
+            Env.getCurrentEnv().addFrontend(FrontendNodeType.OBSERVER, op.getHost(),
+                    op.getPort());
+        } else if (alterOp instanceof DropObserverOp) {
+            DropObserverOp op = (DropObserverOp) alterOp;
+            Env.getCurrentEnv().dropFrontend(FrontendNodeType.OBSERVER, op.getHost(),
+                    op.getPort());
+        } else if (alterOp instanceof AddFollowerOp) {
+            AddFollowerOp op = (AddFollowerOp) alterOp;
+            Env.getCurrentEnv().addFrontend(FrontendNodeType.FOLLOWER, op.getHost(),
+                    op.getPort());
+        } else if (alterOp instanceof DropFollowerOp) {
+            DropFollowerOp op = (DropFollowerOp) alterOp;
+            Env.getCurrentEnv().dropFrontend(FrontendNodeType.FOLLOWER, op.getHost(),
+                    op.getPort());
+        } else if (alterOp instanceof ModifyBrokerOp) {
+            ModifyBrokerOp modifyBrokerOp = (ModifyBrokerOp) alterOp;
+            Env.getCurrentEnv().getBrokerMgr().execute(modifyBrokerOp);
+        } else if (alterOp instanceof ModifyBackendOp) {
+            Env.getCurrentSystemInfo().modifyBackends(((ModifyBackendOp) alterOp));
+        } else if (alterOp instanceof ModifyFrontendHostNameOp) {
+            ModifyFrontendHostNameOp op = (ModifyFrontendHostNameOp) alterOp;
+            Env.getCurrentEnv().modifyFrontendHostName(op.getHost(), op.getPort(), op.getNewHost());
+        } else if (alterOp instanceof ModifyBackendHostNameOp) {
+            Env.getCurrentSystemInfo().modifyBackendHost((ModifyBackendHostNameOp) alterOp);
         } else {
-            Preconditions.checkState(false, alterClause.getClass());
+            Preconditions.checkState(false, alterOp.getClass());
         }
     }
 
@@ -287,9 +278,9 @@ public class SystemHandler extends AlterHandler {
                 ModifyBackendOp op = (ModifyBackendOp) alterSystemCommand.getAlterSystemOp();
                 Env.getCurrentSystemInfo().modifyBackends(op);
             } else if (alterSystemCommand.getType().equals(PlanType.ALTER_SYSTEM_MODIFY_FRONTEND_OR_BACKEND_HOSTNAME)) {
-                ModifyFrontendOrBackendHostNameOp op =
-                        (ModifyFrontendOrBackendHostNameOp) alterSystemCommand.getAlterSystemOp();
-                if (op.getModifyOpType().equals(ModifyFrontendOrBackendHostNameOp.ModifyOpType.Frontend)) {
+                ModifyNodeHostNameOp op =
+                        (ModifyNodeHostNameOp) alterSystemCommand.getAlterSystemOp();
+                if (op.getModifyOpType().equals(ModifyNodeHostNameOp.ModifyOpType.Frontend)) {
                     Env.getCurrentEnv().modifyFrontendHostName(op.getHost(), op.getPort(), op.getNewHost());
                 } else {
                     Env.getCurrentSystemInfo().modifyBackendHostName(op.getHost(), op.getPort(), op.getNewHost());
@@ -444,12 +435,12 @@ public class SystemHandler extends AlterHandler {
         return sampleTablets.isEmpty() && leakyTablets.values().stream().allMatch(ts -> ts < skipLeakyTs);
     }
 
-    private List<Backend> checkDecommission(DecommissionBackendClause decommissionBackendClause)
+    private List<Backend> checkDecommission(DecommissionBackendOp decommissionBackendOp)
             throws DdlException {
-        if (decommissionBackendClause.getHostInfos().isEmpty()) {
-            return checkDecommissionByIds(decommissionBackendClause.getIds());
+        if (decommissionBackendOp.getHostInfos().isEmpty()) {
+            return checkDecommissionByIds(decommissionBackendOp.getIds());
         }
-        return checkDecommission(decommissionBackendClause.getHostInfos());
+        return checkDecommission(decommissionBackendOp.getHostInfos());
     }
 
     private List<Backend> checkDecommissionForNereids(DecommissionBackendOp decommissionBackendOp)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DistributionDesc.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DistributionDesc.java
index 83205deef2f..ddc2c9b28ca 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DistributionDesc.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DistributionDesc.java
@@ -22,6 +22,7 @@ import org.apache.doris.catalog.DistributionInfo;
 import org.apache.doris.catalog.DistributionInfo.DistributionInfoType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
+import org.apache.doris.nereids.trees.plans.commands.info.DistributionDescriptor;
 
 import org.apache.commons.lang3.NotImplementedException;
 
@@ -73,4 +74,8 @@ public class DistributionDesc {
     public boolean inDistributionColumns(String columnName) {
         return getDistributionColumnNames() != null && getDistributionColumnNames().contains(columnName);
     }
+
+    public DistributionDescriptor toDistributionDescriptor() {
+        throw new NotImplementedException("toDistributionDescriptor not implemented");
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/HashDistributionDesc.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/HashDistributionDesc.java
index 39c44c951c6..89aaadd9164 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/HashDistributionDesc.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/HashDistributionDesc.java
@@ -24,6 +24,7 @@ import org.apache.doris.catalog.HashDistributionInfo;
 import org.apache.doris.catalog.KeysType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
+import org.apache.doris.nereids.trees.plans.commands.info.DistributionDescriptor;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -144,4 +145,9 @@ public class HashDistributionDesc extends DistributionDesc {
                                 new HashDistributionInfo(numBucket, autoBucket, distributionColumns);
         return hashDistributionInfo;
     }
+
+    @Override
+    public DistributionDescriptor toDistributionDescriptor() {
+        return new DistributionDescriptor(true, this.autoBucket, this.numBucket, this.distributionColumnNames);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionExprUtil.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionExprUtil.java
index ec6772e849a..e228eabf469 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionExprUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionExprUtil.java
@@ -28,6 +28,7 @@ import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.util.AutoBucketCalculator;
 import org.apache.doris.common.util.PropertyAnalyzer;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionOp;
 import org.apache.doris.thrift.TNullableStringLiteral;
 
 import com.google.common.base.Objects;
@@ -124,10 +125,10 @@ public class PartitionExprUtil {
         return null;
     }
 
-    public static Map<String, AddPartitionClause> getAddPartitionClauseFromPartitionValues(OlapTable olapTable,
-            ArrayList<List<TNullableStringLiteral>> partitionValues, PartitionInfo partitionInfo)
+    public static Map<String, AddPartitionOp> getAddPartitionClauseFromPartitionValues(
+            OlapTable olapTable, ArrayList<List<TNullableStringLiteral>> partitionValues, PartitionInfo partitionInfo)
             throws AnalysisException {
-        Map<String, AddPartitionClause> result = Maps.newHashMap();
+        Map<String, AddPartitionOp> result = Maps.newHashMap();
         ArrayList<Expr> partitionExprs = partitionInfo.getPartitionExprs();
         PartitionType partitionType = partitionInfo.getType();
         List<Column> partitionColumn = partitionInfo.getPartitionColumns();
@@ -162,8 +163,8 @@ public class PartitionExprUtil {
                 Type partitionColumnType = partitionColumn.get(0).getType();
                 DateLiteral beginDateTime = new DateLiteral(beginTime, partitionColumnType);
                 partitionName += String.format(DATETIME_NAME_FORMATTER,
-                        beginDateTime.getYear(), beginDateTime.getMonth(), beginDateTime.getDay(),
-                        beginDateTime.getHour(), beginDateTime.getMinute(), beginDateTime.getSecond());
+                    beginDateTime.getYear(), beginDateTime.getMonth(), beginDateTime.getDay(),
+                    beginDateTime.getHour(), beginDateTime.getMinute(), beginDateTime.getSecond());
                 DateLiteral endDateTime = getRangeEnd(beginDateTime, intervalInfo);
                 partitionKeyDesc = createPartitionKeyDescWithRange(beginDateTime, endDateTime, partitionColumnType);
             } else if (partitionType == PartitionType.LIST) {
@@ -182,7 +183,7 @@ public class PartitionExprUtil {
                 if (hasStringType) {
                     if (partitionName.length() > MAX_PARTITION_NAME_LENGTH) {
                         partitionName = partitionName.substring(0, MAX_PARTITION_NAME_LENGTH)
-                                + "_" + Integer.toHexString(partitionName.hashCode());
+                            + "_" + Integer.toHexString(partitionName.hashCode());
                     }
                 }
             } else {
@@ -223,8 +224,9 @@ public class PartitionExprUtil {
                 partitionProperties.put(PropertyAnalyzer.PROPERTIES_STORAGE_MEDIUM,
                         olapTable.getStorageMedium().name());
             }
-            AddPartitionClause addPartitionClause = new AddPartitionClause(singleRangePartitionDesc,
-                    distributionDesc, partitionProperties, false);
+            AddPartitionOp addPartitionClause = new AddPartitionOp(
+                    singleRangePartitionDesc.translateToPartitionDefinition(),
+                    distributionDesc.toDistributionDescriptor(), partitionProperties, false);
             result.put(partitionName, addPartitionClause);
         }
         return result;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionKeyDesc.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionKeyDesc.java
index 223576a52c2..8c6c731e59c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionKeyDesc.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionKeyDesc.java
@@ -24,6 +24,7 @@ import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
 
+import java.util.ArrayList;
 import java.util.List;
 
 // Describe the partition key values in create table or add partition clause
@@ -117,7 +118,7 @@ public class PartitionKeyDesc {
     }
 
     public List<PartitionValue> getUpperValues() {
-        return upperValues;
+        return upperValues == null ? new ArrayList<>() : upperValues;
     }
 
     public List<List<PartitionValue>> getInValues() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/RandomDistributionDesc.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/RandomDistributionDesc.java
index 4ffc24fdb19..09cba1d773b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/RandomDistributionDesc.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/RandomDistributionDesc.java
@@ -22,7 +22,9 @@ import org.apache.doris.catalog.DistributionInfo;
 import org.apache.doris.catalog.DistributionInfo.DistributionInfoType;
 import org.apache.doris.catalog.RandomDistributionInfo;
 import org.apache.doris.common.AnalysisException;
+import org.apache.doris.nereids.trees.plans.commands.info.DistributionDescriptor;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
@@ -67,4 +69,9 @@ public class RandomDistributionDesc extends DistributionDesc {
     public List<String> getDistributionColumnNames() {
         return null;
     }
+
+    @Override
+    public DistributionDescriptor toDistributionDescriptor() {
+        return new DistributionDescriptor(false, this.autoBucket, this.numBucket, new ArrayList<>());
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BrokerMgr.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BrokerMgr.java
index 82d9c2f0ec1..3ee25e5711b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BrokerMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BrokerMgr.java
@@ -29,6 +29,7 @@ import org.apache.doris.common.proc.ProcNodeInterface;
 import org.apache.doris.common.proc.ProcResult;
 import org.apache.doris.common.util.NetUtils;
 import org.apache.doris.common.util.TimeUtils;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyBrokerOp;
 import org.apache.doris.persist.gson.GsonUtils;
 
 import com.google.common.collect.ArrayListMultimap;
@@ -86,6 +87,22 @@ public class BrokerMgr {
         return brokers;
     }
 
+    public void execute(ModifyBrokerOp modifyBrokerOp) throws DdlException {
+        switch (modifyBrokerOp.getOp()) {
+            case OP_ADD:
+                addBrokers(modifyBrokerOp.getBrokerName(), modifyBrokerOp.getHostPortPairs());
+                break;
+            case OP_DROP:
+                dropBrokers(modifyBrokerOp.getBrokerName(), modifyBrokerOp.getHostPortPairs());
+                break;
+            case OP_DROP_ALL:
+                dropAllBroker(modifyBrokerOp.getBrokerName());
+                break;
+            default:
+                break;
+        }
+    }
+
     public void execute(ModifyBrokerClause clause) throws DdlException {
         switch (clause.getOp()) {
             case OP_ADD:
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
index 8fa63f6b33b..7d8e59b708b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
@@ -24,19 +24,9 @@ import org.apache.doris.alter.MaterializedViewHandler;
 import org.apache.doris.alter.QuotaType;
 import org.apache.doris.alter.SchemaChangeHandler;
 import org.apache.doris.alter.SystemHandler;
-import org.apache.doris.analysis.AddPartitionClause;
-import org.apache.doris.analysis.AddPartitionLikeClause;
-import org.apache.doris.analysis.AlterMultiPartitionClause;
-import org.apache.doris.analysis.ColumnRenameClause;
 import org.apache.doris.analysis.DistributionDesc;
-import org.apache.doris.analysis.DropPartitionClause;
 import org.apache.doris.analysis.Expr;
-import org.apache.doris.analysis.ModifyDistributionClause;
-import org.apache.doris.analysis.PartitionRenameClause;
-import org.apache.doris.analysis.ReplacePartitionClause;
-import org.apache.doris.analysis.RollupRenameClause;
 import org.apache.doris.analysis.SlotRef;
-import org.apache.doris.analysis.TableRenameClause;
 import org.apache.doris.backup.BackupHandler;
 import org.apache.doris.backup.RestoreJob;
 import org.apache.doris.binlog.BinlogGcer;
@@ -184,13 +174,23 @@ import org.apache.doris.nereids.trees.plans.commands.DropMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropMaterializedViewCommand;
 import org.apache.doris.nereids.trees.plans.commands.TruncateTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.UninstallPluginCommand;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionLikeOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionOp;
 import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVPropertyInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVRefreshInfo;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterMultiPartitionOp;
 import org.apache.doris.nereids.trees.plans.commands.info.AlterViewInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.CreateTableInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.CreateTableLikeInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.CreateViewInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.DropMTMVInfo;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyDistributionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.RenameColumnOp;
+import org.apache.doris.nereids.trees.plans.commands.info.RenamePartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.RenameRollupOp;
+import org.apache.doris.nereids.trees.plans.commands.info.RenameTableOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ReplacePartitionOp;
 import org.apache.doris.persist.AlterMTMV;
 import org.apache.doris.persist.AutoIncrementIdUpdateLog;
 import org.apache.doris.persist.BackendReplicasInfo;
@@ -3483,36 +3483,36 @@ public class Env {
      *
      * @param db
      * @param tableName
-     * @param addPartitionClause clause in the CreateTableStmt
+     * @param addPartitionOp clause in the CreateTableStmt
      * @param isCreateTable this call is for creating table
      * @param generatedPartitionId the preset partition id for the partition to add
      * @param writeEditLog whether to write an edit log for this addition
      * @return PartitionPersistInfo to be written to editlog. It may be null if no partitions added.
      * @throws DdlException
      */
-    public PartitionPersistInfo addPartition(Database db, String tableName, AddPartitionClause addPartitionClause,
+    public PartitionPersistInfo addPartition(Database db, String tableName, AddPartitionOp addPartitionOp,
                                              boolean isCreateTable, long generatedPartitionId,
                                              boolean writeEditLog) throws DdlException {
-        return getInternalCatalog().addPartition(db, tableName, addPartitionClause,
+        return getInternalCatalog().addPartition(db, tableName, addPartitionOp,
             isCreateTable, generatedPartitionId, writeEditLog);
     }
 
-    public void addMultiPartitions(Database db, String tableName, AlterMultiPartitionClause multiPartitionClause)
+    public void addMultiPartitions(Database db, String tableName, AlterMultiPartitionOp multiPartitionOp)
             throws DdlException {
-        getInternalCatalog().addMultiPartitions(db, tableName, multiPartitionClause);
+        getInternalCatalog().addMultiPartitions(db, tableName, multiPartitionOp);
     }
 
-    public void addPartitionLike(Database db, String tableName, AddPartitionLikeClause addPartitionLikeClause)
+    public void addPartitionLike(Database db, String tableName, AddPartitionLikeOp addPartitionLikeOp)
             throws DdlException {
-        getInternalCatalog().addPartitionLike(db, tableName, addPartitionLikeClause);
+        getInternalCatalog().addPartitionLike(db, tableName, addPartitionLikeOp);
     }
 
     public void replayAddPartition(PartitionPersistInfo info) throws MetaNotFoundException {
         getInternalCatalog().replayAddPartition(info);
     }
 
-    public void dropPartition(Database db, OlapTable olapTable, DropPartitionClause clause) throws DdlException {
-        getInternalCatalog().dropPartition(db, olapTable, clause);
+    public void dropPartition(Database db, OlapTable olapTable, DropPartitionOp dropPartitionOp) throws DdlException {
+        getInternalCatalog().dropPartition(db, olapTable, dropPartitionOp);
     }
 
     public void replayDropPartition(DropPartitionInfo info) throws MetaNotFoundException {
@@ -5398,8 +5398,8 @@ public class Env {
         getBackupHandler().cancel(command);
     }
 
-    public void renameTable(Database db, Table table, TableRenameClause tableRenameClause) throws DdlException {
-        renameTable(db, table, tableRenameClause.getNewTableName());
+    public void renameTable(Database db, Table table, RenameTableOp renameTableOp) throws DdlException {
+        renameTable(db, table, renameTableOp.getNewTableName());
     }
 
     // entry of rename table operation
@@ -5607,17 +5607,17 @@ public class Env {
         }
     }
 
-    public void renameRollup(Database db, OlapTable table, RollupRenameClause renameClause) throws DdlException {
+    public void renameRollup(Database db, OlapTable table, RenameRollupOp renameRollupOp) throws DdlException {
         table.writeLockOrDdlException();
         try {
             table.checkNormalStateForAlter();
-            String rollupName = renameClause.getRollupName();
+            String rollupName = renameRollupOp.getRollupName();
             // check if it is base table name
             if (rollupName.equals(table.getName())) {
                 throw new DdlException("Using ALTER TABLE RENAME to change table name");
             }
 
-            String newRollupName = renameClause.getNewRollupName();
+            String newRollupName = renameRollupOp.getNewRollupName();
             if (rollupName.equals(newRollupName)) {
                 throw new DdlException("Same rollup name");
             }
@@ -5666,18 +5666,18 @@ public class Env {
         }
     }
 
-    public void renamePartition(Database db, OlapTable table, PartitionRenameClause renameClause) throws DdlException {
+    public void renamePartition(Database db, OlapTable table, RenamePartitionOp renamePartitionOp) throws DdlException {
         table.writeLockOrDdlException();
         try {
             table.checkNormalStateForAlter();
             if (table.getPartitionInfo().getType() != PartitionType.RANGE
                     && table.getPartitionInfo().getType() != PartitionType.LIST) {
                 throw new DdlException(
-                        "Table[" + table.getName() + "] is single partitioned. " + "no need to rename partition name.");
+                    "Table[" + table.getName() + "] is single partitioned. " + "no need to rename partition name.");
             }
 
-            String partitionName = renameClause.getPartitionName();
-            String newPartitionName = renameClause.getNewPartitionName();
+            String partitionName = renamePartitionOp.getPartitionName();
+            String newPartitionName = renamePartitionOp.getNewPartitionName();
             if (partitionName.equalsIgnoreCase(newPartitionName)) {
                 throw new DdlException("Same partition name");
             }
@@ -5881,11 +5881,11 @@ public class Env {
         }
     }
 
-    public void renameColumn(Database db, OlapTable table, ColumnRenameClause renameClause) throws DdlException {
+    public void renameColumn(Database db, OlapTable table, RenameColumnOp renameColumnOp) throws DdlException {
         table.writeLockOrDdlException();
         try {
-            String colName = renameClause.getColName();
-            String newColName = renameClause.getNewColName();
+            String colName = renameColumnOp.getColName();
+            String newColName = renameColumnOp.getNewColName();
             Map<Long, Integer> indexIdToSchemaVersion = new HashMap<Long, Integer>();
             renameColumn(db, table, colName, newColName, indexIdToSchemaVersion, false);
         } finally {
@@ -6159,7 +6159,7 @@ public class Env {
     }
 
     public void modifyDefaultDistributionBucketNum(Database db, OlapTable olapTable,
-                                                   ModifyDistributionClause modifyDistributionClause)
+                                                   ModifyDistributionOp modifyDistributionOp)
             throws DdlException {
         olapTable.writeLockOrDdlException();
         try {
@@ -6172,7 +6172,7 @@ public class Env {
                 throw new DdlException("Only support change partitioned table's distribution.");
             }
 
-            DistributionDesc distributionDesc = modifyDistributionClause.getDistributionDesc();
+            DistributionDesc distributionDesc = modifyDistributionOp.getDistributionDesc().translateToCatalogStyle();
             if (distributionDesc != null) {
                 DistributionInfo defaultDistributionInfo = olapTable.getDefaultDistributionInfo();
                 List<Column> baseSchema = olapTable.getBaseSchema();
@@ -6180,14 +6180,14 @@ public class Env {
                 // for now. we only support modify distribution's bucket num
                 if (distributionInfo.getType() != defaultDistributionInfo.getType()) {
                     throw new DdlException(
-                            "Cannot change distribution type when modify" + " default distribution bucket num");
+                        "Cannot change distribution type when modify" + " default distribution bucket num");
                 }
                 if (distributionInfo.getType() == DistributionInfoType.HASH) {
                     HashDistributionInfo hashDistributionInfo = (HashDistributionInfo) distributionInfo;
                     if (!hashDistributionInfo.sameDistributionColumns((HashDistributionInfo) defaultDistributionInfo)) {
                         throw new DdlException("Cannot assign hash distribution with different distribution cols. "
-                                + "new is: " + hashDistributionInfo.getDistributionColumns() + " default is: "
-                                + ((HashDistributionInfo) defaultDistributionInfo).getDistributionColumns());
+                            + "new is: " + hashDistributionInfo.getDistributionColumns() + " default is: "
+                            + ((HashDistributionInfo) defaultDistributionInfo).getDistributionColumns());
                     }
                 }
 
@@ -6200,8 +6200,8 @@ public class Env {
 
                 ModifyTableDefaultDistributionBucketNumOperationLog info
                         = new ModifyTableDefaultDistributionBucketNumOperationLog(db.getId(), olapTable.getId(),
-                                distributionInfo.getType(), distributionInfo.getAutoBucket(), bucketNum,
-                                defaultDistributionInfo.getColumnsName());
+                        distributionInfo.getType(), distributionInfo.getAutoBucket(), bucketNum,
+                        defaultDistributionInfo.getColumnsName());
                 editLog.logModifyDefaultDistributionBucketNum(info);
                 LOG.info("modify table[{}] default bucket num to {}", olapTable.getName(), bucketNum);
             }
@@ -6692,14 +6692,14 @@ public class Env {
     /*
      * The entry of replacing partitions with temp partitions.
      */
-    public void replaceTempPartition(Database db, OlapTable olapTable, ReplacePartitionClause clause)
+    public void replaceTempPartition(Database db, OlapTable olapTable, ReplacePartitionOp replacePartitionOp)
             throws DdlException {
         Preconditions.checkState(olapTable.isWriteLockHeldByCurrentThread());
-        List<String> partitionNames = clause.getPartitionNames();
-        List<String> tempPartitionNames = clause.getTempPartitionNames();
-        boolean isStrictRange = clause.isStrictRange();
-        boolean useTempPartitionName = clause.useTempPartitionName();
-        boolean isForceDropOld = clause.isForceDropOldPartition();
+        List<String> partitionNames = replacePartitionOp.getPartitionNames();
+        List<String> tempPartitionNames = replacePartitionOp.getTempPartitionNames();
+        boolean isStrictRange = replacePartitionOp.isStrictRange();
+        boolean useTempPartitionName = replacePartitionOp.useTempPartitionName();
+        boolean isForceDropOld = replacePartitionOp.isForceDropOldPartition();
         // check partition exist
         for (String partName : partitionNames) {
             if (!olapTable.checkPartitionNameExist(partName, false)) {
@@ -6727,8 +6727,8 @@ public class Env {
         // it does not affect the logic of replace the partition
         try {
             Env.getCurrentEnv().getEventProcessor().processEvent(
-                    new ReplacePartitionEvent(db.getCatalog().getId(), db.getId(),
-                            olapTable.getId()));
+                new ReplacePartitionEvent(db.getCatalog().getId(), db.getId(),
+                    olapTable.getId()));
         } catch (Throwable t) {
             // According to normal logic, no exceptions will be thrown,
             // but in order to avoid bugs affecting the original logic, all exceptions are caught
@@ -6741,8 +6741,9 @@ public class Env {
                 versionTime,
                 isForceDropOld);
         editLog.logReplaceTempPartition(info);
-        LOG.info("finished to replace partitions {} with temp partitions {} from table: {}", clause.getPartitionNames(),
-                clause.getTempPartitionNames(), olapTable.getName());
+        LOG.info("finished to replace partitions {} with temp partitions {} from table: {}",
+                replacePartitionOp.getPartitionNames(),
+                replacePartitionOp.getTempPartitionNames(), olapTable.getName());
     }
 
     public void replayReplaceTempPartition(ReplacePartitionOperationLog replaceTempPartitionLog)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java b/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
index 390ce3aacbc..88a812bdc90 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
@@ -17,9 +17,7 @@
 
 package org.apache.doris.clone;
 
-import org.apache.doris.analysis.AddPartitionClause;
 import org.apache.doris.analysis.DistributionDesc;
-import org.apache.doris.analysis.DropPartitionClause;
 import org.apache.doris.analysis.HashDistributionDesc;
 import org.apache.doris.analysis.PartitionKeyDesc;
 import org.apache.doris.analysis.PartitionValue;
@@ -56,6 +54,8 @@ import org.apache.doris.common.util.RangeUtils;
 import org.apache.doris.common.util.TimeUtils;
 import org.apache.doris.datasource.InternalCatalog;
 import org.apache.doris.meta.MetaContext;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionOp;
 import org.apache.doris.nereids.util.DateUtils;
 import org.apache.doris.persist.PartitionPersistInfo;
 import org.apache.doris.thrift.TStorageMedium;
@@ -266,9 +266,10 @@ public class DynamicPartitionScheduler extends MasterDaemon {
         return Pair.of(bucketsNum, previousPartitionBucketsNum);
     }
 
-    private ArrayList<AddPartitionClause> getAddPartitionClause(Database db, OlapTable olapTable,
-            Column partitionColumn, String partitionFormat, boolean executeFirstTime) throws DdlException {
-        ArrayList<AddPartitionClause> addPartitionClauses = new ArrayList<>();
+    private ArrayList<AddPartitionOp> getAddPartitionOp(Database db, OlapTable olapTable,
+                                                            Column partitionColumn, String partitionFormat,
+                                                            boolean executeFirstTime) throws DdlException {
+        ArrayList<AddPartitionOp> addPartitionOps = new ArrayList<>();
         DynamicPartitionProperty dynamicPartitionProperty = olapTable.getTableProperty().getDynamicPartitionProperty();
         RangePartitionInfo rangePartitionInfo = (RangePartitionInfo) olapTable.getPartitionInfo();
         ZonedDateTime now = ZonedDateTime.now(dynamicPartitionProperty.getTimeZone().toZoneId());
@@ -278,7 +279,7 @@ public class DynamicPartitionScheduler extends MasterDaemon {
         // When enable create_history_partition, will check the valid value from start and history_partition_num.
         if (createHistoryPartition) {
             idx = DynamicPartitionUtil.getRealStart(dynamicPartitionProperty.getStart(),
-                    dynamicPartitionProperty.getHistoryPartitionNum());
+                dynamicPartitionProperty.getHistoryPartitionNum());
         } else {
             idx = 0;
         }
@@ -314,7 +315,7 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                         db.getFullName(), olapTable.getName(), idx, e);
                 if (executeFirstTime) {
                     throw new DdlException("maybe dynamic_partition.start is too small, error: "
-                            + e.getMessage());
+                        + e.getMessage());
                 }
                 continue;
             }
@@ -392,9 +393,10 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                 distributionDesc = new RandomDistributionDesc(bucketsNum);
             }
             // add partition according to partition desc and distribution desc
-            addPartitionClauses.add(new AddPartitionClause(rangePartitionDesc, distributionDesc, null, false));
+            addPartitionOps.add(new AddPartitionOp(rangePartitionDesc.translateToPartitionDefinition(),
+                    distributionDesc.toDistributionDescriptor(), null, false));
         }
-        return addPartitionClauses;
+        return addPartitionOps;
     }
 
     public static int checkAndFixAutoBucketCalcNumIsValid(int currentPartitionNumBuckets,
@@ -500,13 +502,14 @@ public class DynamicPartitionScheduler extends MasterDaemon {
      * 1. get the range of [start, 0) as a reserved range.
      * 2. get DropPartitionClause of partitions which range are before this reserved range.
      */
-    private ArrayList<DropPartitionClause> getDropPartitionClauseForDynamic(Database db, OlapTable olapTable,
-            Column partitionColumn, String partitionFormat) throws DdlException {
-        ArrayList<DropPartitionClause> dropPartitionClauses = new ArrayList<>();
+    private ArrayList<DropPartitionOp> getDropPartitionOpForDynamic(Database db, OlapTable olapTable,
+                                                                    Column partitionColumn, String partitionFormat)
+            throws DdlException {
+        ArrayList<DropPartitionOp> dropPartitionOps = new ArrayList<>();
         DynamicPartitionProperty dynamicPartitionProperty = olapTable.getTableProperty().getDynamicPartitionProperty();
         if (dynamicPartitionProperty.getStart() == DynamicPartitionProperty.MIN_START_OFFSET) {
             // not set start offset, so not drop any partition
-            return dropPartitionClauses;
+            return dropPartitionOps;
         }
 
         // drop partition only considering start, not considering history_partition_num.
@@ -529,7 +532,7 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                     Collections.singletonList(partitionColumn));
             // if start offset very small, then lowerBound may be very large, such as '6031-07-01 00:00:00'
             if (lowerBound.compareTo(limitBound) >= 0) {
-                return dropPartitionClauses;
+                return dropPartitionOps;
             }
             reservePartitionKeyRange = Range.atLeast(lowerBound);
             reservedHistoryPartitionKeyRangeList.add(reservePartitionKeyRange);
@@ -542,7 +545,7 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                     db.getFullName(), olapTable.getName(), hint, e);
             recordDropPartitionFailedMsg(db.getFullName(), olapTable.getName(), hint + ", error: " + e.getMessage(),
                     olapTable.getId());
-            return dropPartitionClauses;
+            return dropPartitionOps;
         }
 
         String reservedHistoryPeriods = dynamicPartitionProperty.getReservedHistoryPeriods();
@@ -561,9 +564,9 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                             lowerBorderOfReservedHistory, upperBorderOfReservedHistory);
                     reservedHistoryPartitionKeyRangeList.add(reservedHistoryPartitionKeyRange);
                 } catch (IllegalArgumentException e) {
-                    return dropPartitionClauses;
+                    return dropPartitionOps;
                 } catch (org.apache.doris.common.AnalysisException
-                        | org.apache.doris.nereids.exceptions.AnalysisException e) {
+                         | org.apache.doris.nereids.exceptions.AnalysisException e) {
                     throw new DdlException(e.getMessage());
                 }
             }
@@ -589,18 +592,18 @@ public class DynamicPartitionScheduler extends MasterDaemon {
             // catalog recycle bin. This is for safe reason.
             if (!isContaineds.get(dropPartitionId)) {
                 String dropPartitionName = olapTable.getPartition(dropPartitionId).getName();
-                dropPartitionClauses.add(new DropPartitionClause(false, dropPartitionName, false, false));
+                dropPartitionOps.add(new DropPartitionOp(false, dropPartitionName, false, false));
             }
         }
-        return dropPartitionClauses;
+        return dropPartitionOps;
     }
 
     /**
      * Get drop partition clauses for AUTO PARTITION tables based on partition.retention_count
      */
-    private ArrayList<DropPartitionClause> getDropPartitionClauseForAutoPartition(Database db, OlapTable olapTable)
+    private ArrayList<DropPartitionOp> getDropPartitionOpForAutoPartition(Database db, OlapTable olapTable)
             throws DdlException {
-        ArrayList<DropPartitionClause> dropPartitionClauses = new ArrayList<>();
+        ArrayList<DropPartitionOp> dropPartitionOps = new ArrayList<>();
 
         // when create/modify table, we already checked retentionCount validity.
         // only restrict history partitions with this value. not drop any future partition.
@@ -649,10 +652,10 @@ public class DynamicPartitionScheduler extends MasterDaemon {
             String dropPartitionName = olapTable.getPartition(dropPartitionId).getName();
             // Do not drop the partition "by force", or the partition will be dropped directly instead of being in
             // catalog recycle bin. This is for safe reason.
-            dropPartitionClauses.add(new DropPartitionClause(false, dropPartitionName, false, false));
+            dropPartitionOps.add(new DropPartitionOp(false, dropPartitionName, false, false));
         }
 
-        return dropPartitionClauses;
+        return dropPartitionOps;
     }
 
     // make public just for fe ut
@@ -669,8 +672,8 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                 continue;
             }
 
-            ArrayList<AddPartitionClause> addPartitionClauses = new ArrayList<>();
-            ArrayList<DropPartitionClause> dropPartitionClauses = new ArrayList<>();
+            ArrayList<AddPartitionOp> addPartitionOps = new ArrayList<>();
+            ArrayList<DropPartitionOp> dropPartitionOps = new ArrayList<>();
             String tableName = null;
             boolean skipAddPartition = false;
             OlapTable olapTable;
@@ -723,16 +726,16 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                 }
 
                 if (!skipAddPartition) {
-                    addPartitionClauses = getAddPartitionClause(db, olapTable, partitionColumn, partitionFormat,
+                    addPartitionOps = getAddPartitionOp(db, olapTable, partitionColumn, partitionFormat,
                             executeFirstTime);
                 }
                 clearDropPartitionFailedMsg(olapTable.getId());
                 if (olapTable.getPartitionRetentionCount() > 0) {
                     // Handle AUTO PARTITION cleanup based on partition.retention_count
-                    dropPartitionClauses = getDropPartitionClauseForAutoPartition(db, olapTable);
+                    dropPartitionOps = getDropPartitionOpForAutoPartition(db, olapTable);
                 } else {
                     // Handle dynamic partition cleanup
-                    dropPartitionClauses = getDropPartitionClauseForDynamic(db, olapTable, partitionColumn,
+                    dropPartitionOps = getDropPartitionOpForDynamic(db, olapTable, partitionColumn,
                             partitionFormat);
                 }
                 tableName = olapTable.getName();
@@ -746,12 +749,12 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                 olapTable.readUnlock();
             }
 
-            for (DropPartitionClause dropPartitionClause : dropPartitionClauses) {
+            for (DropPartitionOp dropPartitionOp : dropPartitionOps) {
                 if (!olapTable.writeLockIfExist()) {
                     continue;
                 }
                 try {
-                    Env.getCurrentEnv().dropPartition(db, olapTable, dropPartitionClause);
+                    Env.getCurrentEnv().dropPartition(db, olapTable, dropPartitionOp);
                 } catch (Exception e) {
                     recordDropPartitionFailedMsg(db.getFullName(), tableName, e.getMessage(), olapTable.getId());
                     LOG.warn("db [{}-{}], table [{}-{}]'s dynamic partition has error",
@@ -768,11 +771,11 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                 // get partitionIds and indexIds
                 List<Long> indexIds = new ArrayList<>(olapTable.getCopiedIndexIdToMeta().keySet());
                 List<Long> generatedPartitionIds = new ArrayList<>();
-                cloudBatchBeforeCreatePartitions(executeFirstTime, addPartitionClauses, olapTable, indexIds,
+                cloudBatchBeforeCreatePartitions(executeFirstTime, addPartitionOps, olapTable, indexIds,
                         db, tableName, generatedPartitionIds);
 
                 List<PartitionPersistInfo> partsInfo = new ArrayList<>();
-                for (int i = 0; i < addPartitionClauses.size(); i++) {
+                for (int i = 0; i < addPartitionOps.size(); i++) {
                     try {
                         boolean needWriteEditLog = true;
                         // ATTN: !executeFirstTime, needWriteEditLog
@@ -781,7 +784,7 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                             needWriteEditLog = !executeFirstTime;
                         }
                         PartitionPersistInfo info =
-                                Env.getCurrentEnv().addPartition(db, tableName, addPartitionClauses.get(i),
+                                Env.getCurrentEnv().addPartition(db, tableName, addPartitionOps.get(i),
                                     executeFirstTime,
                                     executeFirstTime && Config.isCloudMode() ? generatedPartitionIds.get(i) : 0,
                                     needWriteEditLog);
@@ -800,10 +803,10 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                     }
                 }
                 cloudBatchAfterCreatePartitions(executeFirstTime, partsInfo,
-                        addPartitionClauses, db, olapTable, indexIds, tableName);
+                        addPartitionOps, db, olapTable, indexIds, tableName);
 
                 // ATTN: Breaking up dynamic partition table scheduling, consuming peak CPU consumption
-                if (!executeFirstTime && !addPartitionClauses.isEmpty()
+                if (!executeFirstTime && !addPartitionOps.isEmpty()
                         && Config.dynamic_partition_step_interval_ms > 0) {
                     long sleep = Config.dynamic_partition_step_interval_ms;
                     if (sleep > 1800 * 1000) {
@@ -820,7 +823,7 @@ public class DynamicPartitionScheduler extends MasterDaemon {
     }
 
     private void cloudBatchAfterCreatePartitions(boolean executeFirstTime, List<PartitionPersistInfo> partsInfo,
-                                                       ArrayList<AddPartitionClause> addPartitionClauses, Database db,
+                                                       ArrayList<AddPartitionOp> addPartitionOps, Database db,
                                                        OlapTable olapTable, List<Long> indexIds,
                                                        String tableName) throws DdlException {
         if (Config.isNotCloudMode()) {
@@ -828,8 +831,8 @@ public class DynamicPartitionScheduler extends MasterDaemon {
         }
         List<Long> succeedPartitionIds = partsInfo.stream().map(partitionPersistInfo
                 -> partitionPersistInfo.getPartition().getId()).collect(Collectors.toList());
-        if (!executeFirstTime || addPartitionClauses.isEmpty()) {
-            LOG.info("cloud commit rpc in batch, {}-{}", !executeFirstTime, addPartitionClauses.size());
+        if (!executeFirstTime || addPartitionOps.isEmpty()) {
+            LOG.info("cloud commit rpc in batch, {}-{}", !executeFirstTime, addPartitionOps.size());
             return;
         }
         try {
@@ -875,18 +878,18 @@ public class DynamicPartitionScheduler extends MasterDaemon {
     }
 
     private void cloudBatchBeforeCreatePartitions(boolean executeFirstTime,
-                                                  ArrayList<AddPartitionClause> addPartitionClauses,
+                                                  ArrayList<AddPartitionOp> addPartitionOps,
                                                   OlapTable olapTable, List<Long> indexIds, Database db,
                                                   String tableName, List<Long> generatedPartitionIds)
             throws DdlException {
         if (Config.isNotCloudMode()) {
             return;
         }
-        if (!executeFirstTime || addPartitionClauses.isEmpty()) {
-            LOG.info("cloud prepare rpc in batch, {}-{}", !executeFirstTime, addPartitionClauses.size());
+        if (!executeFirstTime || addPartitionOps.isEmpty()) {
+            LOG.info("cloud prepare rpc in batch, {}-{}", !executeFirstTime, addPartitionOps.size());
             return;
         }
-        AddPartitionClause addPartitionClause = addPartitionClauses.get(0);
+        AddPartitionOp addPartitionClause = addPartitionOps.get(0);
         DistributionDesc distributionDesc = addPartitionClause.getDistributionDesc();
         try {
             DistributionInfo distributionInfo = distributionDesc
@@ -896,7 +899,7 @@ public class DynamicPartitionScheduler extends MasterDaemon {
                     .toDistributionDesc().toDistributionInfo(olapTable.getBaseSchema());
             }
             long allPartitionBufferSize = 0;
-            for (int i = 0; i < addPartitionClauses.size(); i++) {
+            for (int i = 0; i < addPartitionOps.size(); i++) {
                 long bufferSize = InternalCatalog.checkAndGetBufferSize(indexIds.size(),
                         distributionInfo.getBucketNum(),
                         addPartitionClause.getSingeRangePartitionDesc()
@@ -906,7 +909,7 @@ public class DynamicPartitionScheduler extends MasterDaemon {
             }
             MetaIdGenerator.IdGeneratorBuffer idGeneratorBuffer = Env.getCurrentEnv()
                     .getIdGeneratorBuffer(allPartitionBufferSize);
-            addPartitionClauses.forEach(p -> generatedPartitionIds.add(idGeneratorBuffer.getNextId()));
+            addPartitionOps.forEach(p -> generatedPartitionIds.add(idGeneratorBuffer.getNextId()));
             // executeFirstTime true
             Env.getCurrentInternalCatalog().beforeCreatePartitions(db.getId(), olapTable.getId(),
                     generatedPartitionIds, indexIds, true);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/IdGeneratorUtil.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/IdGeneratorUtil.java
index 2aa7086b0ea..22a7d958108 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/IdGeneratorUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/IdGeneratorUtil.java
@@ -36,7 +36,7 @@ public class IdGeneratorUtil {
         long bufferSize = 1;
         long partitionNum = createTableInfo.getPartitionDesc() == null ? 1 :
                 createTableInfo.getPartitionDesc().getSinglePartitionDescs().size();
-        long indexNum = createTableInfo.getRollupAlterClauseList().size() + 1;
+        long indexNum = createTableInfo.getAddRollupOps().size() + 1;
         long bucketNum = createTableInfo.getDistributionDesc().toDistributionInfo(createTableInfo.getColumns())
                 .getBucketNum();
         bufferSize = bufferSize + partitionNum + indexNum;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
index 53aada4fb46..7ffff48608d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
@@ -18,14 +18,8 @@
 package org.apache.doris.datasource;
 
 import org.apache.doris.alter.QuotaType;
-import org.apache.doris.analysis.AddPartitionClause;
-import org.apache.doris.analysis.AddPartitionLikeClause;
-import org.apache.doris.analysis.AddRollupClause;
-import org.apache.doris.analysis.AlterClause;
-import org.apache.doris.analysis.AlterMultiPartitionClause;
 import org.apache.doris.analysis.DataSortInfo;
 import org.apache.doris.analysis.DistributionDesc;
-import org.apache.doris.analysis.DropPartitionClause;
 import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.KeysDesc;
 import org.apache.doris.analysis.MultiPartitionDesc;
@@ -121,7 +115,13 @@ import org.apache.doris.mtmv.BaseTableInfo;
 import org.apache.doris.mtmv.MTMVUtil;
 import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.nereids.trees.plans.commands.DropCatalogRecycleBinCommand.IdType;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionLikeOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AddRollupOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterMultiPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
 import org.apache.doris.nereids.trees.plans.commands.info.CreateTableInfo;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionOp;
 import org.apache.doris.persist.AlterDatabasePropertyInfo;
 import org.apache.doris.persist.AutoIncrementIdUpdateLog;
 import org.apache.doris.persist.ColocatePersistInfo;
@@ -1309,7 +1309,7 @@ public class InternalCatalog implements CatalogIf<Database> {
         }
     }
 
-    public void addPartitionLike(Database db, String tableName, AddPartitionLikeClause addPartitionLikeClause)
+    public void addPartitionLike(Database db, String tableName, AddPartitionLikeOp addPartitionLikeOp)
             throws DdlException {
         try {
             Table table = db.getTableOrDdlException(tableName);
@@ -1319,44 +1319,45 @@ public class InternalCatalog implements CatalogIf<Database> {
             }
 
             // Lock the table to prevent other SQL from performing write operation during table structure modification
-            AddPartitionClause clause = null;
+            AddPartitionOp addPartitionOp = null;
             table.readLock();
             try {
-                String partitionName = addPartitionLikeClause.getPartitionName();
-                String existedName = addPartitionLikeClause.getExistedPartitionName();
+                String partitionName = addPartitionLikeOp.getPartitionName();
+                String existedName = addPartitionLikeOp.getExistedPartitionName();
                 OlapTable olapTable = (OlapTable) table;
                 Partition part = olapTable.getPartition(existedName);
                 if (part == null) {
                     throw new DdlException("Failed to ADD PARTITION" + partitionName + " LIKE "
-                            + existedName + ". Reason: " + "partition " + existedName + "not exist");
+                        + existedName + ". Reason: " + "partition " + existedName + "not exist");
                 }
                 PartitionInfo partitionInfo = olapTable.getPartitionInfo();
                 SinglePartitionDesc newPartitionDesc;
                 if (partitionInfo instanceof SinglePartitionInfo) {
                     newPartitionDesc = new SinglePartitionDesc(false, partitionName,
-                            PartitionKeyDesc.DUMMY_KEY_DESC, Maps.newHashMap());
+                        PartitionKeyDesc.DUMMY_KEY_DESC, Maps.newHashMap());
                 } else {
                     PartitionDesc partitionDesc = partitionInfo.toPartitionDesc((OlapTable) table);
                     SinglePartitionDesc oldPartitionDesc = partitionDesc.getSinglePartitionDescByName(existedName);
                     if (oldPartitionDesc == null) {
                         throw new DdlException("Failed to ADD PARTITION" + partitionName + " LIKE "
-                                + existedName + ". Reason: " + "partition " + existedName + "desc not exist");
+                            + existedName + ". Reason: " + "partition " + existedName + "desc not exist");
                     }
                     newPartitionDesc = new SinglePartitionDesc(false, partitionName,
-                            oldPartitionDesc.getPartitionKeyDesc(), oldPartitionDesc.getProperties());
+                        oldPartitionDesc.getPartitionKeyDesc(), oldPartitionDesc.getProperties());
                 }
                 DistributionDesc distributionDesc = part.getDistributionInfo().toDistributionDesc();
                 Map<String, String> properties = newPartitionDesc.getProperties();
-                clause = new AddPartitionClause(newPartitionDesc, distributionDesc,
-                        properties, addPartitionLikeClause.getIsTempPartition());
+                addPartitionOp = new AddPartitionOp(newPartitionDesc,
+                    distributionDesc.toDistributionDescriptor(),
+                    properties, addPartitionLikeOp.getTempPartition());
             } finally {
                 table.readUnlock();
             }
-            addPartition(db, tableName, clause, false, 0, true);
+            addPartition(db, tableName, addPartitionOp, false, 0, true);
 
         } catch (UserException e) {
-            throw new DdlException("Failed to ADD PARTITION " + addPartitionLikeClause.getPartitionName()
-                    + " LIKE " + addPartitionLikeClause.getExistedPartitionName() + ". Reason: " + e.getMessage());
+            throw new DdlException("Failed to ADD PARTITION " + addPartitionLikeOp.getPartitionName()
+                + " LIKE " + addPartitionLikeOp.getExistedPartitionName() + ". Reason: " + e.getMessage());
         }
     }
 
@@ -1441,7 +1442,7 @@ public class InternalCatalog implements CatalogIf<Database> {
         }
     }
 
-    public PartitionPersistInfo addPartition(Database db, String tableName, AddPartitionClause addPartitionClause,
+    public PartitionPersistInfo addPartition(Database db, String tableName, AddPartitionOp addPartitionOp,
                                              boolean isCreateTable, long generatedPartitionId,
                                              boolean writeEditLog) throws DdlException {
         // in cloud mode, isCreateTable == true, create dynamic partition use, so partitionId must have been generated.
@@ -1450,9 +1451,9 @@ public class InternalCatalog implements CatalogIf<Database> {
                 && (isCreateTable && generatedPartitionId == 0) || (!isCreateTable && generatedPartitionId != 0)) {
             throw new DdlException("not impossible");
         }
-        SinglePartitionDesc singlePartitionDesc = addPartitionClause.getSingeRangePartitionDesc();
-        DistributionDesc distributionDesc = addPartitionClause.getDistributionDesc();
-        boolean isTempPartition = addPartitionClause.isTempPartition();
+        SinglePartitionDesc singlePartitionDesc = addPartitionOp.getSingeRangePartitionDesc();
+        DistributionDesc distributionDesc = addPartitionOp.getDistributionDesc();
+        boolean isTempPartition = addPartitionOp.isTempPartition();
 
         DistributionInfo distributionInfo;
         Map<Long, MaterializedIndexMeta> indexIdToMeta;
@@ -1501,8 +1502,8 @@ public class InternalCatalog implements CatalogIf<Database> {
              * And JCUP choose to bind to AddPartitionClause, so we should add properties of AddPartitionClause to
              * SinglePartitionDesc's properties here.
              */
-            if (null != addPartitionClause.getProperties()) {
-                properties.putAll(addPartitionClause.getProperties());
+            if (null != addPartitionOp.getProperties()) {
+                properties.putAll(addPartitionOp.getProperties());
             }
 
             // partition properties should inherit table properties
@@ -1819,21 +1820,22 @@ public class InternalCatalog implements CatalogIf<Database> {
         }
     }
 
-    public void addMultiPartitions(Database db, String tableName, AlterMultiPartitionClause multiPartitionClause)
+    public void addMultiPartitions(Database db, String tableName, AlterMultiPartitionOp multiPartitionOp)
             throws DdlException {
         List<SinglePartitionDesc> singlePartitionDescs;
         try {
-            MultiPartitionDesc multiPartitionDesc = new MultiPartitionDesc(multiPartitionClause.getPartitionKeyDesc(),
-                    multiPartitionClause.getProperties());
+            MultiPartitionDesc multiPartitionDesc = new MultiPartitionDesc(multiPartitionOp.getPartitionKeyDesc(),
+                    multiPartitionOp.getProperties());
             singlePartitionDescs = multiPartitionDesc.getSinglePartitionDescList();
         } catch (AnalysisException e) {
             throw new DdlException("Failed to analyze multi partition clause: " + e.getMessage());
         }
 
         for (SinglePartitionDesc singlePartitionDesc : singlePartitionDescs) {
-            AddPartitionClause addPartitionClause = new AddPartitionClause(singlePartitionDesc, null,
-                    multiPartitionClause.getProperties(), false);
-            addPartition(db, tableName, addPartitionClause, false, 0, true);
+            AddPartitionOp addPartitionOp = new AddPartitionOp(
+                    singlePartitionDesc.translateToPartitionDefinition(), null,
+                    multiPartitionOp.getProperties(), false);
+            addPartition(db, tableName, addPartitionOp, false, 0, true);
         }
     }
 
@@ -1881,16 +1883,16 @@ public class InternalCatalog implements CatalogIf<Database> {
         }
     }
 
-    public void dropPartition(Database db, OlapTable olapTable, DropPartitionClause clause) throws DdlException {
+    public void dropPartition(Database db, OlapTable olapTable, DropPartitionOp dropPartitionOp) throws DdlException {
         Preconditions.checkArgument(olapTable.isWriteLockHeldByCurrentThread());
 
-        String partitionName = clause.getPartitionName();
-        boolean isTempPartition = clause.isTempPartition();
-        boolean isForceDrop = clause.isForceDrop();
+        String partitionName = dropPartitionOp.getPartitionName();
+        boolean isTempPartition = dropPartitionOp.isTempPartition();
+        boolean isForceDrop = dropPartitionOp.isForceDrop();
 
         olapTable.checkNormalStateForAlter();
         if (!olapTable.checkPartitionNameExist(partitionName, isTempPartition)) {
-            if (clause.isSetIfExists()) {
+            if (dropPartitionOp.isSetIfExists()) {
                 LOG.info("drop partition[{}] which does not exist", partitionName);
                 return;
             } else {
@@ -1907,12 +1909,12 @@ public class InternalCatalog implements CatalogIf<Database> {
         if (!isTempPartition && !isForceDrop) {
             Partition partition = olapTable.getPartition(partitionName);
             if (partition != null && Env.getCurrentGlobalTransactionMgr()
-                        .existCommittedTxns(db.getId(), olapTable.getId(), partition.getId())) {
+                    .existCommittedTxns(db.getId(), olapTable.getId(), partition.getId())) {
                 throw new DdlException(
-                        "There are still some transactions in the COMMITTED state waiting to be completed."
-                                + " The partition [" + partitionName
-                                + "] cannot be dropped. If you want to forcibly drop(cannot be recovered),"
-                                + " please use \"DROP partition FORCE\".");
+                    "There are still some transactions in the COMMITTED state waiting to be completed."
+                        + " The partition [" + partitionName
+                        + "] cannot be dropped. If you want to forcibly drop(cannot be recovered),"
+                        + " please use \"DROP partition FORCE\".");
             }
         }
 
@@ -2814,30 +2816,30 @@ public class InternalCatalog implements CatalogIf<Database> {
         olapTable.setIndexMeta(baseIndexId, tableName, baseSchema, schemaVersion, schemaHash, shortKeyColumnCount,
                 baseIndexStorageType, keysType, olapTable.getIndexes());
 
-        for (AlterClause alterClause : createTableInfo.getRollupAlterClauseList()) {
+        for (AlterOp alterOp : createTableInfo.getAddRollupOps()) {
             if (olapTable.isDuplicateWithoutKey()) {
                 throw new DdlException("Duplicate table without keys do not support add rollup!");
             }
-            AddRollupClause addRollupClause = (AddRollupClause) alterClause;
+            AddRollupOp addRollupOp = (AddRollupOp) alterOp;
 
             Long baseRollupIndex = olapTable.getIndexIdByName(tableName);
 
             // get storage type for rollup index
             TStorageType rollupIndexStorageType = null;
             try {
-                rollupIndexStorageType = PropertyAnalyzer.analyzeStorageType(addRollupClause.getProperties());
+                rollupIndexStorageType = PropertyAnalyzer.analyzeStorageType(addRollupOp.getProperties());
             } catch (AnalysisException e) {
                 throw new DdlException(e.getMessage());
             }
             Preconditions.checkNotNull(rollupIndexStorageType);
             // set rollup index meta to olap table
             List<Column> rollupColumns = Env.getCurrentEnv().getMaterializedViewHandler()
-                    .checkAndPrepareMaterializedView(addRollupClause, olapTable, baseRollupIndex, false);
-            short rollupShortKeyColumnCount = Env.calcShortKeyColumnCount(rollupColumns, alterClause.getProperties(),
+                    .checkAndPrepareMaterializedView(addRollupOp, olapTable, baseRollupIndex, false);
+            short rollupShortKeyColumnCount = Env.calcShortKeyColumnCount(rollupColumns, alterOp.getProperties(),
                     true/*isKeysRequired*/);
             int rollupSchemaHash = Util.generateSchemaHash();
             long rollupIndexId = idGeneratorBuffer.getNextId();
-            olapTable.setIndexMeta(rollupIndexId, addRollupClause.getRollupName(), rollupColumns, schemaVersion,
+            olapTable.setIndexMeta(rollupIndexId, addRollupOp.getRollupName(), rollupColumns, schemaVersion,
                     rollupSchemaHash, rollupShortKeyColumnCount, rollupIndexStorageType, keysType);
         }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergExternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergExternalCatalog.java
index 02d24cc0146..7d386b9a5a1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergExternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergExternalCatalog.java
@@ -17,9 +17,6 @@
 
 package org.apache.doris.datasource.iceberg;
 
-import org.apache.doris.analysis.AddPartitionFieldClause;
-import org.apache.doris.analysis.DropPartitionFieldClause;
-import org.apache.doris.analysis.ReplacePartitionFieldClause;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.ThreadPoolManager;
@@ -30,6 +27,9 @@ import org.apache.doris.datasource.InitCatalogLog;
 import org.apache.doris.datasource.SessionContext;
 import org.apache.doris.datasource.operations.ExternalMetadataOperations;
 import org.apache.doris.datasource.property.metastore.AbstractIcebergProperties;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionFieldOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionFieldOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ReplacePartitionFieldOp;
 import org.apache.doris.transaction.TransactionManagerFactory;
 
 import org.apache.iceberg.catalog.Catalog;
@@ -154,12 +154,12 @@ public abstract class IcebergExternalCatalog extends ExternalCatalog {
     /**
      * Add partition field to Iceberg table for partition evolution
      */
-    public void addPartitionField(IcebergExternalTable table, AddPartitionFieldClause clause) throws UserException {
+    public void addPartitionField(IcebergExternalTable table, AddPartitionFieldOp op) throws UserException {
         makeSureInitialized();
         if (metadataOps == null) {
             throw new UserException("Add partition field operation is not supported for catalog: " + getName());
         }
-        ((IcebergMetadataOps) metadataOps).addPartitionField(table, clause);
+        ((IcebergMetadataOps) metadataOps).addPartitionField(table, op);
         Env.getCurrentEnv().getEditLog()
                 .logRefreshExternalTable(
                         ExternalObjectLog.createForRefreshTable(table.getCatalog().getId(),
@@ -169,12 +169,12 @@ public abstract class IcebergExternalCatalog extends ExternalCatalog {
     /**
      * Drop partition field from Iceberg table for partition evolution
      */
-    public void dropPartitionField(IcebergExternalTable table, DropPartitionFieldClause clause) throws UserException {
+    public void dropPartitionField(IcebergExternalTable table, DropPartitionFieldOp op) throws UserException {
         makeSureInitialized();
         if (metadataOps == null) {
             throw new UserException("Drop partition field operation is not supported for catalog: " + getName());
         }
-        ((IcebergMetadataOps) metadataOps).dropPartitionField(table, clause);
+        ((IcebergMetadataOps) metadataOps).dropPartitionField(table, op);
         Env.getCurrentEnv().getEditLog()
                 .logRefreshExternalTable(
                         ExternalObjectLog.createForRefreshTable(table.getCatalog().getId(),
@@ -185,12 +185,12 @@ public abstract class IcebergExternalCatalog extends ExternalCatalog {
      * Replace partition field in Iceberg table for partition evolution
      */
     public void replacePartitionField(IcebergExternalTable table,
-            ReplacePartitionFieldClause clause) throws UserException {
+            ReplacePartitionFieldOp op) throws UserException {
         makeSureInitialized();
         if (metadataOps == null) {
             throw new UserException("Replace partition field operation is not supported for catalog: " + getName());
         }
-        ((IcebergMetadataOps) metadataOps).replacePartitionField(table, clause);
+        ((IcebergMetadataOps) metadataOps).replacePartitionField(table, op);
         Env.getCurrentEnv().getEditLog()
                 .logRefreshExternalTable(
                         ExternalObjectLog.createForRefreshTable(table.getCatalog().getId(),
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
index 8148579743e..a5f6a70b977 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
@@ -17,10 +17,7 @@
 
 package org.apache.doris.datasource.iceberg;
 
-import org.apache.doris.analysis.AddPartitionFieldClause;
 import org.apache.doris.analysis.ColumnPosition;
-import org.apache.doris.analysis.DropPartitionFieldClause;
-import org.apache.doris.analysis.ReplacePartitionFieldClause;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.StructField;
@@ -38,12 +35,15 @@ import org.apache.doris.datasource.ExternalTable;
 import org.apache.doris.datasource.operations.ExternalMetadataOps;
 import org.apache.doris.datasource.property.metastore.IcebergRestProperties;
 import org.apache.doris.datasource.property.metastore.MetastoreProperties;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionFieldOp;
 import org.apache.doris.nereids.trees.plans.commands.info.BranchOptions;
 import org.apache.doris.nereids.trees.plans.commands.info.CreateOrReplaceBranchInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.CreateOrReplaceTagInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.CreateTableInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.DropBranchInfo;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionFieldOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropTagInfo;
+import org.apache.doris.nereids.trees.plans.commands.info.ReplacePartitionFieldOp;
 import org.apache.doris.nereids.trees.plans.commands.info.TagOptions;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -808,14 +808,14 @@ public class IcebergMetadataOps implements ExternalMetadataOps {
     /**
      * Add partition field to Iceberg table for partition evolution
      */
-    public void addPartitionField(ExternalTable dorisTable, AddPartitionFieldClause clause) throws UserException {
+    public void addPartitionField(ExternalTable dorisTable, AddPartitionFieldOp op) throws UserException {
         Table icebergTable = IcebergUtils.getIcebergTable(dorisTable);
         UpdatePartitionSpec updateSpec = icebergTable.updateSpec();
 
-        String transformName = clause.getTransformName();
-        Integer transformArg = clause.getTransformArg();
-        String columnName = clause.getColumnName();
-        String partitionFieldName = clause.getPartitionFieldName();
+        String transformName = op.getTransformName();
+        Integer transformArg = op.getTransformArg();
+        String columnName = op.getColumnName();
+        String partitionFieldName = op.getPartitionFieldName();
         Term transform = getTransform(transformName, columnName, transformArg);
 
         if (partitionFieldName != null) {
@@ -838,16 +838,16 @@ public class IcebergMetadataOps implements ExternalMetadataOps {
     /**
      * Drop partition field from Iceberg table for partition evolution
      */
-    public void dropPartitionField(ExternalTable dorisTable, DropPartitionFieldClause clause) throws UserException {
+    public void dropPartitionField(ExternalTable dorisTable, DropPartitionFieldOp op) throws UserException {
         Table icebergTable = IcebergUtils.getIcebergTable(dorisTable);
         UpdatePartitionSpec updateSpec = icebergTable.updateSpec();
 
-        if (clause.getPartitionFieldName() != null) {
-            updateSpec.removeField(clause.getPartitionFieldName());
+        if (op.getPartitionFieldName() != null) {
+            updateSpec.removeField(op.getPartitionFieldName());
         } else {
-            String transformName = clause.getTransformName();
-            Integer transformArg = clause.getTransformArg();
-            String columnName = clause.getColumnName();
+            String transformName = op.getTransformName();
+            Integer transformArg = op.getTransformArg();
+            String columnName = op.getColumnName();
             Term transform = getTransform(transformName, columnName, transformArg);
             updateSpec.removeField(transform);
         }
@@ -866,27 +866,27 @@ public class IcebergMetadataOps implements ExternalMetadataOps {
     /**
      * Replace partition field in Iceberg table for partition evolution
      */
-    public void replacePartitionField(ExternalTable dorisTable, ReplacePartitionFieldClause clause)
+    public void replacePartitionField(ExternalTable dorisTable, ReplacePartitionFieldOp op)
             throws UserException {
         Table icebergTable = IcebergUtils.getIcebergTable(dorisTable);
         UpdatePartitionSpec updateSpec = icebergTable.updateSpec();
 
         // remove old partition field
-        if (clause.getOldPartitionFieldName() != null) {
-            updateSpec.removeField(clause.getOldPartitionFieldName());
+        if (op.getOldPartitionFieldName() != null) {
+            updateSpec.removeField(op.getOldPartitionFieldName());
         } else {
-            String oldTransformName = clause.getOldTransformName();
-            Integer oldTransformArg = clause.getOldTransformArg();
-            String oldColumnName = clause.getOldColumnName();
+            String oldTransformName = op.getOldTransformName();
+            Integer oldTransformArg = op.getOldTransformArg();
+            String oldColumnName = op.getOldColumnName();
             Term oldTransform = getTransform(oldTransformName, oldColumnName, oldTransformArg);
             updateSpec.removeField(oldTransform);
         }
 
         // add new partition field
-        String newPartitionFieldName = clause.getNewPartitionFieldName();
-        String newTransformName = clause.getNewTransformName();
-        Integer newTransformArg = clause.getNewTransformArg();
-        String newColumnName = clause.getNewColumnName();
+        String newPartitionFieldName = op.getNewPartitionFieldName();
+        String newTransformName = op.getNewTransformName();
+        Integer newTransformArg = op.getNewTransformArg();
+        String newColumnName = op.getNewColumnName();
         Term newTransform = getTransform(newTransformName, newColumnName, newTransformArg);
 
         if (newPartitionFieldName != null) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/insertoverwrite/InsertOverwriteUtil.java b/fe/fe-core/src/main/java/org/apache/doris/insertoverwrite/InsertOverwriteUtil.java
index 0416da1b90c..8e6dcc9ed19 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/insertoverwrite/InsertOverwriteUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/insertoverwrite/InsertOverwriteUtil.java
@@ -17,9 +17,6 @@
 
 package org.apache.doris.insertoverwrite;
 
-import org.apache.doris.analysis.AddPartitionLikeClause;
-import org.apache.doris.analysis.DropPartitionClause;
-import org.apache.doris.analysis.ReplacePartitionClause;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.OlapTable;
@@ -27,6 +24,9 @@ import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.util.PropertyAnalyzer;
 import org.apache.doris.info.PartitionNamesInfo;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionLikeOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ReplacePartitionOp;
 
 import com.google.common.collect.Maps;
 import org.apache.logging.log4j.LogManager;
@@ -53,7 +53,7 @@ public class InsertOverwriteUtil {
         if (tableIf instanceof OlapTable) {
             for (int i = 0; i < partitionNames.size(); i++) {
                 Env.getCurrentEnv().addPartitionLike((Database) tableIf.getDatabase(), tableIf.getName(),
-                        new AddPartitionLikeClause(tempPartitionNames.get(i), partitionNames.get(i), true));
+                    new AddPartitionLikeOp(tempPartitionNames.get(i), partitionNames.get(i), true));
                 LOG.info("successfully add temp partition [{}] for [{}]", tempPartitionNames.get(i), tableIf.getName());
             }
         }
@@ -81,15 +81,15 @@ public class InsertOverwriteUtil {
                 }
                 Map<String, String> properties = Maps.newHashMap();
                 properties.put(PropertyAnalyzer.PROPERTIES_USE_TEMP_PARTITION_NAME, "false");
-                ReplacePartitionClause replacePartitionClause = new ReplacePartitionClause(
+                ReplacePartitionOp replacePartitionOp = new ReplacePartitionOp(
                         new PartitionNamesInfo(false, partitionNames),
                         new PartitionNamesInfo(true, tempPartitionNames), isForce, properties);
-                if (replacePartitionClause.getTempPartitionNames().isEmpty()) {
+                if (replacePartitionOp.getTempPartitionNames().isEmpty()) {
                     return;
                 }
                 Env.getCurrentEnv()
                         .replaceTempPartition((Database) olapTable.getDatabase(),
-                                (OlapTable) olapTable, replacePartitionClause);
+                                (OlapTable) olapTable, replacePartitionOp);
             } finally {
                 olapTable.writeUnlock();
             }
@@ -140,7 +140,7 @@ public class InsertOverwriteUtil {
                 }
                 Env.getCurrentEnv().dropPartition(
                         (Database) olapTable.getDatabase(), olapTable,
-                        new DropPartitionClause(true, partitionName, true, true));
+                        new DropPartitionOp(true, partitionName, true, true));
                 LOG.info("successfully drop temp partition [{}] for [{}]", partitionName, olapTable.getName());
             }
         } catch (DdlException e) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPartitionUtil.java b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPartitionUtil.java
index 24f382d8fc7..eee02b62a98 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPartitionUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPartitionUtil.java
@@ -17,9 +17,7 @@
 
 package org.apache.doris.mtmv;
 
-import org.apache.doris.analysis.AddPartitionClause;
 import org.apache.doris.analysis.AllPartitionDesc;
-import org.apache.doris.analysis.DropPartitionClause;
 import org.apache.doris.analysis.PartitionKeyDesc;
 import org.apache.doris.analysis.SinglePartitionDesc;
 import org.apache.doris.catalog.Column;
@@ -36,6 +34,8 @@ import org.apache.doris.common.Pair;
 import org.apache.doris.datasource.mvcc.MvccUtil;
 import org.apache.doris.info.TableNameInfo;
 import org.apache.doris.mtmv.MTMVPartitionInfo.MTMVPartitionType;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropPartitionOp;
 import org.apache.doris.rpc.RpcException;
 
 import com.google.common.base.Preconditions;
@@ -378,8 +378,8 @@ public class MTMVPartitionUtil {
             return;
         }
         try {
-            DropPartitionClause dropPartitionClause = new DropPartitionClause(false, partitionName, false, false);
-            Env.getCurrentEnv().dropPartition((Database) mtmv.getDatabase(), mtmv, dropPartitionClause);
+            DropPartitionOp dropPartitionOp = new DropPartitionOp(false, partitionName, false, false);
+            Env.getCurrentEnv().dropPartition((Database) mtmv.getDatabase(), mtmv, dropPartitionOp);
         } finally {
             mtmv.writeUnlock();
         }
@@ -401,8 +401,9 @@ public class MTMVPartitionUtil {
                 generatePartitionName(oldPartitionKeyDesc),
                 oldPartitionKeyDesc, partitionProperties);
 
-        AddPartitionClause addPartitionClause = new AddPartitionClause(singlePartitionDesc,
-                mtmv.getDefaultDistributionInfo().toDistributionDesc(), partitionProperties, false);
+        AddPartitionOp addPartitionClause = new AddPartitionOp(singlePartitionDesc.translateToPartitionDefinition(),
+                mtmv.getDefaultDistributionInfo().toDistributionDesc().toDistributionDescriptor(),
+                partitionProperties, false);
         Env.getCurrentEnv().addPartition((Database) mtmv.getDatabase(), mtmv.getName(), addPartitionClause,
                 false, 0, true);
     }
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 daffc5e05e8..57567295c5c 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
@@ -961,8 +961,8 @@ import org.apache.doris.nereids.trees.plans.commands.info.ModifyColumnCommentOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyColumnOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyDistributionOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyEngineOp;
-import org.apache.doris.nereids.trees.plans.commands.info.ModifyFrontendOrBackendHostNameOp;
-import org.apache.doris.nereids.trees.plans.commands.info.ModifyFrontendOrBackendHostNameOp.ModifyOpType;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyNodeHostNameOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyNodeHostNameOp.ModifyOpType;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyPartitionOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyTableCommentOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyTablePropertiesOp;
@@ -7549,9 +7549,9 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
         String hostName = stripQuotes(ctx.hostName.getText());
         AlterSystemOp alterSystemOp = null;
         if (ctx.FRONTEND() != null) {
-            alterSystemOp = new ModifyFrontendOrBackendHostNameOp(hostPort, hostName, ModifyOpType.Frontend);
+            alterSystemOp = new ModifyNodeHostNameOp(hostPort, hostName, ModifyOpType.Frontend);
         } else if (ctx.BACKEND() != null) {
-            alterSystemOp = new ModifyFrontendOrBackendHostNameOp(hostPort, hostName, ModifyOpType.Backend);
+            alterSystemOp = new ModifyNodeHostNameOp(hostPort, hostName, ModifyOpType.Backend);
         }
         return new AlterSystemCommand(alterSystemOp, PlanType.ALTER_SYSTEM_MODIFY_FRONTEND_OR_BACKEND_HOSTNAME);
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterSystemCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterSystemCommand.java
index 91b3e3ba79b..219b678a317 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterSystemCommand.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterSystemCommand.java
@@ -36,7 +36,7 @@ import org.apache.doris.nereids.trees.plans.commands.info.DropBrokerOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropFollowerOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropObserverOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyBackendOp;
-import org.apache.doris.nereids.trees.plans.commands.info.ModifyFrontendOrBackendHostNameOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyNodeHostNameOp;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.qe.StmtExecutor;
@@ -83,7 +83,7 @@ public class AlterSystemCommand extends AlterCommand {
                 || alterSystemOp instanceof AddBrokerOp
                 || alterSystemOp instanceof DropBrokerOp
                 || alterSystemOp instanceof ModifyBackendOp
-                || alterSystemOp instanceof ModifyFrontendOrBackendHostNameOp
+                || alterSystemOp instanceof ModifyNodeHostNameOp
                 || alterSystemOp instanceof AlterLoadErrorUrlOp)
         );
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterTableCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterTableCommand.java
index 50a54240275..fcd3948503e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterTableCommand.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterTableCommand.java
@@ -17,7 +17,6 @@
 
 package org.apache.doris.nereids.trees.plans.commands;
 
-import org.apache.doris.analysis.AlterTableClause;
 import org.apache.doris.analysis.ColumnPosition;
 import org.apache.doris.analysis.StmtType;
 import org.apache.doris.catalog.AggregateType;
@@ -92,14 +91,8 @@ public class AlterTableCommand extends Command implements ForwardWithSync {
     /**
      * getOps
      */
-    public List<AlterTableClause> getOps() {
-        List<AlterTableClause> alterTableClauses = new ArrayList<>(ops.size());
-        for (AlterTableOp op : ops) {
-            AlterTableClause alter = op.translateToLegacyAlterClause();
-            alter.setTableNameInfo(tbl);
-            alterTableClauses.add(alter);
-        }
-        return alterTableClauses;
+    public List<AlterTableOp> getOps() {
+        return ops;
     }
 
     /**
@@ -242,27 +235,27 @@ public class AlterTableCommand extends Command implements ForwardWithSync {
      */
     private void checkExternalTableOperationAllow(TableIf table) throws UserException {
         List<AlterTableOp> alterTableOps = new ArrayList<>();
-        for (AlterTableOp alterClause : ops) {
-            if (alterClause instanceof RenameTableOp
-                    || alterClause instanceof AddColumnOp
-                    || alterClause instanceof AddColumnsOp
-                    || alterClause instanceof DropColumnOp
-                    || alterClause instanceof RenameColumnOp
-                    || alterClause instanceof ModifyColumnOp
-                    || alterClause instanceof ReorderColumnsOp
-                    || alterClause instanceof ModifyEngineOp
-                    || alterClause instanceof ModifyTablePropertiesOp
-                    || alterClause instanceof CreateOrReplaceBranchOp
-                    || alterClause instanceof CreateOrReplaceTagOp
-                    || alterClause instanceof DropBranchOp
-                    || alterClause instanceof DropTagOp
-                    || alterClause instanceof AddPartitionFieldOp
-                    || alterClause instanceof DropPartitionFieldOp
-                    || alterClause instanceof ReplacePartitionFieldOp) {
-                alterTableOps.add(alterClause);
+        for (AlterTableOp alterTableOp : ops) {
+            if (alterTableOp instanceof RenameTableOp
+                    || alterTableOp instanceof AddColumnOp
+                    || alterTableOp instanceof AddColumnsOp
+                    || alterTableOp instanceof DropColumnOp
+                    || alterTableOp instanceof RenameColumnOp
+                    || alterTableOp instanceof ModifyColumnOp
+                    || alterTableOp instanceof ReorderColumnsOp
+                    || alterTableOp instanceof ModifyEngineOp
+                    || alterTableOp instanceof ModifyTablePropertiesOp
+                    || alterTableOp instanceof CreateOrReplaceBranchOp
+                    || alterTableOp instanceof CreateOrReplaceTagOp
+                    || alterTableOp instanceof DropBranchOp
+                    || alterTableOp instanceof DropTagOp
+                    || alterTableOp instanceof AddPartitionFieldOp
+                    || alterTableOp instanceof DropPartitionFieldOp
+                    || alterTableOp instanceof ReplacePartitionFieldOp) {
+                alterTableOps.add(alterTableOp);
             } else {
                 throw new AnalysisException(table.getType().toString() + " [" + table.getName() + "] "
-                        + "do not support " + alterClause.getOpType().toString() + " clause now");
+                        + "do not support " + alterTableOp.getOpType().toString() + " clause now");
             }
         }
         ops = alterTableOps;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddColumnOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddColumnOp.java
index 00b8fea42ae..a59e3cd7b3d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddColumnOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddColumnOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AddColumnClause;
-import org.apache.doris.analysis.AlterTableClause;
 import org.apache.doris.analysis.ColumnPosition;
 import org.apache.doris.catalog.AggregateType;
 import org.apache.doris.catalog.Column;
@@ -90,11 +88,6 @@ public class AddColumnOp extends AlterTableOp {
         column = columnDef.translateToCatalogStyleForSchemaChange();
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new AddColumnClause(toSql(), column, colPos, rollupName, properties);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return this.properties;
@@ -143,44 +136,47 @@ public class AddColumnOp extends AlterTableOp {
         boolean isEnableMergeOnWrite = false;
         KeysType keysType = KeysType.DUP_KEYS;
         Set<String> clusterKeySet = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER);
-        TableIf table = Env.getCurrentEnv().getCatalogMgr()
-                .getCatalogOrDdlException(tableName.getCtl())
-                .getDbOrDdlException(tableName.getDb())
-                .getTableOrDdlException(tableName.getTbl());
-        if (table instanceof OlapTable) {
-            isOlap = true;
-            olapTable = (OlapTable) table;
-            keysType = olapTable.getKeysType();
-            AggregateType aggregateType = columnDef.getAggType();
-            Long indexId = olapTable.getIndexIdByName(rollupName);
-            if (indexId != null) {
-                MaterializedIndexMeta indexMeta = olapTable.getIndexMetaByIndexId(indexId);
-                if (indexMeta.getDefineStmt() != null) {
-                    throw new AnalysisException("Cannot add column in rollup " + rollupName);
+        if (tableName != null) {
+            TableIf table = Env.getCurrentEnv().getCatalogMgr()
+                    .getCatalogOrDdlException(tableName.getCtl())
+                    .getDbOrDdlException(tableName.getDb())
+                    .getTableOrDdlException(tableName.getTbl());
+            if (table instanceof OlapTable) {
+                isOlap = true;
+                olapTable = (OlapTable) table;
+                keysType = olapTable.getKeysType();
+                AggregateType aggregateType = columnDef.getAggType();
+                Long indexId = olapTable.getIndexIdByName(rollupName);
+                if (indexId != null) {
+                    MaterializedIndexMeta indexMeta = olapTable.getIndexMetaByIndexId(indexId);
+                    if (indexMeta.getDefineStmt() != null) {
+                        throw new AnalysisException("Cannot add column in rollup " + rollupName);
+                    }
                 }
-            }
-            if (keysType == KeysType.AGG_KEYS) {
-                if (aggregateType == null) {
-                    columnDef.setIsKey(true);
-                } else {
-                    if (aggregateType == AggregateType.NONE) {
-                        throw new AnalysisException(
+                if (keysType == KeysType.AGG_KEYS) {
+                    if (aggregateType == null) {
+                        columnDef.setIsKey(true);
+                    } else {
+                        if (aggregateType == AggregateType.NONE) {
+                            throw new AnalysisException(
                                 String.format("can't set NONE as aggregation type on column %s",
-                                        columnDef.getName()));
+                                    columnDef.getName()));
+                        }
                     }
-                }
-            } else if (keysType == KeysType.UNIQUE_KEYS) {
-                if (aggregateType != null && !aggregateType.isReplaceFamily() && columnDef.isVisible()) {
-                    throw new AnalysisException(
+                } else if (keysType == KeysType.UNIQUE_KEYS) {
+                    if (aggregateType != null && !aggregateType.isReplaceFamily() && columnDef.isVisible()) {
+                        throw new AnalysisException(
                             String.format("Can not assign aggregation method on column in Unique data model table: %s",
-                                    columnDef.getName()));
+                                columnDef.getName()));
+                    }
                 }
+                isEnableMergeOnWrite = olapTable.getEnableUniqueKeyMergeOnWrite();
+                clusterKeySet
+                        .addAll(olapTable.getBaseSchema().stream().filter(Column::isClusterKey).map(Column::getName)
+                        .collect(Collectors.toList()));
             }
-            isEnableMergeOnWrite = olapTable.getEnableUniqueKeyMergeOnWrite();
-            clusterKeySet
-                    .addAll(olapTable.getBaseSchema().stream().filter(Column::isClusterKey).map(Column::getName)
-                            .collect(Collectors.toList()));
         }
+
         columnDef.validate(isOlap, keysSet, clusterKeySet, isEnableMergeOnWrite, keysType);
         if (!columnDef.isNullable() && !columnDef.hasDefaultValue()) {
             ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DEFAULT_FOR_FIELD, columnDef.getName());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddColumnsOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddColumnsOp.java
index f04a9338aa9..242a0883a2e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddColumnsOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddColumnsOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AddColumnsClause;
-import org.apache.doris.analysis.AlterTableClause;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.OlapTable;
@@ -99,11 +97,6 @@ public class AddColumnsOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new AddColumnsClause(toSql(), columns, rollupName, properties);
-    }
-
     @Override
     public boolean allowOpMTMV() {
         return false;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionFieldOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionFieldOp.java
index fb05901a00a..95f6c1fc71b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionFieldOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionFieldOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AddPartitionFieldClause;
-import org.apache.doris.analysis.AlterTableClause;
 import org.apache.doris.common.UserException;
 import org.apache.doris.qe.ConnectContext;
 
@@ -67,11 +65,6 @@ public class AddPartitionFieldOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new AddPartitionFieldClause(transformName, transformArg, columnName, partitionFieldName);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return Collections.emptyMap();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyDistributionOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionLikeOp.java
similarity index 59%
copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyDistributionOp.java
copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionLikeOp.java
index ab73f6b7e6b..32c9dd41c41 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyDistributionOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionLikeOp.java
@@ -18,31 +18,30 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ModifyDistributionClause;
 
-import java.util.HashMap;
 import java.util.Map;
 
 /**
- * ModifyDistributionOp
+ * AddPartitionLikeOp
  */
-public class ModifyDistributionOp extends AlterTableOp {
-    private DistributionDescriptor distributionDesc;
+public class AddPartitionLikeOp extends AlterTableOp {
+    private final String partitionName;
+    private final String existedPartitionName;
+    private final Boolean isTempPartition;
 
-    public ModifyDistributionOp(DistributionDescriptor distributionDesc) {
-        super(AlterOpType.MODIFY_DISTRIBUTION);
-        this.distributionDesc = distributionDesc;
+    public AddPartitionLikeOp(String partitionName,
+                                  String existedPartitionName,
+                                  boolean isTempPartition) {
+        super(AlterOpType.ADD_PARTITION);
+        this.partitionName = partitionName;
+        this.existedPartitionName = existedPartitionName;
+        this.isTempPartition = isTempPartition;
         this.needTableStable = false;
     }
 
-    public DistributionDescriptor getDistributionDesc() {
-        return distributionDesc;
-    }
-
     @Override
     public boolean allowOpMTMV() {
-        return true;
+        return false;
     }
 
     @Override
@@ -50,24 +49,29 @@ public class ModifyDistributionOp extends AlterTableOp {
         return false;
     }
 
+    public String getPartitionName() {
+        return partitionName;
+    }
+
+    public String getExistedPartitionName() {
+        return existedPartitionName;
+    }
+
+    public Boolean getTempPartition() {
+        return isTempPartition;
+    }
+
     @Override
     public String toSql() {
         StringBuilder sb = new StringBuilder();
-        sb.append("MODIFY DISTRIBUTION ");
-        if (distributionDesc != null) {
-            sb.append(distributionDesc.toSql());
-        }
+        sb.append("ADD PARTITION ").append(partitionName).append(" LIKE ");
+        sb.append(existedPartitionName);
         return sb.toString();
     }
 
     @Override
     public Map<String, String> getProperties() {
-        return new HashMap<>();
-    }
-
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ModifyDistributionClause(distributionDesc.translateToCatalogStyle());
+        return null;
     }
 
     @Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionOp.java
index bfb1b5cbca3..fb8437fb45b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AddPartitionClause;
-import org.apache.doris.analysis.AlterTableClause;
 import org.apache.doris.analysis.DistributionDesc;
 import org.apache.doris.analysis.SinglePartitionDesc;
 import org.apache.doris.catalog.Column;
@@ -41,7 +39,8 @@ import java.util.Map;
  * AddPartitionOp
  */
 public class AddPartitionOp extends AlterTableOp {
-    private PartitionDefinition partitionDesc;
+    private PartitionDefinition partitionDefinition;
+    private SinglePartitionDesc partitionDesc;
     private DistributionDescriptor distributionDesc;
     private Map<String, String> properties;
     // true if this is to add a temporary partition
@@ -50,11 +49,27 @@ public class AddPartitionOp extends AlterTableOp {
     /**
      * AddPartitionOp
      */
-    public AddPartitionOp(PartitionDefinition partitionDesc,
+    public AddPartitionOp(PartitionDefinition partitionDefinition,
             DistributionDescriptor distributionDesc,
             Map<String, String> properties,
             boolean isTempPartition) {
         super(AlterOpType.ADD_PARTITION);
+        this.partitionDefinition = partitionDefinition;
+        this.distributionDesc = distributionDesc;
+        this.properties = properties;
+        this.isTempPartition = isTempPartition;
+
+        this.needTableStable = false;
+    }
+
+    /**
+     * AddPartitionOp
+     */
+    public AddPartitionOp(SinglePartitionDesc partitionDesc,
+                          DistributionDescriptor distributionDesc,
+                          Map<String, String> properties,
+                          boolean isTempPartition) {
+        super(AlterOpType.ADD_PARTITION);
         this.partitionDesc = partitionDesc;
         this.distributionDesc = distributionDesc;
         this.properties = properties;
@@ -63,21 +78,28 @@ public class AddPartitionOp extends AlterTableOp {
         this.needTableStable = false;
     }
 
-    private SinglePartitionDesc getSingeRangePartitionDesc() {
-        SinglePartitionDesc singlePartitionDesc = (SinglePartitionDesc) partitionDesc.translateToCatalogStyle();
+    /**
+     * getSingeRangePartitionDesc
+     */
+    public SinglePartitionDesc getSingeRangePartitionDesc() {
+        if (partitionDesc != null) {
+            return partitionDesc;
+        }
+
+        SinglePartitionDesc singlePartitionDesc = (SinglePartitionDesc) partitionDefinition.translateToCatalogStyle();
         // TODO fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java#addPartition
         // will call singlePartitionDesc.analyze method, so have to set analyzed to false to let it work
         singlePartitionDesc.setAnalyzed(false);
         return singlePartitionDesc;
     }
 
-    private DistributionDesc getDistributionDesc() {
+    public DistributionDesc getDistributionDesc() {
         return distributionDesc != null ? distributionDesc.translateToCatalogStyle() : null;
     }
 
     @Override
     public void validate(ConnectContext ctx) throws UserException {
-        if (partitionDesc instanceof StepPartition) {
+        if (partitionDefinition instanceof StepPartition) {
             throw new AnalysisException("StepPartition is not supported");
         }
         String ctlName = tableName.getCtl();
@@ -93,14 +115,9 @@ public class AddPartitionOp extends AlterTableOp {
             for (Column col : olapTable.getPartitionColumns()) {
                 partitionTypes.add(DataType.fromCatalogType(col.getType()));
             }
-            partitionDesc.setPartitionTypes(partitionTypes);
+            partitionDefinition.setPartitionTypes(partitionTypes);
         }
-        partitionDesc.validate(properties);
-    }
-
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new AddPartitionClause(getSingeRangePartitionDesc(), getDistributionDesc(), properties, isTempPartition);
+        partitionDefinition.validate(properties);
     }
 
     public boolean isTempPartition() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddRollupOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddRollupOp.java
index eb59237e739..d3abfea5e95 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddRollupOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AddRollupOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AddRollupClause;
-import org.apache.doris.analysis.AlterTableClause;
 import org.apache.doris.common.ErrorCode;
 import org.apache.doris.common.ErrorReport;
 import org.apache.doris.common.FeNameFormat;
@@ -94,11 +92,6 @@ public class AddRollupOp extends AlterTableOp {
         baseRollupName = Strings.emptyToNull(baseRollupName);
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new AddRollupClause(rollupName, columnNames, dupKeys, baseRollupName, properties);
-    }
-
     @Override
     public boolean allowOpMTMV() {
         return true;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMultiPartitionOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMultiPartitionOp.java
index fcb930a8f94..6529a6a8725 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMultiPartitionOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMultiPartitionOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterMultiPartitionClause;
-import org.apache.doris.analysis.AlterTableClause;
 import org.apache.doris.analysis.PartitionKeyDesc;
 import org.apache.doris.analysis.PartitionValue;
 import org.apache.doris.nereids.exceptions.AnalysisException;
@@ -87,8 +85,10 @@ public class AlterMultiPartitionOp extends AlterTableOp {
         return properties;
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
+    /**
+     * getPartitionKeyDesc
+     */
+    public PartitionKeyDesc getPartitionKeyDesc() {
         List<PartitionValue> fromValues = fromExpression.stream()
                 .map(this::toLegacyPartitionValue)
                 .collect(Collectors.toList());
@@ -98,7 +98,7 @@ public class AlterMultiPartitionOp extends AlterTableOp {
         PartitionKeyDesc partitionKeyDesc = (unitString == null
                 ? PartitionKeyDesc.createMultiFixed(fromValues, toValues, unit)
                 : PartitionKeyDesc.createMultiFixed(fromValues, toValues, unit, unitString));
-        return new AlterMultiPartitionClause(partitionKeyDesc, properties, isTempPartition);
+        return partitionKeyDesc;
     }
 
     public boolean isTempPartition() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterOp.java
similarity index 69%
copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java
copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterOp.java
index ad0030f52be..6916215c8c3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterOp.java
@@ -18,18 +18,19 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.common.UserException;
-import org.apache.doris.qe.ConnectContext;
+
+import org.apache.commons.lang3.NotImplementedException;
 
 import java.util.Map;
 
 /**
- * AlterSystemOp
+ * AlterOp
  */
-public abstract class AlterSystemOp {
+public abstract class AlterOp {
+
     protected AlterOpType opType;
 
-    public AlterSystemOp(AlterOpType opType) {
+    public AlterOp(AlterOpType opType) {
         this.opType = opType;
     }
 
@@ -37,18 +38,11 @@ public abstract class AlterSystemOp {
         return opType;
     }
 
-    public boolean allowOpMTMV() {
-        return true;
-    }
-
-    public boolean needChangeMTMVState() {
-        return false;
-    }
-
-    public abstract String toSql();
+    public abstract boolean allowOpMTMV();
 
-    public abstract Map<String, String> getProperties();
+    public abstract boolean needChangeMTMVState();
 
-    public void validate(ConnectContext ctx) throws UserException {
+    public Map<String, String> getProperties() {
+        throw new NotImplementedException("AlterOp.getProperties() is not implemented");
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java
index ad0030f52be..9c185610f7f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java
@@ -26,10 +26,11 @@ import java.util.Map;
 /**
  * AlterSystemOp
  */
-public abstract class AlterSystemOp {
+public abstract class AlterSystemOp extends AlterOp {
     protected AlterOpType opType;
 
     public AlterSystemOp(AlterOpType opType) {
+        super(opType);
         this.opType = opType;
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterTableOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterTableOp.java
index 7fe1dd34acb..0d40df1329d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterTableOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterTableOp.java
@@ -18,7 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
 import org.apache.doris.common.UserException;
 import org.apache.doris.info.TableNameInfo;
 import org.apache.doris.qe.ConnectContext;
@@ -28,7 +27,7 @@ import java.util.Map;
 /**
  * AlterTableOp
  */
-public abstract class AlterTableOp {
+public abstract class AlterTableOp extends AlterOp {
     // if set to true, the corresponding table should be stable before processing this operation on it.
     protected boolean needTableStable = true;
 
@@ -37,6 +36,7 @@ public abstract class AlterTableOp {
     protected TableNameInfo tableName;
 
     public AlterTableOp(AlterOpType opType) {
+        super(opType);
         this.opType = opType;
     }
 
@@ -58,6 +58,4 @@ public abstract class AlterTableOp {
 
     public void validate(ConnectContext ctx) throws UserException {
     }
-
-    public abstract AlterTableClause translateToLegacyAlterClause();
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BuildIndexOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BuildIndexOp.java
index 8d54ba9bd7b..04a980f3b1d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BuildIndexOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/BuildIndexOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.BuildIndexClause;
 import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.Index;
@@ -164,12 +162,6 @@ public class BuildIndexOp extends AlterTableOp {
         this.index = existedIdx.clone();
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        indexDef.getIndexType();
-        return new BuildIndexClause(tableName, indexDef, index, alter);
-    }
-
     @Override
     public boolean allowOpMTMV() {
         return true;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateIndexOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateIndexOp.java
index 2ef13e08819..765dd1875ca 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateIndexOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateIndexOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.CreateIndexClause;
 import org.apache.doris.catalog.Index;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
@@ -83,11 +81,6 @@ public class CreateIndexOp extends AlterTableOp {
         index = indexDef.translateToCatalogStyle();
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new CreateIndexClause(tableName, indexDef, index, alter);
-    }
-
     @Override
     public boolean allowOpMTMV() {
         return true;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateOrReplaceBranchOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateOrReplaceBranchOp.java
index 11258470ebc..bcaf90f7c8e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateOrReplaceBranchOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateOrReplaceBranchOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.CreateOrReplaceBranchClause;
 
 import java.util.Map;
 
@@ -65,8 +63,7 @@ public class CreateOrReplaceBranchOp extends AlterTableOp {
         return null;
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new CreateOrReplaceBranchClause(branchInfo);
+    public CreateOrReplaceBranchInfo getBranchInfo() {
+        return branchInfo;
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateOrReplaceTagOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateOrReplaceTagOp.java
index e56ccf5cafe..c91891712d7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateOrReplaceTagOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateOrReplaceTagOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.CreateOrReplaceTagClause;
 
 import java.util.Map;
 
@@ -61,8 +59,7 @@ public class CreateOrReplaceTagOp extends AlterTableOp {
         return null;
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new CreateOrReplaceTagClause(tagInfo);
+    public CreateOrReplaceTagInfo getTagInfo() {
+        return tagInfo;
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java
index ebc22ecce0c..2fc3d849445 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java
@@ -17,7 +17,6 @@
 
 package org.apache.doris.nereids.trees.plans.commands.info;
 
-import org.apache.doris.analysis.AlterClause;
 import org.apache.doris.analysis.DistributionDesc;
 import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.InvertedIndexUtil;
@@ -1344,12 +1343,12 @@ public class CreateTableInfo {
     }
 
     /**
-     * getRollupAlterClauseList
+     * getAddRollupOps
      */
-    public List<AlterClause> getRollupAlterClauseList() {
-        List<AlterClause> addRollups = Lists.newArrayList();
+    public List<AlterOp> getAddRollupOps() {
+        List<AlterOp> addRollups = Lists.newArrayList();
         if (!rollups.isEmpty()) {
-            addRollups.addAll(rollups.stream().map(RollupDefinition::translateToCatalogStyle)
+            addRollups.addAll(rollups.stream().map(RollupDefinition::translateToAddRollupOp)
                     .collect(Collectors.toList()));
         }
         return addRollups;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropBranchOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropBranchOp.java
index f04b0f34823..6755da41a7e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropBranchOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropBranchOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.DropBranchClause;
 
 import java.util.Map;
 
@@ -57,8 +55,7 @@ public class DropBranchOp extends AlterTableOp {
         return null;
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new DropBranchClause(dropBranchInfo);
+    public DropBranchInfo getDropBranchInfo() {
+        return dropBranchInfo;
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropColumnOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropColumnOp.java
index 74a216d2651..58ec29a8f8a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropColumnOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropColumnOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.DropColumnClause;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.KeysType;
@@ -148,11 +146,6 @@ public class DropColumnOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new DropColumnClause(colName, rollupName, properties);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return this.properties;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropIndexOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropIndexOp.java
index 0c39ce8e53d..30cc6849bb2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropIndexOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropIndexOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.DropIndexClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.info.TableNameInfo;
@@ -77,11 +75,6 @@ public class DropIndexOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new DropIndexClause(indexName, ifExists, tableName, alter);
-    }
-
     @Override
     public boolean allowOpMTMV() {
         return true;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFieldOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFieldOp.java
index b53765f3180..0222fd7bb28 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFieldOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFieldOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.DropPartitionFieldClause;
 import org.apache.doris.common.UserException;
 import org.apache.doris.qe.ConnectContext;
 
@@ -75,11 +73,6 @@ public class DropPartitionFieldOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new DropPartitionFieldClause(partitionFieldName, transformName, transformArg, columnName);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return Collections.emptyMap();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFromIndexOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFromIndexOp.java
index e8d4177abb6..e67d1d9c435 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFromIndexOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFromIndexOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.DropPartitionFromIndexClause;
 import org.apache.doris.common.ErrorCode;
 import org.apache.doris.common.ErrorReport;
 import org.apache.doris.common.UserException;
@@ -80,11 +78,6 @@ public class DropPartitionFromIndexOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new DropPartitionFromIndexClause(ifExists, partitionName, isTempPartition, forceDrop, indexName);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionOp.java
index e81bfb201b2..1ec1e38ec83 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.DropPartitionClause;
 import org.apache.doris.common.ErrorCode;
 import org.apache.doris.common.ErrorReport;
 import org.apache.doris.common.UserException;
@@ -74,11 +72,6 @@ public class DropPartitionOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new DropPartitionClause(ifExists, partitionName, isTempPartition, forceDrop);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropRollupOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropRollupOp.java
index ef74d3bcc2a..0bf94ea4dd2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropRollupOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropRollupOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.DropRollupClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.qe.ConnectContext;
@@ -49,11 +47,6 @@ public class DropRollupOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new DropRollupClause(rollupName, properties);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return this.properties;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropTagOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropTagOp.java
index 535b50974ec..560d50ca14e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropTagOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropTagOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.DropTagClause;
 
 import java.util.Map;
 
@@ -57,8 +55,7 @@ public class DropTagOp extends AlterTableOp {
         return null;
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new DropTagClause(dropTagInfo);
+    public DropTagInfo getDropTagInfo() {
+        return dropTagInfo;
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/EnableFeatureOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/EnableFeatureOp.java
index 0b3e35ace80..f4613b0b07b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/EnableFeatureOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/EnableFeatureOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.EnableFeatureClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.PrintableMap;
@@ -93,11 +91,6 @@ public class EnableFeatureOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new EnableFeatureClause(featureName, properties);
-    }
-
     @Override
     public boolean allowOpMTMV() {
         return true;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyBackendHostNameOp.java
similarity index 56%
copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java
copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyBackendHostNameOp.java
index ad0030f52be..352193c6d4e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyBackendHostNameOp.java
@@ -17,38 +17,19 @@
 
 package org.apache.doris.nereids.trees.plans.commands.info;
 
-import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.common.UserException;
-import org.apache.doris.qe.ConnectContext;
-
-import java.util.Map;
-
 /**
- * AlterSystemOp
+ * ModifyBackendHostNameOp
  */
-public abstract class AlterSystemOp {
-    protected AlterOpType opType;
-
-    public AlterSystemOp(AlterOpType opType) {
-        this.opType = opType;
-    }
-
-    public AlterOpType getOpType() {
-        return opType;
-    }
-
-    public boolean allowOpMTMV() {
-        return true;
-    }
+public class ModifyBackendHostNameOp extends ModifyNodeHostNameOp {
 
-    public boolean needChangeMTMVState() {
-        return false;
+    public ModifyBackendHostNameOp(String hostPort, String newHost, ModifyOpType modifyOpType) {
+        super(hostPort, newHost, modifyOpType);
     }
 
-    public abstract String toSql();
-
-    public abstract Map<String, String> getProperties();
-
-    public void validate(ConnectContext ctx) throws UserException {
+    public ModifyBackendHostNameOp(String hostPort, String newHost, ModifyOpType modifyOpType,
+                                   String host, int port) {
+        super(hostPort, newHost, modifyOpType);
+        this.host = host;
+        this.port = port;
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyBrokerOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyBrokerOp.java
new file mode 100644
index 00000000000..11d463b850d
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyBrokerOp.java
@@ -0,0 +1,113 @@
+// 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.info;
+
+import org.apache.doris.alter.AlterOpType;
+import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.Pair;
+import org.apache.doris.common.UserException;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.system.SystemInfoService;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import com.google.common.collect.Sets;
+import org.apache.commons.lang3.NotImplementedException;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * ModifyBrokerOp
+ */
+public class ModifyBrokerOp extends AlterSystemOp {
+
+    /**
+     * ModifyOp
+     */
+    public enum ModifyOp {
+        OP_ADD,
+        OP_DROP,
+        OP_DROP_ALL
+    }
+
+    protected Set<Pair<String, Integer>> hostPortPairs;
+
+    private final ModifyOp op;
+    private final String brokerName;
+    private final List<String> hostPorts;
+
+    public ModifyBrokerOp(ModifyOp op, String brokerName, List<String> hostPorts) {
+        super(AlterOpType.ALTER_OTHER);
+        this.op = op;
+        this.brokerName = brokerName;
+        this.hostPorts = hostPorts;
+    }
+
+    public ModifyBrokerOp(ModifyOp op, String brokerName,
+                              List<String> hostPorts, Set<Pair<String, Integer>> hostPortPairs) {
+        super(AlterOpType.ALTER_OTHER);
+        this.op = op;
+        this.brokerName = brokerName;
+        this.hostPorts = hostPorts;
+        this.hostPortPairs = hostPortPairs;
+    }
+
+    public ModifyOp getOp() {
+        return op;
+    }
+
+    public String getBrokerName() {
+        return brokerName;
+    }
+
+    public Set<Pair<String, Integer>> getHostPortPairs() {
+        return hostPortPairs;
+    }
+
+    private void validateBrokerName() throws AnalysisException {
+        if (Strings.isNullOrEmpty(brokerName)) {
+            throw new AnalysisException("Broker's name can't be empty.");
+        }
+    }
+
+    @Override
+    public void validate(ConnectContext ctx) throws UserException {
+        validateBrokerName();
+
+        if (op != ModifyOp.OP_DROP_ALL) {
+            hostPortPairs = Sets.newHashSet();
+            for (String hostPort : hostPorts) {
+                Pair<String, Integer> pair = SystemInfoService.validateHostAndPort(hostPort);
+                hostPortPairs.add(pair);
+            }
+            Preconditions.checkState(!hostPortPairs.isEmpty());
+        }
+    }
+
+    @Override
+    public String toSql() {
+        throw new NotImplementedException("toSql not implemented");
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        throw new NotImplementedException("getProperties not implemented");
+    }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyColumnCommentOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyColumnCommentOp.java
index 8553732f8dd..b1496710153 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyColumnCommentOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyColumnCommentOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ModifyColumnCommentClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.qe.ConnectContext;
@@ -62,11 +60,6 @@ public class ModifyColumnCommentOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ModifyColumnCommentClause(colName, comment);
-    }
-
     @Override
     public boolean allowOpMTMV() {
         return false;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyColumnOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyColumnOp.java
index 7a964dcebe4..5f3154886f7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyColumnOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyColumnOp.java
@@ -18,9 +18,7 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
 import org.apache.doris.analysis.ColumnPosition;
-import org.apache.doris.analysis.ModifyColumnClause;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.KeysType;
@@ -171,11 +169,6 @@ public class ModifyColumnOp extends AlterTableOp {
         return columnDef;
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ModifyColumnClause(toSql(), column, colPos, rollupName, properties);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return this.properties;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyDistributionOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyDistributionOp.java
index ab73f6b7e6b..2837dc36aac 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyDistributionOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyDistributionOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ModifyDistributionClause;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -65,11 +63,6 @@ public class ModifyDistributionOp extends AlterTableOp {
         return new HashMap<>();
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ModifyDistributionClause(distributionDesc.translateToCatalogStyle());
-    }
-
     @Override
     public String toString() {
         return toSql();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyEngineOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyEngineOp.java
index 1bbf71952cc..7c55e29d91c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyEngineOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyEngineOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ModifyEngineClause;
 import org.apache.doris.catalog.OdbcTable;
 import org.apache.doris.catalog.Table;
 import org.apache.doris.common.AnalysisException;
@@ -67,11 +65,6 @@ public class ModifyEngineOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ModifyEngineClause(engine, properties);
-    }
-
     @Override
     public boolean allowOpMTMV() {
         return false;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyFrontendHostNameOp.java
similarity index 56%
copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java
copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyFrontendHostNameOp.java
index ad0030f52be..28e8a1011b0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterSystemOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyFrontendHostNameOp.java
@@ -17,38 +17,18 @@
 
 package org.apache.doris.nereids.trees.plans.commands.info;
 
-import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.common.UserException;
-import org.apache.doris.qe.ConnectContext;
-
-import java.util.Map;
-
 /**
- * AlterSystemOp
+ * ModifyFrontendHostNameOp
  */
-public abstract class AlterSystemOp {
-    protected AlterOpType opType;
-
-    public AlterSystemOp(AlterOpType opType) {
-        this.opType = opType;
+public class ModifyFrontendHostNameOp extends ModifyNodeHostNameOp {
+    public ModifyFrontendHostNameOp(String hostPort, String newHost, ModifyOpType modifyOpType) {
+        super(hostPort, newHost, modifyOpType);
     }
 
-    public AlterOpType getOpType() {
-        return opType;
-    }
-
-    public boolean allowOpMTMV() {
-        return true;
-    }
-
-    public boolean needChangeMTMVState() {
-        return false;
-    }
-
-    public abstract String toSql();
-
-    public abstract Map<String, String> getProperties();
-
-    public void validate(ConnectContext ctx) throws UserException {
+    public ModifyFrontendHostNameOp(String hostPort, String newHost, ModifyOpType modifyOpType,
+                                   String host, int port) {
+        super(hostPort, newHost, modifyOpType);
+        this.host = host;
+        this.port = port;
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyFrontendOrBackendHostNameOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyNodeHostNameOp.java
similarity index 90%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyFrontendOrBackendHostNameOp.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyNodeHostNameOp.java
index ed127e06c58..c29572684e5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyFrontendOrBackendHostNameOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyNodeHostNameOp.java
@@ -31,13 +31,13 @@ import java.net.UnknownHostException;
 import java.util.Map;
 
 /**
- * ModifyFrontendOrBackendHostNameOp
+ * ModifyNodeHostNameOp
  */
-public class ModifyFrontendOrBackendHostNameOp extends AlterSystemOp {
-    private String hostPort;
-    private String host;
-    private String newHost;
-    private int port;
+public class ModifyNodeHostNameOp extends AlterSystemOp {
+    protected String hostPort;
+    protected String host;
+    protected String newHost;
+    protected int port;
     private ModifyOpType modifyOpType;
 
     /**
@@ -48,8 +48,8 @@ public class ModifyFrontendOrBackendHostNameOp extends AlterSystemOp {
         Backend
     }
 
-    public ModifyFrontendOrBackendHostNameOp(String hostPort, String newHost,
-            ModifyOpType modifyOpType) {
+    public ModifyNodeHostNameOp(String hostPort, String newHost,
+                                ModifyOpType modifyOpType) {
         super(AlterOpType.ALTER_OTHER);
         this.hostPort = hostPort;
         this.newHost = newHost;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyPartitionOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyPartitionOp.java
index 32a83d1a88d..d798de5666d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyPartitionOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyPartitionOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ModifyPartitionClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.PrintableMap;
@@ -103,11 +101,6 @@ public class ModifyPartitionOp extends AlterTableOp {
         checkProperties(Maps.newHashMap(properties));
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ModifyPartitionClause(partitionNames, properties, isTempPartition, needExpand);
-    }
-
     // Check the following properties' legality before modifying partition.
     // 1. replication_num or replication_allocation
     // 2. storage_medium && storage_cooldown_time
@@ -140,6 +133,10 @@ public class ModifyPartitionOp extends AlterTableOp {
         return isTempPartition;
     }
 
+    public boolean isNeedExpand() {
+        return this.needExpand;
+    }
+
     @Override
     public boolean allowOpMTMV() {
         return false;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyTableCommentOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyTableCommentOp.java
index 6e20f2b3293..2112eaa3f8b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyTableCommentOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyTableCommentOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ModifyTableCommentClause;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
@@ -46,11 +44,6 @@ public class ModifyTableCommentOp extends AlterTableOp {
         return Maps.newHashMap();
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ModifyTableCommentClause(comment);
-    }
-
     @Override
     public boolean allowOpMTMV() {
         return true;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyTablePropertiesOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyTablePropertiesOp.java
index 6376d24a46a..dc55d99d249 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyTablePropertiesOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ModifyTablePropertiesOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ModifyTablePropertiesClause;
 import org.apache.doris.catalog.DynamicPartitionProperty;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.MTMV;
@@ -395,11 +393,6 @@ public class ModifyTablePropertiesOp extends AlterTableOp {
         analyzeForMTMV();
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ModifyTablePropertiesClause(properties, storagePolicy, isBeingSynced, needTableStable, opType);
-    }
-
     private void analyzeForMTMV() throws AnalysisException {
         if (tableName != null) {
             // Skip external catalog.
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameColumnOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameColumnOp.java
index 6774645795f..909d324eeda 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameColumnOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameColumnOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ColumnRenameClause;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FeNameFormat;
@@ -69,11 +67,6 @@ public class RenameColumnOp extends AlterTableOp {
         FeNameFormat.checkColumnName(newColName);
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ColumnRenameClause(colName, newColName);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenamePartitionOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenamePartitionOp.java
index 692d83ccf79..e8fe2399fd0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenamePartitionOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenamePartitionOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.PartitionRenameClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FeNameFormat;
 import org.apache.doris.common.UserException;
@@ -64,11 +62,6 @@ public class RenamePartitionOp extends AlterTableOp {
         FeNameFormat.checkPartitionName(newPartitionName);
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new PartitionRenameClause(partitionName, newPartitionName);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameRollupOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameRollupOp.java
index 37605f1700a..67855850bf9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameRollupOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameRollupOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.RollupRenameClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FeNameFormat;
 import org.apache.doris.common.UserException;
@@ -64,11 +62,6 @@ public class RenameRollupOp extends AlterTableOp {
         FeNameFormat.checkTableName(newRollupName);
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new RollupRenameClause(rollupName, newRollupName);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameTableOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameTableOp.java
index 7cf4feae641..94f6c403fd9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameTableOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RenameTableOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.TableRenameClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FeNameFormat;
 import org.apache.doris.common.UserException;
@@ -53,11 +51,6 @@ public class RenameTableOp extends AlterTableOp {
         FeNameFormat.checkTableName(newTableName);
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new TableRenameClause(newTableName);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReorderColumnsOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReorderColumnsOp.java
index f674f5a3a68..9d167233986 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReorderColumnsOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReorderColumnsOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ReorderColumnsClause;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.OlapTable;
@@ -87,11 +85,6 @@ public class ReorderColumnsOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ReorderColumnsClause(columnsByPos, rollupName, properties);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return this.properties;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionFieldOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionFieldOp.java
index f75a513b606..d88ac671b67 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionFieldOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionFieldOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ReplacePartitionFieldClause;
 import org.apache.doris.common.UserException;
 import org.apache.doris.qe.ConnectContext;
 
@@ -99,12 +97,6 @@ public class ReplacePartitionFieldOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ReplacePartitionFieldClause(oldPartitionFieldName, oldTransformName, oldTransformArg,
-                oldColumnName, newTransformName, newTransformArg, newColumnName, newPartitionFieldName);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return Collections.emptyMap();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionOp.java
index a9ae4f91805..9b9406a97d8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ReplacePartitionClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.PropertyAnalyzer;
@@ -129,12 +127,6 @@ public class ReplacePartitionOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ReplacePartitionClause(partitionNames, tempPartitionNames,
-                forceDropOldPartition, properties, isStrictRange, useTempPartitionName);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return this.properties;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplaceTableOp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplaceTableOp.java
index 59f4b7be517..d02a9c67e1b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplaceTableOp.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ReplaceTableOp.java
@@ -18,8 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AlterTableClause;
-import org.apache.doris.analysis.ReplaceTableClause;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.PropertyAnalyzer;
@@ -72,11 +70,6 @@ public class ReplaceTableOp extends AlterTableOp {
         }
     }
 
-    @Override
-    public AlterTableClause translateToLegacyAlterClause() {
-        return new ReplaceTableClause(tblName, properties, isForce, swapTable);
-    }
-
     @Override
     public Map<String, String> getProperties() {
         return this.properties;
@@ -92,6 +85,10 @@ public class ReplaceTableOp extends AlterTableOp {
         return true;
     }
 
+    public boolean isForce() {
+        return isForce;
+    }
+
     @Override
     public String toSql() {
         StringBuilder sb = new StringBuilder();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RollupDefinition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RollupDefinition.java
index f1323cbbc8e..87053057d01 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RollupDefinition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RollupDefinition.java
@@ -60,6 +60,10 @@ public class RollupDefinition {
         return new AddRollupClause(name, cols, dupKeys, name, properties);
     }
 
+    public AddRollupOp translateToAddRollupOp() {
+        return new AddRollupOp(name, cols, dupKeys, name, properties);
+    }
+
     public String getName() {
         return name;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
index 61c81c9eae2..bffa6a7addc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
@@ -18,7 +18,6 @@
 package org.apache.doris.service;
 
 import org.apache.doris.analysis.AbstractBackupTableRefClause;
-import org.apache.doris.analysis.AddPartitionClause;
 import org.apache.doris.analysis.PartitionExprUtil;
 import org.apache.doris.analysis.SetType;
 import org.apache.doris.analysis.UserIdentity;
@@ -97,6 +96,7 @@ import org.apache.doris.mysql.privilege.AccessControllerManager;
 import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.nereids.trees.plans.PlanNodeAndHash;
 import org.apache.doris.nereids.trees.plans.commands.RestoreCommand;
+import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionOp;
 import org.apache.doris.nereids.trees.plans.commands.info.LabelNameInfo;
 import org.apache.doris.persist.gson.GsonUtils;
 import org.apache.doris.planner.OlapTableSink;
@@ -3687,7 +3687,7 @@ public class FrontendServiceImpl implements FrontendService.Iface {
             }
             partitionValues.add(request.partitionValues.get(i));
         }
-        Map<String, AddPartitionClause> addPartitionClauseMap;
+        Map<String, AddPartitionOp> addPartitionClauseMap;
         try {
             addPartitionClauseMap = PartitionExprUtil.getAddPartitionClauseFromPartitionValues(olapTable,
                     partitionValues, partitionInfo);
@@ -3698,10 +3698,10 @@ public class FrontendServiceImpl implements FrontendService.Iface {
             return result;
         }
 
-        for (AddPartitionClause addPartitionClause : addPartitionClauseMap.values()) {
+        for (AddPartitionOp addPartitionOp : addPartitionClauseMap.values()) {
             try {
                 // here maybe check and limit created partitions num
-                Env.getCurrentEnv().addPartition(db, olapTable.getName(), addPartitionClause, false, 0, true);
+                Env.getCurrentEnv().addPartition(db, olapTable.getName(), addPartitionOp, false, 0, true);
             } catch (DdlException e) {
                 LOG.warn(e);
                 errorStatus.setErrorMsgs(
diff --git a/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java b/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java
index b9c63f813b1..8c4a2213a92 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java
@@ -32,6 +32,7 @@ import org.apache.doris.common.UserException;
 import org.apache.doris.common.io.CountingDataOutputStream;
 import org.apache.doris.common.util.NetUtils;
 import org.apache.doris.metric.MetricRepo;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyBackendHostNameOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyBackendOp;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.resource.Tag;
@@ -958,6 +959,20 @@ public class SystemInfoService {
         Env.getCurrentEnv().getEditLog().logModifyBackend(be);
     }
 
+    public void modifyBackendHost(ModifyBackendHostNameOp op) throws UserException {
+        Backend be = getBackendWithHeartbeatPort(op.getHost(), op.getPort());
+        if (be == null) {
+            throw new DdlException("backend does not exists[" + NetUtils
+                .getHostPortInAccessibleFormat(op.getHost(), op.getPort()) + "]");
+        }
+        if (be.getHost().equals(op.getNewHost())) {
+            // no need to modify
+            return;
+        }
+        be.setHost(op.getNewHost());
+        Env.getCurrentEnv().getEditLog().logModifyBackend(be);
+    }
+
     public void modifyBackendHost(ModifyBackendHostNameClause clause) throws UserException {
         Backend be = getBackendWithHeartbeatPort(clause.getHost(), clause.getPort());
         if (be == null) {
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/CloudIndexTest.java b/fe/fe-core/src/test/java/org/apache/doris/alter/CloudIndexTest.java
index 4ca115a3ca9..ac5083485df 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/CloudIndexTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/CloudIndexTest.java
@@ -17,11 +17,7 @@
 
 package org.apache.doris.alter;
 
-import org.apache.doris.analysis.AlterClause;
-import org.apache.doris.analysis.BuildIndexClause;
-import org.apache.doris.analysis.CreateIndexClause;
 import org.apache.doris.analysis.DataSortInfo;
-import org.apache.doris.analysis.DropIndexClause;
 import org.apache.doris.analysis.ResourceTypeEnum;
 import org.apache.doris.analysis.UserIdentity;
 import org.apache.doris.catalog.CatalogTestUtil;
@@ -47,6 +43,8 @@ import org.apache.doris.mysql.privilege.AccessControllerManager;
 import org.apache.doris.mysql.privilege.Auth;
 import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.nereids.trees.plans.commands.CancelBuildIndexCommand;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
+import org.apache.doris.nereids.trees.plans.commands.info.CreateIndexOp;
 import org.apache.doris.nereids.trees.plans.commands.info.IndexDefinition;
 import org.apache.doris.persist.EditLog;
 import org.apache.doris.qe.ConnectContext;
@@ -89,9 +87,7 @@ public class CloudIndexTest {
 
     private static Database db;
     private static OlapTable olapTable;
-    private static CreateIndexClause createIndexClause;
-    private static BuildIndexClause buildIndexClause;
-    private static DropIndexClause dropIndexClause;
+    private static CreateIndexOp createIndexOp;
     private static CancelBuildIndexCommand cancelBuildIndexCommand;
     private static SchemaChangeHandler schemaChangeHandler;
 
@@ -381,19 +377,18 @@ public class CloudIndexTest {
         Map<String, String> properties = Maps.newHashMap();
         properties.put("gram_size", "2");
         properties.put("bf_size", "256");
-
-        IndexDefinition indexDef = new IndexDefinition(indexName, false,
+        IndexDefinition indexDefinition = new IndexDefinition(indexName, false,
                 Lists.newArrayList(table.getBaseSchema().get(3).getName()),
                 "NGRAM_BF",
                 properties, "ngram bf index");
         TableNameInfo tableName = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
                 table.getName());
-        createIndexClause = new CreateIndexClause(tableName, indexDef, false);
-        createIndexClause.analyze();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(createIndexClause);
+        createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        createIndexOp.validate(new ConnectContext());
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(createIndexOp);
         ctx.getSessionVariable().setEnableAddIndexForNewData(true);
-        schemaChangeHandler.process(alterClauses, db, table);
+        schemaChangeHandler.process(alterOps, db, table);
         Map<Long, AlterJobV2> indexChangeJobMap = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(1, table.getIndexes().size());
@@ -438,13 +433,13 @@ public class CloudIndexTest {
                 properties, "ngram bf index");
         TableNameInfo tableName = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
                 table.getName());
-        createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(createIndexClause);
+        createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        createIndexOp.validate(new ConnectContext());
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(createIndexOp);
         // Set session variable to false (default)
         ctx.getSessionVariable().setEnableAddIndexForNewData(false);
-        schemaChangeHandler.process(alterClauses, db, table);
+        schemaChangeHandler.process(alterOps, db, table);
         Map<Long, AlterJobV2> indexChangeJobMap = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.SCHEMA_CHANGE, table.getState());
@@ -494,19 +489,18 @@ public class CloudIndexTest {
         // Explicitly set parser="none" for raw inverted index
         Map<String, String> properties = Maps.newHashMap();
         properties.put("parser", "none");
-
         IndexDefinition indexDefinition = new IndexDefinition(indexName, false,
                 Lists.newArrayList(table.getBaseSchema().get(3).getName()),
                 "INVERTED",
                 properties, "raw inverted index");
         TableNameInfo tableName = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
                 table.getName());
-        createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(createIndexClause);
+        createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        createIndexOp.validate(new ConnectContext());
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(createIndexOp);
         ctx.getSessionVariable().setEnableAddIndexForNewData(false);
-        schemaChangeHandler.process(alterClauses, db, table);
+        schemaChangeHandler.process(alterOps, db, table);
         Map<Long, AlterJobV2> indexChangeJobMap = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, indexChangeJobMap.size());
 
@@ -563,13 +557,13 @@ public class CloudIndexTest {
                 properties, "lightweight raw inverted index");
         TableNameInfo tableName = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
                 table.getName());
-        createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(createIndexClause);
+        createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        createIndexOp.validate(new ConnectContext());
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(createIndexOp);
         // Test with enable_add_index_for_new_data = true, should use lightweight mode
         ctx.getSessionVariable().setEnableAddIndexForNewData(true);
-        schemaChangeHandler.process(alterClauses, db, table);
+        schemaChangeHandler.process(alterOps, db, table);
         Map<Long, AlterJobV2> indexChangeJobMap = schemaChangeHandler.getAlterJobsV2();
         // Lightweight mode should not create any schema change jobs
         Assert.assertEquals(1, indexChangeJobMap.size());
@@ -613,13 +607,13 @@ public class CloudIndexTest {
                 Lists.newArrayList(table.getBaseSchema().get(2).getName()),
                 "INVERTED",
                 properties, "tokenized inverted index with english parser");
-        TableNameInfo tableName = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
+        TableNameInfo tableNameInfo = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
                 table.getName());
-        createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses, db, table);
+        createIndexOp = new CreateIndexOp(tableNameInfo, indexDefinition, false);
+        createIndexOp.validate(new ConnectContext());
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(createIndexOp);
+        schemaChangeHandler.process(alterOps, db, table);
         Map<Long, AlterJobV2> indexChangeJobMap = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.SCHEMA_CHANGE, table.getState());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/IndexChangeJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/alter/IndexChangeJobTest.java
index 460e4d7869b..3e037269113 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/IndexChangeJobTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/IndexChangeJobTest.java
@@ -17,10 +17,6 @@
 
 package org.apache.doris.alter;
 
-import org.apache.doris.analysis.AlterClause;
-import org.apache.doris.analysis.BuildIndexClause;
-import org.apache.doris.analysis.CreateIndexClause;
-import org.apache.doris.analysis.DropIndexClause;
 import org.apache.doris.catalog.CatalogTestUtil;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.Env;
@@ -40,6 +36,10 @@ import org.apache.doris.common.FeMetaVersion;
 import org.apache.doris.common.UserException;
 import org.apache.doris.info.TableNameInfo;
 import org.apache.doris.nereids.trees.plans.commands.CancelAlterTableCommand;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
+import org.apache.doris.nereids.trees.plans.commands.info.BuildIndexOp;
+import org.apache.doris.nereids.trees.plans.commands.info.CreateIndexOp;
+import org.apache.doris.nereids.trees.plans.commands.info.DropIndexOp;
 import org.apache.doris.nereids.trees.plans.commands.info.IndexDefinition;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.task.AgentTask;
@@ -113,7 +113,7 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
@@ -123,10 +123,10 @@ public class IndexChangeJobTest {
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        createIndexOp.validate(new ConnectContext());
+        alterOps.add(createIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(0, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -140,27 +140,28 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
-        TableNameInfo tableName = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
+        TableNameInfo tableNameInfo = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
                 olapTable.getName());
         IndexDefinition indexDefinition = new IndexDefinition(indexName, false,
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        CreateIndexOp createIndexClause = new CreateIndexOp(tableNameInfo, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexClause.validate(connectContext);
+        alterOps.add(createIndexClause);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Assert.assertEquals(olapTable.getIndexes().size(), 1);
         Assert.assertEquals(olapTable.getIndexes().get(0).getIndexName(), "index1");
-        alterClauses.clear();
-        BuildIndexClause buildIndexClause = new BuildIndexClause(tableName, indexName, null, false);
-        buildIndexClause.analyze();
-        alterClauses.add(buildIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        alterOps.clear();
+        BuildIndexOp buildIndexClause = new BuildIndexOp(tableNameInfo, indexName, null, false);
+        buildIndexClause.validate(connectContext);
+        alterOps.add(buildIndexClause);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -172,7 +173,7 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
@@ -182,17 +183,18 @@ public class IndexChangeJobTest {
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
+        alterOps.add(createIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Assert.assertEquals(olapTable.getIndexes().size(), 1);
         Assert.assertEquals(olapTable.getIndexes().get(0).getIndexName(), "index1");
-        alterClauses.clear();
-        DropIndexClause dropIndexClause = new DropIndexClause(indexName, false, tableName, false);
-        dropIndexClause.analyze();
-        alterClauses.add(dropIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        alterOps.clear();
+        DropIndexOp dropIndexOp = new DropIndexOp(indexName, false, tableName, false);
+        dropIndexOp.validate(connectContext);
+        alterOps.add(dropIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -206,27 +208,28 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
-        TableNameInfo tableName = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
+        TableNameInfo tableNameInfo = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
                 olapTable.getName());
         IndexDefinition indexDefinition = new IndexDefinition(indexName, false,
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableNameInfo, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
+        alterOps.add(createIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Assert.assertEquals(olapTable.getIndexes().size(), 1);
         Assert.assertEquals(olapTable.getIndexes().get(0).getIndexName(), "index1");
-        alterClauses.clear();
-        BuildIndexClause buildIndexClause = new BuildIndexClause(tableName, indexName, null, false);
-        buildIndexClause.analyze();
-        alterClauses.add(buildIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        alterOps.clear();
+        BuildIndexOp buildIndexOp = new BuildIndexOp(tableNameInfo, indexName, null, false);
+        buildIndexOp.validate(new ConnectContext());
+        alterOps.add(buildIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -264,7 +267,7 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
@@ -274,17 +277,18 @@ public class IndexChangeJobTest {
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
+        alterOps.add(createIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Assert.assertEquals(olapTable.getIndexes().size(), 1);
         Assert.assertEquals(olapTable.getIndexes().get(0).getIndexName(), "index1");
-        alterClauses.clear();
-        DropIndexClause dropIndexClause = new DropIndexClause(indexName, false, tableName, false);
-        dropIndexClause.analyze();
-        alterClauses.add(dropIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        alterOps.clear();
+        DropIndexOp dropIndexOp = new DropIndexOp(indexName, false, tableName, false);
+        dropIndexOp.validate(connectContext);
+        alterOps.add(dropIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -321,7 +325,7 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
@@ -331,17 +335,18 @@ public class IndexChangeJobTest {
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
+        alterOps.add(createIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Assert.assertEquals(olapTable.getIndexes().size(), 1);
         Assert.assertEquals(olapTable.getIndexes().get(0).getIndexName(), "index1");
-        alterClauses.clear();
-        BuildIndexClause buildIndexClause = new BuildIndexClause(tableName, indexName, null, false);
-        buildIndexClause.analyze();
-        alterClauses.add(buildIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        alterOps.clear();
+        BuildIndexOp buildIndexOp = new BuildIndexOp(tableName, indexName, null, false);
+        buildIndexOp.validate(connectContext);
+        alterOps.add(buildIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -368,7 +373,7 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
@@ -378,23 +383,24 @@ public class IndexChangeJobTest {
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
+        alterOps.add(createIndexOp);
         olapTable.setState(OlapTableState.SCHEMA_CHANGE);
         expectedEx.expect(DdlException.class);
         expectedEx.expectMessage("errCode = 2, detailMessage = Table[testTable1]'s state(SCHEMA_CHANGE) is not NORMAL. Do not allow doing ALTER ops");
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        schemaChangeHandler.process(alterOps, db, olapTable);
 
         olapTable.setState(OlapTableState.NORMAL);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Assert.assertEquals(olapTable.getIndexes().size(), 1);
         Assert.assertEquals(olapTable.getIndexes().get(0).getIndexName(), "index1");
-        alterClauses.clear();
-        BuildIndexClause buildIndexClause = new BuildIndexClause(tableName, indexName, null, false);
-        buildIndexClause.analyze();
-        alterClauses.add(buildIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        alterOps.clear();
+        BuildIndexOp buildIndexOp = new BuildIndexOp(tableName, indexName, null, false);
+        buildIndexOp.validate(connectContext);
+        alterOps.add(buildIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -448,7 +454,7 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
@@ -458,23 +464,24 @@ public class IndexChangeJobTest {
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
+        alterOps.add(createIndexOp);
         olapTable.setState(OlapTableState.SCHEMA_CHANGE);
         expectedEx.expect(DdlException.class);
         expectedEx.expectMessage("errCode = 2, detailMessage = Table[testTable1]'s state(SCHEMA_CHANGE) is not NORMAL. Do not allow doing ALTER ops");
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        schemaChangeHandler.process(alterOps, db, olapTable);
 
         olapTable.setState(OlapTableState.NORMAL);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Assert.assertEquals(olapTable.getIndexes().size(), 1);
         Assert.assertEquals(olapTable.getIndexes().get(0).getIndexName(), "index1");
-        alterClauses.clear();
-        DropIndexClause dropIndexClause = new DropIndexClause(indexName, false, tableName, false);
-        dropIndexClause.analyze();
-        alterClauses.add(dropIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        alterOps.clear();
+        DropIndexOp dropIndexOp = new DropIndexOp(indexName, false, tableName, false);
+        dropIndexOp.validate(connectContext);
+        alterOps.add(dropIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -528,7 +535,7 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
@@ -538,17 +545,18 @@ public class IndexChangeJobTest {
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
+        alterOps.add(createIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Assert.assertEquals(olapTable.getIndexes().size(), 1);
         Assert.assertEquals(olapTable.getIndexes().get(0).getIndexName(), "index1");
-        alterClauses.clear();
-        BuildIndexClause buildIndexClause = new BuildIndexClause(tableName, indexName, null, false);
-        buildIndexClause.analyze();
-        alterClauses.add(buildIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        alterOps.clear();
+        BuildIndexOp buildIndexOp = new BuildIndexOp(tableName, indexName, null, false);
+        buildIndexOp.validate(connectContext);
+        alterOps.add(buildIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -593,7 +601,7 @@ public class IndexChangeJobTest {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         String indexName = "index1";
@@ -603,17 +611,18 @@ public class IndexChangeJobTest {
                 Lists.newArrayList(olapTable.getBaseSchema().get(1).getName()),
                 "INVERTED",
                 Maps.newHashMap(), "balabala");
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
-        alterClauses.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
+        alterOps.add(createIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Assert.assertEquals(olapTable.getIndexes().size(), 1);
         Assert.assertEquals(olapTable.getIndexes().get(0).getIndexName(), "index1");
-        alterClauses.clear();
-        BuildIndexClause buildIndexClause = new BuildIndexClause(tableName, indexName, null, false);
-        buildIndexClause.analyze();
-        alterClauses.add(buildIndexClause);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        alterOps.clear();
+        BuildIndexOp buildIndexOp = new BuildIndexOp(tableName, indexName, null, false);
+        buildIndexOp.validate(connectContext);
+        alterOps.add(buildIndexOp);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, IndexChangeJob> indexChangeJobMap = schemaChangeHandler.getIndexChangeJobs();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.NORMAL, olapTable.getState());
@@ -668,16 +677,17 @@ public class IndexChangeJobTest {
                 Maps.newHashMap(), "ngram bf index");
         TableNameInfo tableName = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
                 table.getName());
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(createIndexClause);
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(createIndexOp);
 
         // Test with enable_add_index_for_new_data = true
         ConnectContext context = ConnectContext.get();
         context.getSessionVariable().setEnableAddIndexForNewData(true);
-        schemaChangeHandler.process(alterClauses, db, table);
+        schemaChangeHandler.process(alterOps, db, table);
         Map<Long, AlterJobV2> indexChangeJobMap = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(1, table.getIndexes().size());
@@ -701,12 +711,11 @@ public class IndexChangeJobTest {
                 Lists.newArrayList(table.getBaseSchema().get(3).getName()),
                 "NGRAM_BF",
                 Maps.newHashMap(), "ngram bf index2");
-
-        createIndexClause = new CreateIndexClause(tableName, indexDefinition2, false);
-        createIndexClause.analyze();
-        ArrayList<AlterClause> alterClauses2 = new ArrayList<>();
-        alterClauses2.add(createIndexClause);
-        schemaChangeHandler.process(alterClauses2, db, table);
+        createIndexOp = new CreateIndexOp(tableName, indexDefinition2, false);
+        createIndexOp.validate(connectContext);
+        ArrayList<AlterOp> alterOps2 = new ArrayList<>();
+        alterOps2.add(createIndexOp);
+        schemaChangeHandler.process(alterOps2, db, table);
         indexChangeJobMap = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.SCHEMA_CHANGE, table.getState());
@@ -756,15 +765,16 @@ public class IndexChangeJobTest {
                 Maps.newHashMap(), "ngram bf index");
         TableNameInfo tableName = new TableNameInfo(masterEnv.getInternalCatalog().getName(), db.getName(),
                 table.getName());
-        CreateIndexClause createIndexClause = new CreateIndexClause(tableName, indexDefinition, false);
-        createIndexClause.analyze();
+        CreateIndexOp createIndexOp = new CreateIndexOp(tableName, indexDefinition, false);
+        ConnectContext connectContext = new ConnectContext();
+        createIndexOp.validate(connectContext);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(createIndexClause);
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(createIndexOp);
 
         //cancel test can only with enable_add_index_for_new_data = false
         ctx.getSessionVariable().setEnableAddIndexForNewData(false);
-        schemaChangeHandler.process(alterClauses, db, table);
+        schemaChangeHandler.process(alterOps, db, table);
         Map<Long, AlterJobV2> indexChangeJobMap = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, indexChangeJobMap.size());
         Assert.assertEquals(OlapTableState.SCHEMA_CHANGE, table.getState());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/RollupJobV2Test.java b/fe/fe-core/src/test/java/org/apache/doris/alter/RollupJobV2Test.java
index 917e2ec31e7..c60e35c87ce 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/RollupJobV2Test.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/RollupJobV2Test.java
@@ -18,8 +18,6 @@
 package org.apache.doris.alter;
 
 import org.apache.doris.alter.AlterJobV2.JobState;
-import org.apache.doris.analysis.AddRollupClause;
-import org.apache.doris.analysis.AlterClause;
 import org.apache.doris.catalog.AggregateType;
 import org.apache.doris.catalog.CatalogTestUtil;
 import org.apache.doris.catalog.Column;
@@ -43,6 +41,9 @@ import org.apache.doris.common.FeMetaVersion;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
 import org.apache.doris.meta.MetaContext;
+import org.apache.doris.nereids.trees.plans.commands.info.AddRollupOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
+import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.qe.OriginStatement;
 import org.apache.doris.task.AgentTask;
 import org.apache.doris.task.AgentTaskQueue;
@@ -80,15 +81,15 @@ public class RollupJobV2Test {
     private static Env slaveEnv;
 
     private static String transactionSource = "localfe";
-    private static AddRollupClause clause;
-    private static AddRollupClause clause2;
+    private static AddRollupOp op;
+    private static AddRollupOp op2;
 
     private FakeEnv fakeEnv;
     private FakeEditLog fakeEditLog;
 
     @Before
     public void setUp() throws InstantiationException, IllegalAccessException, IllegalArgumentException,
-            InvocationTargetException, NoSuchMethodException, SecurityException, AnalysisException {
+            InvocationTargetException, NoSuchMethodException, SecurityException, UserException {
         fakeEnv = new FakeEnv();
         fakeEditLog = new FakeEditLog();
         fakeTransactionIDGenerator = new FakeTransactionIDGenerator();
@@ -102,13 +103,13 @@ public class RollupJobV2Test {
 
         slaveTransMgr = slaveEnv.getGlobalTransactionMgr();
         slaveTransMgr.setEditLog(slaveEnv.getEditLog());
-        clause = new AddRollupClause(CatalogTestUtil.testRollupIndex2, Lists.newArrayList("k1", "v"), null,
+        op = new AddRollupOp(CatalogTestUtil.testRollupIndex2, Lists.newArrayList("k1", "v"), null,
                 CatalogTestUtil.testIndex1, null);
-        clause.analyze();
+        op.validate(new ConnectContext());
 
-        clause2 = new AddRollupClause(CatalogTestUtil.testRollupIndex3, Lists.newArrayList("k1", "v"), null,
+        op2 = new AddRollupOp(CatalogTestUtil.testRollupIndex3, Lists.newArrayList("k1", "v"), null,
                 CatalogTestUtil.testIndex1, null);
-        clause2.analyze();
+        op2.validate(new ConnectContext());
 
         FeConstants.runningUnitTest = true;
         AgentTaskQueue.clearAllTasks();
@@ -133,12 +134,12 @@ public class RollupJobV2Test {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         MaterializedViewHandler materializedViewHandler = Env.getCurrentEnv().getMaterializedViewHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(clause);
-        alterClauses.add(clause2);
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(op);
+        alterOps.add(op2);
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
-        materializedViewHandler.process(alterClauses, db, olapTable);
+        materializedViewHandler.process(alterOps, db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = materializedViewHandler.getAlterJobsV2();
 
         materializedViewHandler.runAfterCatalogReady();
@@ -154,11 +155,11 @@ public class RollupJobV2Test {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         MaterializedViewHandler materializedViewHandler = Env.getCurrentEnv().getMaterializedViewHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(clause);
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(op);
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
-        materializedViewHandler.process(alterClauses, db, olapTable);
+        materializedViewHandler.process(alterOps, db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = materializedViewHandler.getAlterJobsV2();
         Assert.assertEquals(1, alterJobsV2.size());
         Assert.assertEquals(OlapTableState.ROLLUP, olapTable.getState());
@@ -173,12 +174,12 @@ public class RollupJobV2Test {
         MaterializedViewHandler materializedViewHandler = Env.getCurrentEnv().getMaterializedViewHandler();
 
         // add a rollup job
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(clause);
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(op);
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         Partition testPartition = olapTable.getPartition(CatalogTestUtil.testPartitionId1);
-        materializedViewHandler.process(alterClauses, db, olapTable);
+        materializedViewHandler.process(alterOps, db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = materializedViewHandler.getAlterJobsV2();
         Assert.assertEquals(1, alterJobsV2.size());
         RollupJobV2 rollupJob = (RollupJobV2) alterJobsV2.values().stream().findAny().get();
@@ -223,12 +224,12 @@ public class RollupJobV2Test {
         MaterializedViewHandler materializedViewHandler = Env.getCurrentEnv().getMaterializedViewHandler();
 
         // add a rollup job
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(clause);
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(op);
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         Partition testPartition = olapTable.getPartition(CatalogTestUtil.testPartitionId1);
-        materializedViewHandler.process(alterClauses, db, olapTable);
+        materializedViewHandler.process(alterOps, db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = materializedViewHandler.getAlterJobsV2();
         Assert.assertEquals(1, alterJobsV2.size());
         RollupJobV2 rollupJob = (RollupJobV2) alterJobsV2.values().stream().findAny().get();
@@ -343,9 +344,9 @@ public class RollupJobV2Test {
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId2);
 
-        AddRollupClause addRollupClause = new AddRollupClause("r1", Lists.newArrayList("k1", "v1", "v2"), null, CatalogTestUtil.testIndex2, null);
+        AddRollupOp addRollupOp = new AddRollupOp("r1", Lists.newArrayList("k1", "v1", "v2"), null, CatalogTestUtil.testIndex2, null);
 
-        List<Column> columns = materializedViewHandler.checkAndPrepareMaterializedView(addRollupClause, olapTable, CatalogTestUtil.testIndexId2, false);
+        List<Column> columns = materializedViewHandler.checkAndPrepareMaterializedView(addRollupOp, olapTable, CatalogTestUtil.testIndexId2, false);
         for (Column column : columns) {
             if (column.nameEquals("v1", true)) {
                 Assert.assertNull(column.getAggregationType());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java b/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java
index 6db85740185..1cd718c68a1 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java
@@ -18,12 +18,7 @@
 package org.apache.doris.alter;
 
 import org.apache.doris.alter.AlterJobV2.JobState;
-import org.apache.doris.analysis.AddColumnClause;
-import org.apache.doris.analysis.AlterClause;
-import org.apache.doris.analysis.ColumnDef;
-import org.apache.doris.analysis.ColumnDef.DefaultValue;
 import org.apache.doris.analysis.ColumnPosition;
-import org.apache.doris.analysis.ModifyTablePropertiesClause;
 import org.apache.doris.backup.CatalogMocker;
 import org.apache.doris.catalog.AggregateType;
 import org.apache.doris.catalog.CatalogTestUtil;
@@ -47,7 +42,6 @@ import org.apache.doris.catalog.Replica;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.Tablet;
 import org.apache.doris.catalog.Type;
-import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.FeMetaVersion;
@@ -55,6 +49,13 @@ import org.apache.doris.common.SchemaVersionAndHash;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
 import org.apache.doris.meta.MetaContext;
+import org.apache.doris.nereids.trees.plans.commands.info.AddColumnOp;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ColumnDefinition;
+import org.apache.doris.nereids.trees.plans.commands.info.DefaultValue;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyTablePropertiesOp;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.task.AgentTask;
 import org.apache.doris.task.AgentTaskQueue;
 import org.apache.doris.thrift.TStorageFormat;
@@ -83,6 +84,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 public class SchemaChangeJobV2Test {
 
@@ -95,10 +97,9 @@ public class SchemaChangeJobV2Test {
     private static GlobalTransactionMgr slaveTransMgr;
     private static Env masterEnv;
     private static Env slaveEnv;
-
-    private static ColumnDef newCol = new ColumnDef("add_v", ScalarType.createType(PrimitiveType.INT),
-            false, AggregateType.MAX, false, new DefaultValue(true, "1"), "");
-    private static AddColumnClause addColumnClause = new AddColumnClause(newCol, new ColumnPosition("v"), null, null);
+    private static ColumnDefinition newCol = new ColumnDefinition("add_v", DataType.fromCatalogType(ScalarType.createType(PrimitiveType.INT)),
+            false, AggregateType.MAX, false, Optional.of(new DefaultValue("1")), "");
+    private static AddColumnOp addColumnOp = new AddColumnOp(newCol, new ColumnPosition("v"), null, null);
 
     @Rule
     public ExpectedException expectedEx = ExpectedException.none();
@@ -106,7 +107,7 @@ public class SchemaChangeJobV2Test {
     @Before
     public void setUp()
             throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
-            NoSuchMethodException, SecurityException, AnalysisException, DdlException {
+            NoSuchMethodException, SecurityException, UserException {
         FakeEnv.setMetaVersion(FeMetaVersion.VERSION_CURRENT);
         fakeEditLog = new FakeEditLog();
         fakeEnv = new FakeEnv();
@@ -117,7 +118,7 @@ public class SchemaChangeJobV2Test {
         masterTransMgr.setEditLog(masterEnv.getEditLog());
         slaveTransMgr = (GlobalTransactionMgr) slaveEnv.getGlobalTransactionMgr();
         slaveTransMgr.setEditLog(slaveEnv.getEditLog());
-        addColumnClause.analyze();
+        addColumnOp.validate(new ConnectContext());
 
         FeConstants.runningUnitTest = true;
         AgentTaskQueue.clearAllTasks();
@@ -129,11 +130,11 @@ public class SchemaChangeJobV2Test {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(addColumnClause);
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(addColumnOp);
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        schemaChangeHandler.process(alterOps, db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, alterJobsV2.size());
         Assert.assertEquals(OlapTableState.SCHEMA_CHANGE, olapTable.getState());
@@ -148,12 +149,12 @@ public class SchemaChangeJobV2Test {
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
 
         // add a schema change job
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(addColumnClause);
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(addColumnOp);
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         Partition testPartition = olapTable.getPartition(CatalogTestUtil.testPartitionId1);
-        schemaChangeHandler.process(alterClauses,  db, olapTable);
+        schemaChangeHandler.process(alterOps,  db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, alterJobsV2.size());
         SchemaChangeJobV2 schemaChangeJob = (SchemaChangeJobV2) alterJobsV2.values().stream().findAny().get();
@@ -224,12 +225,12 @@ public class SchemaChangeJobV2Test {
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
 
         // add a schema change job
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
-        alterClauses.add(addColumnClause);
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
+        alterOps.add(addColumnOp);
         Database db = masterEnv.getInternalCatalog().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         Partition testPartition = olapTable.getPartition(CatalogTestUtil.testPartitionId1);
-        schemaChangeHandler.process(alterClauses,  db, olapTable);
+        schemaChangeHandler.process(alterOps,  db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = schemaChangeHandler.getAlterJobsV2();
         Assert.assertEquals(1, alterJobsV2.size());
         SchemaChangeJobV2 schemaChangeJob = (SchemaChangeJobV2) alterJobsV2.values().stream().findAny().get();
@@ -304,17 +305,17 @@ public class SchemaChangeJobV2Test {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Map<String, String> properties = new HashMap<>();
         properties.put(DynamicPartitionProperty.ENABLE, "true");
         properties.put(DynamicPartitionProperty.TIME_UNIT, "day");
         properties.put(DynamicPartitionProperty.END, "3");
         properties.put(DynamicPartitionProperty.PREFIX, "p");
         properties.put(DynamicPartitionProperty.BUCKETS, "30");
-        alterClauses.add(new ModifyTablePropertiesClause(properties));
+        alterOps.add(new ModifyTablePropertiesOp(properties));
         Database db = CatalogMocker.mockDb();
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogMocker.TEST_TBL2_ID);
-        schemaChangeHandler.process(alterClauses,  db, olapTable);
+        schemaChangeHandler.process(alterOps,  db, olapTable);
         Assert.assertTrue(olapTable.getTableProperty().getDynamicPartitionProperty().isExist());
         Assert.assertTrue(olapTable.getTableProperty().getDynamicPartitionProperty().getEnable());
         Assert.assertEquals("day", olapTable.getTableProperty().getDynamicPartitionProperty().getTimeUnit());
@@ -324,34 +325,34 @@ public class SchemaChangeJobV2Test {
 
 
         // set dynamic_partition.enable = false
-        ArrayList<AlterClause> tmpAlterClauses = new ArrayList<>();
+        ArrayList<AlterOp> tmpAlterOps = new ArrayList<>();
         properties.put(DynamicPartitionProperty.ENABLE, "false");
-        tmpAlterClauses.add(new ModifyTablePropertiesClause(properties));
-        schemaChangeHandler.process(tmpAlterClauses,  db, olapTable);
+        tmpAlterOps.add(new ModifyTablePropertiesOp(properties));
+        schemaChangeHandler.process(tmpAlterOps,  db, olapTable);
         Assert.assertFalse(olapTable.getTableProperty().getDynamicPartitionProperty().getEnable());
         // set dynamic_partition.time_unit = week
-        tmpAlterClauses = new ArrayList<>();
+        tmpAlterOps = new ArrayList<>();
         properties.put(DynamicPartitionProperty.TIME_UNIT, "week");
-        tmpAlterClauses.add(new ModifyTablePropertiesClause(properties));
-        schemaChangeHandler.process(tmpAlterClauses,  db, olapTable);
+        tmpAlterOps.add(new ModifyTablePropertiesOp(properties));
+        schemaChangeHandler.process(tmpAlterOps,  db, olapTable);
         Assert.assertEquals("week", olapTable.getTableProperty().getDynamicPartitionProperty().getTimeUnit());
         // set dynamic_partition.end = 10
-        tmpAlterClauses = new ArrayList<>();
+        tmpAlterOps = new ArrayList<>();
         properties.put(DynamicPartitionProperty.END, "10");
-        tmpAlterClauses.add(new ModifyTablePropertiesClause(properties));
-        schemaChangeHandler.process(tmpAlterClauses,  db, olapTable);
+        tmpAlterOps.add(new ModifyTablePropertiesOp(properties));
+        schemaChangeHandler.process(tmpAlterOps,  db, olapTable);
         Assert.assertEquals(10, olapTable.getTableProperty().getDynamicPartitionProperty().getEnd());
         // set dynamic_partition.prefix = p1
-        tmpAlterClauses = new ArrayList<>();
+        tmpAlterOps = new ArrayList<>();
         properties.put(DynamicPartitionProperty.PREFIX, "p1");
-        tmpAlterClauses.add(new ModifyTablePropertiesClause(properties));
-        schemaChangeHandler.process(tmpAlterClauses,  db, olapTable);
+        tmpAlterOps.add(new ModifyTablePropertiesOp(properties));
+        schemaChangeHandler.process(tmpAlterOps,  db, olapTable);
         Assert.assertEquals("p1", olapTable.getTableProperty().getDynamicPartitionProperty().getPrefix());
         // set dynamic_partition.buckets = 3
-        tmpAlterClauses = new ArrayList<>();
+        tmpAlterOps = new ArrayList<>();
         properties.put(DynamicPartitionProperty.BUCKETS, "3");
-        tmpAlterClauses.add(new ModifyTablePropertiesClause(properties));
-        schemaChangeHandler.process(tmpAlterClauses,  db, olapTable);
+        tmpAlterOps.add(new ModifyTablePropertiesOp(properties));
+        schemaChangeHandler.process(tmpAlterOps,  db, olapTable);
         Assert.assertEquals(3, olapTable.getTableProperty().getDynamicPartitionProperty().getBuckets());
     }
 
@@ -360,10 +361,10 @@ public class SchemaChangeJobV2Test {
         fakeEnv = new FakeEnv();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Map<String, String> properties = new HashMap<>();
         properties.put(propertyKey, propertyValue);
-        alterClauses.add(new ModifyTablePropertiesClause(properties));
+        alterOps.add(new ModifyTablePropertiesOp(properties));
 
         Database db = CatalogMocker.mockDb();
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogMocker.TEST_TBL2_ID);
@@ -372,7 +373,7 @@ public class SchemaChangeJobV2Test {
         expectedEx.expectMessage("errCode = 2,"
                 + " detailMessage = Table test_db.test_tbl2 is not a dynamic partition table. "
                 + "Use command `HELP ALTER TABLE` to see how to change a normal table to a dynamic partition table.");
-        schemaChangeHandler.process(alterClauses,  db, olapTable);
+        schemaChangeHandler.process(alterOps,  db, olapTable);
     }
 
     @Test
@@ -390,7 +391,7 @@ public class SchemaChangeJobV2Test {
         fakeEditLog = new FakeEditLog();
         FakeEnv.setEnv(masterEnv);
         SchemaChangeHandler schemaChangeHandler = Env.getCurrentEnv().getSchemaChangeHandler();
-        ArrayList<AlterClause> alterClauses = new ArrayList<>();
+        ArrayList<AlterOp> alterOps = new ArrayList<>();
         Map<String, String> properties = new HashMap<>();
         properties.put(DynamicPartitionProperty.ENABLE, "true");
         properties.put(DynamicPartitionProperty.DYNAMIC_PARTITION_PROPERTY_PREFIX + "time_uint", "day");
@@ -398,14 +399,14 @@ public class SchemaChangeJobV2Test {
         properties.put(DynamicPartitionProperty.PREFIX, "p");
         properties.put(DynamicPartitionProperty.BUCKETS, "30");
         properties.put("invalid_property", "invalid_value");
-        alterClauses.add(new ModifyTablePropertiesClause(properties));
+        alterOps.add(new ModifyTablePropertiesOp(properties));
 
         Database db = CatalogMocker.mockDb();
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogMocker.TEST_TBL2_ID);
         expectedEx.expect(DdlException.class);
         expectedEx.expectMessage("errCode = 2,"
                 + " detailMessage = Invalid dynamic partition properties: dynamic_partition.time_uint, dynamic_partition.edn");
-        schemaChangeHandler.process(alterClauses, db, olapTable);
+        schemaChangeHandler.process(alterOps, db, olapTable);
     }
 
     @Test
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/AlterSystemCommandTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/AlterSystemCommandTest.java
index 77af57e9b1a..2d7471ca093 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/AlterSystemCommandTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/AlterSystemCommandTest.java
@@ -33,7 +33,7 @@ import org.apache.doris.nereids.trees.plans.commands.info.DropBrokerOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropFollowerOp;
 import org.apache.doris.nereids.trees.plans.commands.info.DropObserverOp;
 import org.apache.doris.nereids.trees.plans.commands.info.ModifyBackendOp;
-import org.apache.doris.nereids.trees.plans.commands.info.ModifyFrontendOrBackendHostNameOp;
+import org.apache.doris.nereids.trees.plans.commands.info.ModifyNodeHostNameOp;
 import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.collect.ImmutableList;
@@ -148,16 +148,16 @@ public class AlterSystemCommandTest {
         Assertions.assertDoesNotThrow(() -> modifyBackend.validate(connectContext));
 
         // test modifyFrontendOrBackendHostName
-        for (ModifyFrontendOrBackendHostNameOp.ModifyOpType type : ModifyFrontendOrBackendHostNameOp.ModifyOpType.values()) {
+        for (ModifyNodeHostNameOp.ModifyOpType type : ModifyNodeHostNameOp.ModifyOpType.values()) {
             for (String newHost : Arrays.asList("localhost", "192.168.10.10")) {
                 AlterSystemCommand command = new AlterSystemCommand(
-                        new ModifyFrontendOrBackendHostNameOp(hostPorts.get(0), newHost, type),
+                        new ModifyNodeHostNameOp(hostPorts.get(0), newHost, type),
                         PlanType.ALTER_SYSTEM_MODIFY_FRONTEND_OR_BACKEND_HOSTNAME);
                 Assertions.assertDoesNotThrow(() -> command.validate(connectContext));
             }
             for (String newHost : Arrays.asList("localhost2", "192.168.10.300")) {
                 AlterSystemCommand command = new AlterSystemCommand(
-                        new ModifyFrontendOrBackendHostNameOp(hostPorts.get(0), newHost, type),
+                        new ModifyNodeHostNameOp(hostPorts.get(0), newHost, type),
                         PlanType.ALTER_SYSTEM_MODIFY_FRONTEND_OR_BACKEND_HOSTNAME);
                 Assertions.assertThrows(AnalysisException.class, () -> command.validate(connectContext),
                         "Unknown hostname:  " + newHost + ": Name or service not known");
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionFieldOpTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionFieldOpTest.java
index 56d3a4f813b..c802d1d389a 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionFieldOpTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/AddPartitionFieldOpTest.java
@@ -18,7 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.AddPartitionFieldClause;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -36,13 +35,6 @@ public class AddPartitionFieldOpTest {
         Assertions.assertEquals("category", op.getColumnName());
         Assertions.assertNull(op.getPartitionFieldName());
         Assertions.assertEquals("ADD PARTITION KEY category", op.toSql());
-
-        AddPartitionFieldClause clause = (AddPartitionFieldClause) op.translateToLegacyAlterClause();
-        Assertions.assertNotNull(clause);
-        Assertions.assertNull(clause.getTransformName());
-        Assertions.assertNull(clause.getTransformArg());
-        Assertions.assertEquals("category", clause.getColumnName());
-        Assertions.assertNull(clause.getPartitionFieldName());
     }
 
     @Test
@@ -51,13 +43,6 @@ public class AddPartitionFieldOpTest {
         Assertions.assertEquals("category", op.getColumnName());
         Assertions.assertEquals("category_partition", op.getPartitionFieldName());
         Assertions.assertEquals("ADD PARTITION KEY category AS category_partition", op.toSql());
-
-        AddPartitionFieldClause clause = (AddPartitionFieldClause) op.translateToLegacyAlterClause();
-        Assertions.assertNotNull(clause);
-        Assertions.assertNull(clause.getTransformName());
-        Assertions.assertNull(clause.getTransformArg());
-        Assertions.assertEquals("category", clause.getColumnName());
-        Assertions.assertEquals("category_partition", clause.getPartitionFieldName());
     }
 
     @Test
@@ -76,12 +61,6 @@ public class AddPartitionFieldOpTest {
         Assertions.assertEquals("ts", op.getColumnName());
         Assertions.assertEquals("ts_year", op.getPartitionFieldName());
         Assertions.assertEquals("ADD PARTITION KEY year(ts) AS ts_year", op.toSql());
-
-        AddPartitionFieldClause clause = (AddPartitionFieldClause) op.translateToLegacyAlterClause();
-        Assertions.assertEquals("year", clause.getTransformName());
-        Assertions.assertNull(clause.getTransformArg());
-        Assertions.assertEquals("ts", clause.getColumnName());
-        Assertions.assertEquals("ts_year", clause.getPartitionFieldName());
     }
 
     @Test
@@ -101,12 +80,6 @@ public class AddPartitionFieldOpTest {
         Assertions.assertEquals("id", op.getColumnName());
         Assertions.assertEquals("id_bucket_16", op.getPartitionFieldName());
         Assertions.assertEquals("ADD PARTITION KEY bucket(16, id) AS id_bucket_16", op.toSql());
-
-        AddPartitionFieldClause clause = (AddPartitionFieldClause) op.translateToLegacyAlterClause();
-        Assertions.assertEquals("bucket", clause.getTransformName());
-        Assertions.assertEquals(16, clause.getTransformArg());
-        Assertions.assertEquals("id", clause.getColumnName());
-        Assertions.assertEquals("id_bucket_16", clause.getPartitionFieldName());
     }
 
     @Test
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFieldOpTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFieldOpTest.java
index 9b387afcc5b..1739620b6f8 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFieldOpTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/DropPartitionFieldOpTest.java
@@ -18,7 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.DropPartitionFieldClause;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -34,11 +33,6 @@ public class DropPartitionFieldOpTest {
         Assertions.assertEquals("ts_year", op.getPartitionFieldName());
         Assertions.assertNull(op.getTransformName());
         Assertions.assertEquals("DROP PARTITION KEY ts_year", op.toSql());
-
-        DropPartitionFieldClause clause = (DropPartitionFieldClause) op.translateToLegacyAlterClause();
-        Assertions.assertNotNull(clause);
-        Assertions.assertEquals("ts_year", clause.getPartitionFieldName());
-        Assertions.assertNull(clause.getTransformName());
     }
 
     @Test
@@ -50,13 +44,6 @@ public class DropPartitionFieldOpTest {
         Assertions.assertEquals(16, op.getTransformArg());
         Assertions.assertEquals("id", op.getColumnName());
         Assertions.assertEquals("DROP PARTITION KEY bucket(16, id)", op.toSql());
-
-        DropPartitionFieldClause clause = (DropPartitionFieldClause) op.translateToLegacyAlterClause();
-        Assertions.assertNotNull(clause);
-        Assertions.assertNull(clause.getPartitionFieldName());
-        Assertions.assertEquals("bucket", clause.getTransformName());
-        Assertions.assertEquals(16, clause.getTransformArg());
-        Assertions.assertEquals("id", clause.getColumnName());
     }
 
     @Test
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionFieldOpTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionFieldOpTest.java
index d7ca738fb83..bec89ff8196 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionFieldOpTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/info/ReplacePartitionFieldOpTest.java
@@ -18,7 +18,6 @@
 package org.apache.doris.nereids.trees.plans.commands.info;
 
 import org.apache.doris.alter.AlterOpType;
-import org.apache.doris.analysis.ReplacePartitionFieldClause;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -48,12 +47,6 @@ public class ReplacePartitionFieldOpTest {
         Assertions.assertEquals("ts", op.getNewColumnName());
         Assertions.assertEquals("ts_month", op.getNewPartitionFieldName());
         Assertions.assertEquals("REPLACE PARTITION KEY ts_year WITH month(ts) AS ts_month", op.toSql());
-
-        ReplacePartitionFieldClause clause = (ReplacePartitionFieldClause) op.translateToLegacyAlterClause();
-        Assertions.assertNotNull(clause);
-        Assertions.assertEquals("ts_year", clause.getOldPartitionFieldName());
-        Assertions.assertNull(clause.getOldTransformName());
-        Assertions.assertEquals("month", clause.getNewTransformName());
     }
 
     @Test
@@ -123,12 +116,6 @@ public class ReplacePartitionFieldOpTest {
         Assertions.assertEquals(16, op.getOldTransformArg());
         Assertions.assertEquals("id", op.getOldColumnName());
         Assertions.assertEquals("REPLACE PARTITION KEY bucket(16, id) WITH truncate(5, code) AS code_trunc", op.toSql());
-
-        ReplacePartitionFieldClause clause = (ReplacePartitionFieldClause) op.translateToLegacyAlterClause();
-        Assertions.assertNull(clause.getOldPartitionFieldName());
-        Assertions.assertEquals("bucket", clause.getOldTransformName());
-        Assertions.assertEquals(16, clause.getOldTransformArg());
-        Assertions.assertEquals("id", clause.getOldColumnName());
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org