This is an automated email from the ASF dual-hosted git repository.

shuwenwei pushed a commit to branch sync-generic-changes
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 0bcc2135bb3715e509db431eb05c852f6f4417f8
Author: shuwenwei <[email protected]>
AuthorDate: Fri Sep 18 08:38:08 2026 +0800

    set table column properties
---
 .../consensus/request/ConfigPhysicalPlan.java      |   4 +
 .../consensus/request/ConfigPhysicalPlanType.java  |   1 +
 .../request/ConfigPhysicalPlanVisitor.java         |   8 +
 .../write/table/SetTableColumnPropertiesPlan.java  |  80 ++++++++
 .../iotdb/confignode/manager/ConfigManager.java    |   2 +
 .../iotdb/confignode/manager/ProcedureManager.java |  21 ++
 .../receiver/protocol/IoTDBConfigNodeReceiver.java |  19 ++
 .../PipeConfigPhysicalPlanTSStatusVisitor.java     |   7 +
 .../pipe/source/ConfigRegionListeningFilter.java   |   2 +
 .../manager/schema/ClusterSchemaManager.java       |  55 ++++++
 .../persistence/executor/ConfigPlanExecutor.java   |   4 +
 .../persistence/schema/ClusterSchemaInfo.java      |  11 ++
 .../confignode/persistence/schema/ConfigMTree.java |  22 +++
 ...re.java => AbstractSetPropertiesProcedure.java} |  71 +++----
 .../table/SetTableColumnPropertiesProcedure.java   | 107 ++++++++++
 .../schema/table/SetTablePropertiesProcedure.java  | 218 ++-------------------
 .../procedure/store/ProcedureFactory.java          |   9 +
 .../table/AlterOrDropTableOperationType.java       |   5 +-
 18 files changed, 398 insertions(+), 248 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
index 0d9ca912571..c70b8c12fcf 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
@@ -118,6 +118,7 @@ import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RollbackCreateTablePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreDeleteTablePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
+import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnPropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.view.AddTableViewColumnPlan;
@@ -430,6 +431,9 @@ public abstract class ConfigPhysicalPlan implements 
IConsensusRequest {
         case SetTableProperties:
           plan = new SetTablePropertiesPlan(configPhysicalPlanType);
           break;
+        case SetTableColumnProperties:
+          plan = new SetTableColumnPropertiesPlan(configPhysicalPlanType);
+          break;
         case SetViewProperties:
           plan = new SetViewPropertiesPlan();
           break;
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
index 1be95181414..dbc6988ba87 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
@@ -233,6 +233,7 @@ public enum ConfigPhysicalPlanType {
   AlterColumnDataType((short) 878),
   PreAlterColumnDataType((short) 879),
   RollbackPreDeleteTable((short) 880),
+  SetTableColumnProperties((short) 881),
 
   /** Deprecated types for sync, restored them for upgrade. */
   @Deprecated
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java
index 53e3c4cd37d..283aee3ae58 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java
@@ -39,6 +39,7 @@ import 
org.apache.iotdb.confignode.consensus.request.write.table.CommitDeleteTab
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTableColumnPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
+import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnPropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.view.AddTableViewColumnPlan;
@@ -174,6 +175,8 @@ public abstract class ConfigPhysicalPlanVisitor<R, C> {
         return visitAddTableViewColumn((AddTableViewColumnPlan) plan, context);
       case SetTableProperties:
         return visitSetTableProperties((SetTablePropertiesPlan) plan, context);
+      case SetTableColumnProperties:
+        return visitSetTableColumnProperties((SetTableColumnPropertiesPlan) 
plan, context);
       case SetViewProperties:
         return visitSetViewProperties((SetViewPropertiesPlan) plan, context);
       case RenameTableColumn:
@@ -462,6 +465,11 @@ public abstract class ConfigPhysicalPlanVisitor<R, C> {
     return visitPlan(setTablePropertiesPlan, context);
   }
 
+  public R visitSetTableColumnProperties(
+      final SetTableColumnPropertiesPlan setTableColumnPropertiesPlan, final C 
context) {
+    return visitPlan(setTableColumnPropertiesPlan, context);
+  }
+
   // Use set table properties by default
   public R visitSetViewProperties(
       final SetViewPropertiesPlan setViewPropertiesPlan, final C context) {
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/table/SetTableColumnPropertiesPlan.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/table/SetTableColumnPropertiesPlan.java
new file mode 100644
index 00000000000..89b18cafc84
--- /dev/null
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/table/SetTableColumnPropertiesPlan.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.confignode.consensus.request.write.table;
+
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType;
+
+import org.apache.tsfile.utils.ReadWriteIOUtils;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+public class SetTableColumnPropertiesPlan extends AbstractTablePlan {
+
+  private String columnName;
+  private Map<String, String> properties;
+  private boolean isRollback;
+
+  public SetTableColumnPropertiesPlan(final ConfigPhysicalPlanType type) {
+    super(type);
+  }
+
+  public SetTableColumnPropertiesPlan(
+      final String database,
+      final String tableName,
+      final String columnName,
+      final Map<String, String> properties,
+      final boolean isRollback) {
+    super(ConfigPhysicalPlanType.SetTableColumnProperties, database, 
tableName);
+    this.columnName = columnName;
+    this.properties = properties;
+    this.isRollback = isRollback;
+  }
+
+  public String getColumnName() {
+    return columnName;
+  }
+
+  public Map<String, String> getProperties() {
+    return properties;
+  }
+
+  public boolean isRollback() {
+    return isRollback;
+  }
+
+  @Override
+  protected void serializeImpl(final DataOutputStream stream) throws 
IOException {
+    super.serializeImpl(stream);
+    ReadWriteIOUtils.write(columnName, stream);
+    ReadWriteIOUtils.write(properties, stream);
+    ReadWriteIOUtils.write(isRollback, stream);
+  }
+
+  @Override
+  protected void deserializeImpl(final ByteBuffer buffer) throws IOException {
+    super.deserializeImpl(buffer);
+    this.columnName = ReadWriteIOUtils.readString(buffer);
+    this.properties = ReadWriteIOUtils.readMap(buffer);
+    this.isRollback = ReadWriteIOUtils.readBool(buffer);
+  }
+}
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 1c41618d90a..9b5e80a3e86 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -3314,6 +3314,8 @@ public class ConfigManager implements IManager {
           return procedureManager.alterTableAddColumn(req);
         case SET_PROPERTIES:
           return procedureManager.alterTableSetProperties(req);
+        case SET_COLUMN_PROPERTIES:
+          return procedureManager.alterTableSetColumnProperties(req);
         case RENAME_COLUMN:
           return procedureManager.alterTableRenameColumn(req);
         case DROP_COLUMN:
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
index 50b003d0494..056c756f683 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
@@ -113,6 +113,7 @@ import 
org.apache.iotdb.confignode.procedure.impl.schema.table.DropTableColumnPr
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.DropTableProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.RenameTableColumnProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.RenameTableProcedure;
+import 
org.apache.iotdb.confignode.procedure.impl.schema.table.SetTableColumnPropertiesProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.SetTablePropertiesProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.view.AddViewColumnProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.view.CreateTableViewProcedure;
@@ -2401,6 +2402,25 @@ public class ProcedureManager {
                 false));
   }
 
+  public TSStatus alterTableSetColumnProperties(final TAlterOrDropTableReq 
req) {
+    final String columnName = ReadWriteIOUtils.readString(req.updateInfo);
+    final SetTableColumnPropertiesProcedure procedure =
+        new SetTableColumnPropertiesProcedure(
+            req.database,
+            req.tableName,
+            columnName,
+            req.queryId,
+            ReadWriteIOUtils.readMap(req.updateInfo),
+            false);
+    return executeWithoutDuplicate(
+        req.database,
+        null,
+        req.tableName,
+        req.queryId,
+        ProcedureType.SET_TABLE_COLUMN_PROPERTIES_PROCEDURE,
+        procedure);
+  }
+
   public TSStatus alterTableRenameColumn(final TAlterOrDropTableReq req) {
     final boolean isView = req.isSetIsView() && req.isIsView();
     return executeWithoutDuplicate(
@@ -2652,6 +2672,7 @@ public class ProcedureManager {
         case ADD_VIEW_COLUMN_PROCEDURE:
         case SET_TABLE_PROPERTIES_PROCEDURE:
         case SET_VIEW_PROPERTIES_PROCEDURE:
+        case SET_TABLE_COLUMN_PROPERTIES_PROCEDURE:
         case RENAME_TABLE_COLUMN_PROCEDURE:
         case RENAME_VIEW_COLUMN_PROCEDURE:
         case DROP_TABLE_COLUMN_PROCEDURE:
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java
index 86f2320b344..936e54e00db 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java
@@ -79,6 +79,7 @@ import 
org.apache.iotdb.confignode.consensus.request.write.table.CommitDeleteTab
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTableColumnPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
+import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnPropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.view.AddTableViewColumnPlan;
@@ -116,6 +117,7 @@ import 
org.apache.iotdb.confignode.procedure.impl.schema.table.DropTableColumnPr
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.DropTableProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.RenameTableColumnProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.RenameTableProcedure;
+import 
org.apache.iotdb.confignode.procedure.impl.schema.table.SetTableColumnPropertiesProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.SetTablePropertiesProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.view.AddViewColumnProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.view.CreateTableViewProcedure;
@@ -572,6 +574,7 @@ public class IoTDBConfigNodeReceiver extends 
IoTDBFileReceiver {
       case AddTableColumn:
       case AddViewColumn:
       case SetTableProperties:
+      case SetTableColumnProperties:
       case SetViewProperties:
       case CommitDeleteColumn:
       case CommitDeleteViewColumn:
@@ -1034,6 +1037,22 @@ public class IoTDBConfigNodeReceiver extends 
IoTDBFileReceiver {
                     queryId,
                     ((SetTablePropertiesPlan) plan).getProperties(),
                     shouldMarkAsPipeRequest.get()));
+      case SetTableColumnProperties:
+        return configManager
+            .getProcedureManager()
+            .executeWithoutDuplicate(
+                ((SetTableColumnPropertiesPlan) plan).getDatabase(),
+                null,
+                ((SetTableColumnPropertiesPlan) plan).getTableName(),
+                queryId,
+                ProcedureType.SET_TABLE_COLUMN_PROPERTIES_PROCEDURE,
+                new SetTableColumnPropertiesProcedure(
+                    ((SetTableColumnPropertiesPlan) plan).getDatabase(),
+                    ((SetTableColumnPropertiesPlan) plan).getTableName(),
+                    ((SetTableColumnPropertiesPlan) plan).getColumnName(),
+                    queryId,
+                    ((SetTableColumnPropertiesPlan) plan).getProperties(),
+                    shouldMarkAsPipeRequest.get()));
       case SetViewProperties:
         return configManager
             .getProcedureManager()
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java
index b8607126e99..3b315b7ba3e 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java
@@ -42,6 +42,7 @@ import 
org.apache.iotdb.confignode.consensus.request.write.table.CommitDeleteTab
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTableColumnPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
+import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnPropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.template.CommitSetSchemaTemplatePlan;
@@ -536,6 +537,12 @@ public class PipeConfigPhysicalPlanTSStatusVisitor
     return visitCommonTablePlan(setTablePropertiesPlan, context);
   }
 
+  @Override
+  public TSStatus visitSetTableColumnProperties(
+      final SetTableColumnPropertiesPlan setTableColumnPropertiesPlan, final 
TSStatus context) {
+    return visitCommonTablePlan(setTableColumnPropertiesPlan, context);
+  }
+
   @Override
   public TSStatus visitCommitDeleteColumn(
       final CommitDeleteColumnPlan commitDeleteColumnPlan, final TSStatus 
context) {
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningFilter.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningFilter.java
index ff2cdd5649f..30daf6c9a88 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningFilter.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningFilter.java
@@ -124,6 +124,7 @@ public class ConfigRegionListeningFilter {
           Collections.unmodifiableList(
               Arrays.asList(
                   ConfigPhysicalPlanType.SetTableProperties,
+                  ConfigPhysicalPlanType.SetTableColumnProperties,
                   ConfigPhysicalPlanType.SetViewProperties,
                   ConfigPhysicalPlanType.SetTableComment,
                   ConfigPhysicalPlanType.SetViewComment,
@@ -287,6 +288,7 @@ public class ConfigRegionListeningFilter {
       case AddTableColumn:
       case AddViewColumn:
       case SetTableProperties:
+      case SetTableColumnProperties:
       case SetViewProperties:
       case SetTableComment:
       case SetViewComment:
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
index 840be42d48c..0e88a2712b9 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
@@ -1837,6 +1837,61 @@ public class ClusterSchemaManager {
     return new Pair<>(RpcUtils.SUCCESS_STATUS, updatedTable);
   }
 
+  public synchronized Pair<TSStatus, TsTable> updateTableColumnProperties(
+      final String database,
+      final String tableName,
+      final String columnName,
+      final Map<String, String> originalProperties,
+      final Map<String, String> updatedProperties)
+      throws MetadataException {
+    final TsTable originalTable = getTableIfExists(database, 
tableName).orElse(null);
+
+    if (Objects.isNull(originalTable)) {
+      return new Pair<>(
+          RpcUtils.getStatus(
+              TSStatusCode.TABLE_NOT_EXISTS,
+              String.format("Table '%s.%s' does not exist", database, 
tableName)),
+          null);
+    }
+
+    final Optional<Pair<TSStatus, TsTable>> result =
+        checkTable4View(database, originalTable, false);
+    if (result.isPresent()) {
+      return result.get();
+    }
+
+    if (Objects.isNull(originalTable.getColumnSchema(columnName))) {
+      return new Pair<>(
+          RpcUtils.getStatus(
+              TSStatusCode.COLUMN_NOT_EXISTS,
+              String.format("Column '%s' does not exist", columnName)),
+          null);
+    }
+
+    final TsTable updatedTable = new TsTable(originalTable);
+    final TsTableColumnSchema updatedColumn = 
updatedTable.getColumnSchema(columnName);
+    updatedProperties
+        .keySet()
+        .removeIf(
+            key -> Objects.equals(updatedProperties.get(key), 
updatedColumn.getProps().get(key)));
+    if (updatedProperties.isEmpty()) {
+      return new Pair<>(RpcUtils.SUCCESS_STATUS, null);
+    }
+
+    for (final Map.Entry<String, String> entry : updatedProperties.entrySet()) 
{
+      final String key = entry.getKey();
+      final String value = entry.getValue();
+      originalProperties.put(key, updatedColumn.getProps().get(key));
+      if (Objects.nonNull(value)) {
+        updatedColumn.getProps().put(key, value);
+      } else {
+        updatedColumn.getProps().remove(key);
+      }
+    }
+
+    return new Pair<>(RpcUtils.SUCCESS_STATUS, updatedTable);
+  }
+
   private void invalidateLastCache(final String database) {
     final Map<Integer, TDataNodeLocation> dataNodeLocationMap =
         getNodeManager().getRegisteredDataNodeLocations();
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
index 58bf86d6858..a09c283a48d 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
@@ -136,6 +136,7 @@ import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RollbackCreateTablePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreDeleteTablePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
+import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnPropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.view.PreCreateTableViewPlan;
@@ -588,6 +589,9 @@ public class ConfigPlanExecutor {
       case SetTableProperties:
       case SetViewProperties:
         return clusterSchemaInfo.setTableProperties((SetTablePropertiesPlan) 
physicalPlan);
+      case SetTableColumnProperties:
+        return clusterSchemaInfo.setTableColumnProperties(
+            (SetTableColumnPropertiesPlan) physicalPlan);
       case PreDeleteColumn:
       case PreDeleteViewColumn:
         return clusterSchemaInfo.preDeleteColumn((PreDeleteColumnPlan) 
physicalPlan);
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
index 1b9c880cd6a..3e900eca55c 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
@@ -69,6 +69,7 @@ import 
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RollbackCreateTablePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreDeleteTablePlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
+import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnPropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.view.PreCreateTableViewPlan;
@@ -1593,6 +1594,16 @@ public class ClusterSchemaInfo implements 
SnapshotProcessor {
                 plan.getProperties()));
   }
 
+  public TSStatus setTableColumnProperties(final SetTableColumnPropertiesPlan 
plan) {
+    return executeWithLock(
+        () ->
+            tableModelMTree.setTableColumnProperties(
+                getQualifiedDatabasePartialPath(plan.getDatabase()),
+                plan.getTableName(),
+                plan.getColumnName(),
+                plan.getProperties()));
+  }
+
   public TSStatus preDeleteColumn(final PreDeleteColumnPlan plan) {
     databaseReadWriteLock.writeLock().lock();
     try {
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
index 12f6a2baaa1..53536aa361c 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
@@ -980,6 +980,28 @@ public class ConfigMTree {
         });
   }
 
+  public void setTableColumnProperties(
+      final PartialPath database,
+      final String tableName,
+      final String columnName,
+      final Map<String, String> properties)
+      throws MetadataException {
+    final TsTable table = getTableNode(database, tableName).getTable();
+    final TsTableColumnSchema columnSchema = table.getColumnSchema(columnName);
+    if (Objects.isNull(columnSchema)) {
+      throw new ColumnNotExistsException(
+          PathUtils.unQualifyDatabaseName(database.getFullPath()), tableName, 
columnName);
+    }
+    properties.forEach(
+        (key, value) -> {
+          if (Objects.nonNull(value)) {
+            columnSchema.getProps().put(key, value);
+          } else {
+            columnSchema.getProps().remove(key);
+          }
+        });
+  }
+
   // Return true if removed column is an attribute column
   // false if measurement column
   public boolean preDeleteColumn(
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AbstractSetPropertiesProcedure.java
similarity index 76%
copy from 
iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java
copy to 
iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AbstractSetPropertiesProcedure.java
index 27e75e6c28c..be6f67007a3 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AbstractSetPropertiesProcedure.java
@@ -23,14 +23,11 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.exception.IoTDBException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.schema.table.TsTable;
-import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
-import 
org.apache.iotdb.confignode.consensus.request.write.table.view.SetViewPropertiesPlan;
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan;
 import org.apache.iotdb.confignode.i18n.ProcedureMessages;
 import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
 import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
-import 
org.apache.iotdb.confignode.procedure.impl.schema.table.view.SetViewPropertiesProcedure;
 import 
org.apache.iotdb.confignode.procedure.state.schema.SetTablePropertiesState;
-import org.apache.iotdb.confignode.procedure.store.ProcedureType;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import org.apache.tsfile.utils.Pair;
@@ -50,19 +47,20 @@ import static 
org.apache.iotdb.confignode.procedure.state.schema.SetTablePropert
 import static 
org.apache.iotdb.confignode.procedure.state.schema.SetTablePropertiesState.SET_PROPERTIES;
 import static 
org.apache.iotdb.confignode.procedure.state.schema.SetTablePropertiesState.VALIDATE_TABLE;
 
-public class SetTablePropertiesProcedure
+public abstract class AbstractSetPropertiesProcedure
     extends AbstractAlterOrDropTableProcedure<SetTablePropertiesState> {
 
-  private static final Logger LOGGER = 
LoggerFactory.getLogger(SetTablePropertiesProcedure.class);
+  private static final Logger LOGGER =
+      LoggerFactory.getLogger(AbstractSetPropertiesProcedure.class);
 
-  private Map<String, String> originalProperties = new HashMap<>();
-  private Map<String, String> updatedProperties;
+  protected Map<String, String> originalProperties = new HashMap<>();
+  protected Map<String, String> updatedProperties;
 
-  public SetTablePropertiesProcedure(final boolean isGeneratedByPipe) {
+  protected AbstractSetPropertiesProcedure(final boolean isGeneratedByPipe) {
     super(isGeneratedByPipe);
   }
 
-  public SetTablePropertiesProcedure(
+  protected AbstractSetPropertiesProcedure(
       final String database,
       final String tableName,
       final String queryId,
@@ -125,17 +123,9 @@ public class SetTablePropertiesProcedure
     }
   }
 
-  private void validateTable(final ConfigNodeProcedureEnv env) {
+  public void validateTable(final ConfigNodeProcedureEnv env) {
     try {
-      final Pair<TSStatus, TsTable> result =
-          env.getConfigManager()
-              .getClusterSchemaManager()
-              .updateTableProperties(
-                  database,
-                  tableName,
-                  originalProperties,
-                  updatedProperties,
-                  this instanceof SetViewPropertiesProcedure);
+      final Pair<TSStatus, TsTable> result = updateProperties(env);
       final TSStatus status = result.getLeft();
       if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         setFailure(new ProcedureException(new IoTDBException(status)));
@@ -148,6 +138,9 @@ public class SetTablePropertiesProcedure
     }
   }
 
+  protected abstract Pair<TSStatus, TsTable> 
updateProperties(ConfigNodeProcedureEnv env)
+      throws MetadataException;
+
   @Override
   protected void preRelease(final ConfigNodeProcedureEnv env) {
     super.preRelease(env);
@@ -158,11 +151,7 @@ public class SetTablePropertiesProcedure
     final TSStatus status =
         env.getConfigManager()
             .getClusterSchemaManager()
-            .executePlan(
-                this instanceof SetViewPropertiesProcedure
-                    ? new SetViewPropertiesPlan(database, tableName, 
updatedProperties)
-                    : new SetTablePropertiesPlan(database, tableName, 
updatedProperties),
-                isGeneratedByPipe);
+            .executePlan(createSetPropertiesPlan(updatedProperties, false), 
isGeneratedByPipe);
     if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
       setFailure(new ProcedureException(new IoTDBException(status)));
     } else {
@@ -170,10 +159,8 @@ public class SetTablePropertiesProcedure
     }
   }
 
-  @Override
-  protected String getActionMessage() {
-    return "set table properties";
-  }
+  protected abstract ConfigPhysicalPlan createSetPropertiesPlan(
+      Map<String, String> properties, boolean isRollback);
 
   @Override
   protected void rollbackState(
@@ -212,11 +199,7 @@ public class SetTablePropertiesProcedure
     final TSStatus status =
         env.getConfigManager()
             .getClusterSchemaManager()
-            .executePlan(
-                this instanceof SetViewPropertiesProcedure
-                    ? new SetViewPropertiesPlan(database, tableName, 
originalProperties)
-                    : new SetTablePropertiesPlan(database, tableName, 
originalProperties),
-                isGeneratedByPipe);
+            .executePlan(createSetPropertiesPlan(originalProperties, true), 
isGeneratedByPipe);
     if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
       setFailure(new ProcedureException(new IoTDBException(status)));
     }
@@ -237,26 +220,17 @@ public class SetTablePropertiesProcedure
     return VALIDATE_TABLE;
   }
 
-  @Override
-  public void serialize(final DataOutputStream stream) throws IOException {
-    stream.writeShort(
-        isGeneratedByPipe
-            ? 
ProcedureType.PIPE_ENRICHED_SET_TABLE_PROPERTIES_PROCEDURE.getTypeCode()
-            : ProcedureType.SET_TABLE_PROPERTIES_PROCEDURE.getTypeCode());
-    innerSerialize(stream);
-  }
-
   protected void innerSerialize(final DataOutputStream stream) throws 
IOException {
     super.serialize(stream);
+    serializeProperties(stream);
+  }
 
+  protected void serializeProperties(final DataOutputStream stream) throws 
IOException {
     ReadWriteIOUtils.write(originalProperties, stream);
     ReadWriteIOUtils.write(updatedProperties, stream);
   }
 
-  @Override
-  public void deserialize(final ByteBuffer byteBuffer) {
-    super.deserialize(byteBuffer);
-
+  protected void deserializeProperties(final ByteBuffer byteBuffer) {
     this.originalProperties = ReadWriteIOUtils.readMap(byteBuffer);
     this.updatedProperties = ReadWriteIOUtils.readMap(byteBuffer);
   }
@@ -264,7 +238,8 @@ public class SetTablePropertiesProcedure
   @Override
   public boolean equals(final Object o) {
     return super.equals(o)
-        && Objects.equals(updatedProperties, ((SetTablePropertiesProcedure) 
o).updatedProperties);
+        && Objects.equals(
+            updatedProperties, ((AbstractSetPropertiesProcedure) 
o).updatedProperties);
   }
 
   @Override
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTableColumnPropertiesProcedure.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTableColumnPropertiesProcedure.java
new file mode 100644
index 00000000000..996b192e343
--- /dev/null
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTableColumnPropertiesProcedure.java
@@ -0,0 +1,107 @@
+/*
+ * 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.iotdb.confignode.procedure.impl.schema.table;
+
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.exception.MetadataException;
+import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan;
+import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnPropertiesPlan;
+import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
+import org.apache.iotdb.confignode.procedure.store.ProcedureType;
+
+import org.apache.tsfile.utils.Pair;
+import org.apache.tsfile.utils.ReadWriteIOUtils;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Map;
+import java.util.Objects;
+
+public class SetTableColumnPropertiesProcedure extends 
AbstractSetPropertiesProcedure {
+
+  private String columnName;
+
+  public SetTableColumnPropertiesProcedure(final boolean isGeneratedByPipe) {
+    super(isGeneratedByPipe);
+  }
+
+  public SetTableColumnPropertiesProcedure(
+      final String database,
+      final String tableName,
+      final String columnName,
+      final String queryId,
+      final Map<String, String> properties,
+      final boolean isGeneratedByPipe) {
+    super(database, tableName, queryId, properties, isGeneratedByPipe);
+    this.columnName = columnName;
+  }
+
+  @Override
+  protected Pair<TSStatus, TsTable> updateProperties(final 
ConfigNodeProcedureEnv env)
+      throws MetadataException {
+    return env.getConfigManager()
+        .getClusterSchemaManager()
+        .updateTableColumnProperties(
+            database, tableName, columnName, originalProperties, 
updatedProperties);
+  }
+
+  @Override
+  protected ConfigPhysicalPlan createSetPropertiesPlan(
+      final Map<String, String> properties, final boolean isRollback) {
+    return new SetTableColumnPropertiesPlan(
+        database, tableName, columnName, properties, isRollback);
+  }
+
+  @Override
+  protected String getActionMessage() {
+    return "set table column properties";
+  }
+
+  @Override
+  public void serialize(final DataOutputStream stream) throws IOException {
+    stream.writeShort(
+        isGeneratedByPipe
+            ? 
ProcedureType.PIPE_ENRICHED_SET_TABLE_COLUMN_PROPERTIES_PROCEDURE.getTypeCode()
+            : 
ProcedureType.SET_TABLE_COLUMN_PROPERTIES_PROCEDURE.getTypeCode());
+    super.serialize(stream);
+    ReadWriteIOUtils.write(columnName, stream);
+    serializeProperties(stream);
+  }
+
+  @Override
+  public void deserialize(final ByteBuffer byteBuffer) {
+    super.deserialize(byteBuffer);
+    this.columnName = ReadWriteIOUtils.readString(byteBuffer);
+    deserializeProperties(byteBuffer);
+  }
+
+  @Override
+  public boolean equals(final Object o) {
+    return super.equals(o)
+        && Objects.equals(columnName, ((SetTableColumnPropertiesProcedure) 
o).columnName);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), columnName);
+  }
+}
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java
index 27e75e6c28c..8cf3026d043 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java
@@ -20,43 +20,23 @@
 package org.apache.iotdb.confignode.procedure.impl.schema.table;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.exception.IoTDBException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.table.view.SetViewPropertiesPlan;
-import org.apache.iotdb.confignode.i18n.ProcedureMessages;
 import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
-import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.view.SetViewPropertiesProcedure;
-import 
org.apache.iotdb.confignode.procedure.state.schema.SetTablePropertiesState;
 import org.apache.iotdb.confignode.procedure.store.ProcedureType;
-import org.apache.iotdb.rpc.TSStatusCode;
 
 import org.apache.tsfile.utils.Pair;
-import org.apache.tsfile.utils.ReadWriteIOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.HashMap;
 import java.util.Map;
-import java.util.Objects;
 
-import static 
org.apache.iotdb.confignode.procedure.state.schema.SetTablePropertiesState.COMMIT_RELEASE;
-import static 
org.apache.iotdb.confignode.procedure.state.schema.SetTablePropertiesState.PRE_RELEASE;
-import static 
org.apache.iotdb.confignode.procedure.state.schema.SetTablePropertiesState.SET_PROPERTIES;
-import static 
org.apache.iotdb.confignode.procedure.state.schema.SetTablePropertiesState.VALIDATE_TABLE;
-
-public class SetTablePropertiesProcedure
-    extends AbstractAlterOrDropTableProcedure<SetTablePropertiesState> {
-
-  private static final Logger LOGGER = 
LoggerFactory.getLogger(SetTablePropertiesProcedure.class);
-
-  private Map<String, String> originalProperties = new HashMap<>();
-  private Map<String, String> updatedProperties;
+public class SetTablePropertiesProcedure extends 
AbstractSetPropertiesProcedure {
 
   public SetTablePropertiesProcedure(final boolean isGeneratedByPipe) {
     super(isGeneratedByPipe);
@@ -68,106 +48,28 @@ public class SetTablePropertiesProcedure
       final String queryId,
       final Map<String, String> properties,
       final boolean isGeneratedByPipe) {
-    super(database, tableName, queryId, isGeneratedByPipe);
-    this.updatedProperties = properties;
+    super(database, tableName, queryId, properties, isGeneratedByPipe);
   }
 
   @Override
-  protected Flow executeFromState(
-      final ConfigNodeProcedureEnv env, final SetTablePropertiesState state)
-      throws InterruptedException {
-    final long startTime = System.currentTimeMillis();
-    try {
-      switch (state) {
-        case VALIDATE_TABLE:
-          validateTable(env);
-          LOGGER.info(
-              
ProcedureMessages.VALIDATE_TABLE_FOR_TABLE_WHEN_SETTING_PROPERTIES,
-              database,
-              tableName);
-          if (!isFailed() && Objects.isNull(table)) {
-            LOGGER.info(
-                
ProcedureMessages.THE_UPDATED_TABLE_HAS_THE_SAME_PROPERTIES_WITH_THE_ORIGINAL);
-            return Flow.NO_MORE_STATE;
-          }
-          break;
-        case PRE_RELEASE:
-          preRelease(env);
-          LOGGER.info(
-              
ProcedureMessages.PRE_RELEASE_INFO_FOR_TABLE_WHEN_SETTING_PROPERTIES,
-              database,
-              tableName);
-          break;
-        case SET_PROPERTIES:
-          setProperties(env);
-          LOGGER.info(ProcedureMessages.SET_PROPERTIES_TO_TABLE, database, 
tableName);
-          break;
-        case COMMIT_RELEASE:
-          commitRelease(env);
-          LOGGER.info(
-              
ProcedureMessages.COMMIT_RELEASE_INFO_OF_TABLE_WHEN_SETTING_PROPERTIES,
-              database,
-              tableName);
-          return Flow.NO_MORE_STATE;
-        default:
-          setFailure(
-              new 
ProcedureException(ProcedureMessages.UNRECOGNIZED_ADDTABLECOLUMNSTATE + state));
-          return Flow.NO_MORE_STATE;
-      }
-      return Flow.HAS_MORE_STATE;
-    } finally {
-      LOGGER.info(
-          ProcedureMessages.SETTABLEPROPERTIES_COSTS_MS,
-          database,
-          tableName,
-          state,
-          (System.currentTimeMillis() - startTime));
-    }
-  }
-
-  private void validateTable(final ConfigNodeProcedureEnv env) {
-    try {
-      final Pair<TSStatus, TsTable> result =
-          env.getConfigManager()
-              .getClusterSchemaManager()
-              .updateTableProperties(
-                  database,
-                  tableName,
-                  originalProperties,
-                  updatedProperties,
-                  this instanceof SetViewPropertiesProcedure);
-      final TSStatus status = result.getLeft();
-      if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-        setFailure(new ProcedureException(new IoTDBException(status)));
-        return;
-      }
-      table = result.getRight();
-      setNextState(PRE_RELEASE);
-    } catch (final MetadataException e) {
-      setFailure(new ProcedureException(e));
-    }
+  protected Pair<TSStatus, TsTable> updateProperties(final 
ConfigNodeProcedureEnv env)
+      throws MetadataException {
+    return env.getConfigManager()
+        .getClusterSchemaManager()
+        .updateTableProperties(
+            database,
+            tableName,
+            originalProperties,
+            updatedProperties,
+            this instanceof SetViewPropertiesProcedure);
   }
 
   @Override
-  protected void preRelease(final ConfigNodeProcedureEnv env) {
-    super.preRelease(env);
-    setNextState(SET_PROPERTIES);
-  }
-
-  private void setProperties(final ConfigNodeProcedureEnv env) {
-    final TSStatus status =
-        env.getConfigManager()
-            .getClusterSchemaManager()
-            .executePlan(
-                this instanceof SetViewPropertiesProcedure
-                    ? new SetViewPropertiesPlan(database, tableName, 
updatedProperties)
-                    : new SetTablePropertiesPlan(database, tableName, 
updatedProperties),
-                isGeneratedByPipe);
-    if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-      setFailure(new ProcedureException(new IoTDBException(status)));
-    } else {
-      setNextState(COMMIT_RELEASE);
-    }
+  protected ConfigPhysicalPlan createSetPropertiesPlan(
+      final Map<String, String> properties, final boolean isRollback) {
+    return this instanceof SetViewPropertiesProcedure
+        ? new SetViewPropertiesPlan(database, tableName, properties)
+        : new SetTablePropertiesPlan(database, tableName, properties);
   }
 
   @Override
@@ -175,68 +77,6 @@ public class SetTablePropertiesProcedure
     return "set table properties";
   }
 
-  @Override
-  protected void rollbackState(
-      final ConfigNodeProcedureEnv env, final SetTablePropertiesState state)
-      throws IOException, InterruptedException, ProcedureException {
-    final long startTime = System.currentTimeMillis();
-    try {
-      switch (state) {
-        case PRE_RELEASE:
-          LOGGER.info(
-              
ProcedureMessages.START_ROLLBACK_PRE_RELEASE_INFO_FOR_TABLE_WHEN_SETTING_PROPERTIES,
-              database,
-              table.getTableName());
-          rollbackPreRelease(env);
-          break;
-        case SET_PROPERTIES:
-          LOGGER.info(
-              ProcedureMessages.START_ROLLBACK_SET_PROPERTIES_TO_TABLE,
-              database,
-              table.getTableName());
-          rollbackSetProperties(env);
-          break;
-      }
-    } finally {
-      LOGGER.info(
-          ProcedureMessages.ROLLBACK_SETTABLEPROPERTIES_COSTS_MS,
-          state,
-          (System.currentTimeMillis() - startTime));
-    }
-  }
-
-  private void rollbackSetProperties(final ConfigNodeProcedureEnv env) {
-    if (table == null) {
-      return;
-    }
-    final TSStatus status =
-        env.getConfigManager()
-            .getClusterSchemaManager()
-            .executePlan(
-                this instanceof SetViewPropertiesProcedure
-                    ? new SetViewPropertiesPlan(database, tableName, 
originalProperties)
-                    : new SetTablePropertiesPlan(database, tableName, 
originalProperties),
-                isGeneratedByPipe);
-    if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-      setFailure(new ProcedureException(new IoTDBException(status)));
-    }
-  }
-
-  @Override
-  protected SetTablePropertiesState getState(final int stateId) {
-    return SetTablePropertiesState.values()[stateId];
-  }
-
-  @Override
-  protected int getStateId(final SetTablePropertiesState state) {
-    return state.ordinal();
-  }
-
-  @Override
-  protected SetTablePropertiesState getInitialState() {
-    return VALIDATE_TABLE;
-  }
-
   @Override
   public void serialize(final DataOutputStream stream) throws IOException {
     stream.writeShort(
@@ -246,29 +86,9 @@ public class SetTablePropertiesProcedure
     innerSerialize(stream);
   }
 
-  protected void innerSerialize(final DataOutputStream stream) throws 
IOException {
-    super.serialize(stream);
-
-    ReadWriteIOUtils.write(originalProperties, stream);
-    ReadWriteIOUtils.write(updatedProperties, stream);
-  }
-
   @Override
   public void deserialize(final ByteBuffer byteBuffer) {
     super.deserialize(byteBuffer);
-
-    this.originalProperties = ReadWriteIOUtils.readMap(byteBuffer);
-    this.updatedProperties = ReadWriteIOUtils.readMap(byteBuffer);
-  }
-
-  @Override
-  public boolean equals(final Object o) {
-    return super.equals(o)
-        && Objects.equals(updatedProperties, ((SetTablePropertiesProcedure) 
o).updatedProperties);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(super.hashCode(), updatedProperties);
+    deserializeProperties(byteBuffer);
   }
 }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
index 165b048b636..0f6b2fa75e1 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
@@ -62,6 +62,7 @@ import 
org.apache.iotdb.confignode.procedure.impl.schema.table.DropTableColumnPr
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.DropTableProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.RenameTableColumnProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.RenameTableProcedure;
+import 
org.apache.iotdb.confignode.procedure.impl.schema.table.SetTableColumnPropertiesProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.SetTablePropertiesProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.view.AddViewColumnProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.table.view.CreateTableViewProcedure;
@@ -237,6 +238,9 @@ public class ProcedureFactory implements IProcedureFactory {
       case SET_VIEW_PROPERTIES_PROCEDURE:
         procedure = new SetViewPropertiesProcedure(false);
         break;
+      case SET_TABLE_COLUMN_PROPERTIES_PROCEDURE:
+        procedure = new SetTableColumnPropertiesProcedure(false);
+        break;
       case RENAME_TABLE_COLUMN_PROCEDURE:
         procedure = new RenameTableColumnProcedure(false);
         break;
@@ -318,6 +322,9 @@ public class ProcedureFactory implements IProcedureFactory {
       case PIPE_ENRICHED_SET_TABLE_PROPERTIES_PROCEDURE:
         procedure = new SetTablePropertiesProcedure(true);
         break;
+      case PIPE_ENRICHED_SET_TABLE_COLUMN_PROPERTIES_PROCEDURE:
+        procedure = new SetTableColumnPropertiesProcedure(true);
+        break;
       case PIPE_ENRICHED_RENAME_TABLE_COLUMN_PROCEDURE:
         procedure = new RenameTableColumnProcedure(true);
         break;
@@ -498,6 +505,8 @@ public class ProcedureFactory implements IProcedureFactory {
       return ProcedureType.SET_VIEW_PROPERTIES_PROCEDURE;
     } else if (procedure instanceof SetTablePropertiesProcedure) {
       return ProcedureType.SET_TABLE_PROPERTIES_PROCEDURE;
+    } else if (procedure instanceof SetTableColumnPropertiesProcedure) {
+      return ProcedureType.SET_TABLE_COLUMN_PROPERTIES_PROCEDURE;
     } else if (procedure instanceof RenameViewColumnProcedure) {
       return ProcedureType.RENAME_VIEW_COLUMN_PROCEDURE;
     } else if (procedure instanceof RenameTableColumnProcedure) {
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/AlterOrDropTableOperationType.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/AlterOrDropTableOperationType.java
index 46a8d5ddf3e..13f9d51798d 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/AlterOrDropTableOperationType.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/AlterOrDropTableOperationType.java
@@ -28,7 +28,8 @@ public enum AlterOrDropTableOperationType {
   DROP_TABLE((byte) 5),
   COMMENT_TABLE((byte) 6),
   COMMENT_COLUMN((byte) 7),
-  ALTER_COLUMN_DATA_TYPE((byte) 8);
+  ALTER_COLUMN_DATA_TYPE((byte) 8),
+  SET_COLUMN_PROPERTIES((byte) 9);
 
   private final byte type;
 
@@ -60,6 +61,8 @@ public enum AlterOrDropTableOperationType {
         return COMMENT_COLUMN;
       case 8:
         return ALTER_COLUMN_DATA_TYPE;
+      case 9:
+        return SET_COLUMN_PROPERTIES;
       default:
         throw new IllegalArgumentException();
     }

Reply via email to