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

tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 270e0d3a224 Region operations for table model (#14794)
270e0d3a224 is described below

commit 270e0d3a224226137162dc722ece8199e45455ba
Author: Li Yu Heng <[email protected]>
AuthorDate: Fri Feb 7 14:31:34 2025 +0800

    Region operations for table model (#14794)
    
    * done for table mode
    
    * distinguish table and tree model
    
    * distinguish table and tree model
    
    * self review
---
 .../iotdb/confignode/manager/ProcedureManager.java | 36 +++++++--
 .../iotdb/db/queryengine/plan/Coordinator.java     | 10 ++-
 .../queryengine/plan/analyze/AnalyzeVisitor.java   |  4 +-
 .../execution/config/TableConfigTaskVisitor.java   | 45 +++++++++++
 .../config/executor/ClusterConfigTaskExecutor.java | 39 +++++-----
 .../config/executor/IConfigTaskExecutor.java       | 17 ++--
 .../config/metadata/region/ExtendRegionTask.java   | 20 ++++-
 .../config/metadata/region/MigrateRegionTask.java  | 21 ++++-
 .../metadata/region/ReconstructRegionTask.java     | 25 +++++-
 .../config/metadata/region/RemoveRegionTask.java   | 20 ++++-
 .../plan/relational/sql/ast/AstVisitor.java        | 16 ++++
 .../plan/relational/sql/ast/ExtendRegion.java      | 77 ++++++++++++++++++
 .../plan/relational/sql/ast/MigrateRegion.java     | 90 ++++++++++++++++++++++
 .../plan/relational/sql/ast/ReconstructRegion.java | 76 ++++++++++++++++++
 .../plan/relational/sql/ast/RemoveRegion.java      | 77 ++++++++++++++++++
 .../plan/relational/sql/parser/AstBuilder.java     | 33 +++++++-
 .../db/storageengine/load/LoadTsFileManager.java   |  5 +-
 .../iotdb/db/utils/constant/SqlConstant.java       |  2 +-
 .../db/relational/grammar/sql/RelationalSql.g4     | 16 ++++
 .../src/main/thrift/confignode.thrift              |  4 +
 20 files changed, 586 insertions(+), 47 deletions(-)

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 2b2acd14019..002fcf859ff 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
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.confignode.manager;
 
+import org.apache.iotdb.common.rpc.thrift.Model;
 import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
 import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
 import org.apache.iotdb.common.rpc.thrift.TDataNodeConfiguration;
@@ -140,6 +141,7 @@ import 
org.apache.iotdb.confignode.rpc.thrift.TUnsubscribeReq;
 import org.apache.iotdb.consensus.ConsensusFactory;
 import org.apache.iotdb.db.exception.BatchProcessException;
 import org.apache.iotdb.db.schemaengine.template.Template;
+import org.apache.iotdb.db.utils.constant.SqlConstant;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 
@@ -714,7 +716,8 @@ public class ProcedureManager {
             Arrays.asList(
                 new Pair<>("Original DataNode", originalDataNode),
                 new Pair<>("Destination DataNode", destDataNode),
-                new Pair<>("Coordinator for add peer", 
coordinatorForAddPeer)));
+                new Pair<>("Coordinator for add peer", coordinatorForAddPeer)),
+            migrateRegionReq.getModel());
     if (configManager
         .getPartitionManager()
         .getAllReplicaSets(originalDataNode.getDataNodeId())
@@ -755,7 +758,8 @@ public class ProcedureManager {
             targetDataNode,
             Arrays.asList(
                 new Pair<>("Target DataNode", targetDataNode),
-                new Pair<>("Coordinator", coordinator)));
+                new Pair<>("Coordinator", coordinator)),
+            req.getModel());
 
     ConfigNodeConfig conf = ConfigNodeDescriptor.getInstance().getConf();
     if (configManager
@@ -796,7 +800,8 @@ public class ProcedureManager {
             targetDataNode,
             Arrays.asList(
                 new Pair<>("Target DataNode", targetDataNode),
-                new Pair<>("Coordinator", coordinator)));
+                new Pair<>("Coordinator", coordinator)),
+            req.getModel());
     if (configManager
         .getPartitionManager()
         .getAllReplicaSets(targetDataNode.getDataNodeId())
@@ -828,9 +833,9 @@ public class ProcedureManager {
             targetDataNode,
             Arrays.asList(
                 new Pair<>("Target DataNode", targetDataNode),
-                new Pair<>("Coordinator", coordinator)));
+                new Pair<>("Coordinator", coordinator)),
+            req.getModel());
 
-    ConfigNodeConfig conf = ConfigNodeDescriptor.getInstance().getConf();
     if (configManager
             .getPartitionManager()
             .getAllReplicaSetsMap(regionId.getType())
@@ -869,10 +874,11 @@ public class ProcedureManager {
   private String regionOperationCommonCheck(
       TConsensusGroupId regionId,
       TDataNodeLocation targetDataNode,
-      List<Pair<String, TDataNodeLocation>> relatedDataNodes) {
+      List<Pair<String, TDataNodeLocation>> relatedDataNodes,
+      Model model) {
     String failMessage;
-
     ConfigNodeConfig conf = ConfigNodeDescriptor.getInstance().getConf();
+
     if (TConsensusGroupType.DataRegion == regionId.getType()
         && 
ConsensusFactory.SIMPLE_CONSENSUS.equals(conf.getDataRegionConsensusProtocolClass()))
 {
       failMessage = "SimpleConsensus not supports region operation.";
@@ -899,6 +905,8 @@ public class ProcedureManager {
     } else if ((failMessage = checkRegionOperationWithRemoveDataNode(regionId, 
targetDataNode))
         != null) {
       // need to do nothing more
+    } else if ((failMessage = checkRegionOperationModelCorrectness(regionId, 
model)) != null) {
+      // need to do nothing more
     }
 
     return failMessage;
@@ -963,6 +971,20 @@ public class ProcedureManager {
     return null;
   }
 
+  private String checkRegionOperationModelCorrectness(TConsensusGroupId 
regionId, Model model) {
+    String databaseName = 
configManager.getPartitionManager().getRegionDatabase(regionId);
+    boolean isTreeModelDatabase = 
databaseName.startsWith(SqlConstant.TREE_MODEL_DATABASE_PREFIX);
+    if (Model.TREE == model && isTreeModelDatabase
+        || Model.TABLE == model && !isTreeModelDatabase) {
+      return null;
+    }
+    return String.format(
+        "The region's database %s is belong to %s model, but the model you are 
operating is %s",
+        databaseName,
+        isTreeModelDatabase ? Model.TREE.toString() : Model.TABLE.toString(),
+        model.toString());
+  }
+
   // end region
 
   public TSStatus migrateRegion(TMigrateRegionReq migrateRegionReq) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
index a0602bec83d..3ab76899366 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
@@ -70,11 +70,15 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropColumn;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropDB;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropFunction;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropTable;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExtendRegion;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Flush;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.KillQuery;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.MigrateRegion;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.PipeStatement;
+import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetConfiguration;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetProperties;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowAINodes;
@@ -423,7 +427,11 @@ public class Coordinator {
         || statement instanceof CreateFunction
         || statement instanceof DropFunction
         || statement instanceof ShowFunctions
-        || statement instanceof RelationalAuthorStatement) {
+        || statement instanceof RelationalAuthorStatement
+        || statement instanceof MigrateRegion
+        || statement instanceof ReconstructRegion
+        || statement instanceof ExtendRegion
+        || statement instanceof RemoveRegion) {
       return new ConfigExecution(
           queryContext,
           null,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index f7d0f4c8f59..27111794cc9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -220,7 +220,7 @@ import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.optimizati
 import static 
org.apache.iotdb.db.schemaengine.schemaregion.view.visitor.GetSourcePathsVisitor.getSourcePaths;
 import static 
org.apache.iotdb.db.storageengine.load.metrics.LoadTsFileCostMetricsSet.ANALYSIS;
 import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME_HEADER;
-import static org.apache.iotdb.db.utils.constant.SqlConstant.ROOT_DOT;
+import static 
org.apache.iotdb.db.utils.constant.SqlConstant.TREE_MODEL_DATABASE_PREFIX;
 
 /** This visitor is used to analyze each type of Statement and returns the 
{@link Analysis}. */
 public class AnalyzeVisitor extends StatementVisitor<Analysis, 
MPPQueryContext> {
@@ -2430,7 +2430,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         if (viewPath != null) {
           try {
             // if it's really view path, it should start with root.
-            if (viewPath.startsWith(ROOT_DOT)) {
+            if (viewPath.startsWith(TREE_MODEL_DATABASE_PREFIX)) {
               sourcePath = new MeasurementPath(viewPath);
             } else {
               // otherwise it should just be an alias
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
index 18dd15c3ae2..221b0255ea8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
@@ -44,6 +44,10 @@ import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowFuncti
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowPipePluginsTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowRegionTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowVariablesTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ExtendRegionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.MigrateRegionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ReconstructRegionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.RemoveRegionTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.AlterDBTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.AlterTableAddColumnTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.AlterTableDropColumnTask;
@@ -116,15 +120,19 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropPipePlugin;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropTable;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropTopic;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExtendRegion;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Flush;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.KillQuery;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Literal;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LongLiteral;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.MigrateRegion;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Node;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Property;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.QualifiedName;
+import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameColumn;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameTable;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetConfiguration;
@@ -993,4 +1001,41 @@ public class TableConfigTaskVisitor extends 
AstVisitor<IConfigTask, MPPQueryCont
     context.setQueryType(QueryType.WRITE);
     return new DropFunctionTask(Model.TABLE, node.getUdfName());
   }
+
+  @Override
+  protected IConfigTask visitMigrateRegion(MigrateRegion migrateRegion, 
MPPQueryContext context) {
+    context.setQueryType(QueryType.WRITE);
+    
accessControl.checkUserHasMaintainPrivilege(context.getSession().getUserName());
+    // As the implementation is identical, we'll simply translate to the
+    // corresponding tree-model variant and execute that.
+    return new MigrateRegionTask(migrateRegion);
+  }
+
+  @Override
+  protected IConfigTask visitReconstructRegion(
+      ReconstructRegion reconstructRegion, MPPQueryContext context) {
+    context.setQueryType(QueryType.WRITE);
+    
accessControl.checkUserHasMaintainPrivilege(context.getSession().getUserName());
+    // As the implementation is identical, we'll simply translate to the
+    // corresponding tree-model variant and execute that.
+    return new ReconstructRegionTask(reconstructRegion);
+  }
+
+  @Override
+  protected IConfigTask visitExtendRegion(ExtendRegion extendRegion, 
MPPQueryContext context) {
+    context.setQueryType(QueryType.WRITE);
+    
accessControl.checkUserHasMaintainPrivilege(context.getSession().getUserName());
+    // As the implementation is identical, we'll simply translate to the
+    // corresponding tree-model variant and execute that.
+    return new ExtendRegionTask(extendRegion);
+  }
+
+  @Override
+  protected IConfigTask visitRemoveRegion(RemoveRegion removeRegion, 
MPPQueryContext context) {
+    context.setQueryType(QueryType.WRITE);
+    
accessControl.checkUserHasMaintainPrivilege(context.getSession().getUserName());
+    // As the implementation is identical, we'll simply translate to the
+    // corresponding tree-model variant and execute that.
+    return new RemoveRegionTask(removeRegion);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 4a70c5991c9..2f3ed1a0f2d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -187,6 +187,10 @@ import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowTTLTas
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowTriggersTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowVariablesTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.model.ShowModelsTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ExtendRegionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.MigrateRegionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ReconstructRegionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.RemoveRegionTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.DeleteDeviceTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.DescribeTableDetailsTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.DescribeTableTask;
@@ -241,10 +245,6 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.ShowPipePlug
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.ShowPipesStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.StartPipeStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.StopPipeStatement;
-import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ExtendRegionStatement;
-import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.MigrateRegionStatement;
-import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ReconstructRegionStatement;
-import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.RemoveRegionStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.CreateTopicStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropTopicStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowSubscriptionsStatement;
@@ -2780,16 +2780,16 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
   }
 
   @Override
-  public SettableFuture<ConfigTaskResult> migrateRegion(
-      final MigrateRegionStatement migrateRegionStatement) {
+  public SettableFuture<ConfigTaskResult> migrateRegion(final 
MigrateRegionTask migrateRegionTask) {
     final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
     try (ConfigNodeClient configNodeClient =
         
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
       final TMigrateRegionReq tMigrateRegionReq =
           new TMigrateRegionReq(
-              migrateRegionStatement.getRegionId(),
-              migrateRegionStatement.getFromId(),
-              migrateRegionStatement.getToId());
+              migrateRegionTask.getStatement().getRegionId(),
+              migrateRegionTask.getStatement().getFromId(),
+              migrateRegionTask.getStatement().getToId(),
+              migrateRegionTask.getModel());
       final TSStatus status = 
configNodeClient.migrateRegion(tMigrateRegionReq);
       if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         future.setException(new IoTDBException(status.message, status.code));
@@ -2869,14 +2869,15 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
 
   @Override
   public SettableFuture<ConfigTaskResult> reconstructRegion(
-      ReconstructRegionStatement reconstructRegionStatement) {
+      ReconstructRegionTask reconstructRegionTask) {
     final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
     try (ConfigNodeClient configNodeClient =
         
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
       final TReconstructRegionReq req =
           new TReconstructRegionReq(
-              reconstructRegionStatement.getRegionIds(),
-              reconstructRegionStatement.getDataNodeId());
+              reconstructRegionTask.getStatement().getRegionIds(),
+              reconstructRegionTask.getStatement().getDataNodeId(),
+              reconstructRegionTask.getModel());
       final TSStatus status = configNodeClient.reconstructRegion(req);
       if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         future.setException(new IoTDBException(status.message, status.code));
@@ -2891,14 +2892,15 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
   }
 
   @Override
-  public SettableFuture<ConfigTaskResult> extendRegion(
-      ExtendRegionStatement extendRegionStatement) {
+  public SettableFuture<ConfigTaskResult> extendRegion(ExtendRegionTask 
extendRegionTask) {
     final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
     try (ConfigNodeClient configNodeClient =
         
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
       final TExtendRegionReq req =
           new TExtendRegionReq(
-              extendRegionStatement.getRegionId(), 
extendRegionStatement.getDataNodeId());
+              extendRegionTask.getStatement().getRegionId(),
+              extendRegionTask.getStatement().getDataNodeId(),
+              extendRegionTask.getModel());
       final TSStatus status = configNodeClient.extendRegion(req);
       if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         future.setException(new IoTDBException(status.message, status.code));
@@ -2913,14 +2915,15 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
   }
 
   @Override
-  public SettableFuture<ConfigTaskResult> removeRegion(
-      RemoveRegionStatement removeRegionStatement) {
+  public SettableFuture<ConfigTaskResult> removeRegion(RemoveRegionTask 
removeRegionTask) {
     final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
     try (ConfigNodeClient configNodeClient =
         
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
       final TRemoveRegionReq req =
           new TRemoveRegionReq(
-              removeRegionStatement.getRegionId(), 
removeRegionStatement.getDataNodeId());
+              removeRegionTask.getStatement().getRegionId(),
+              removeRegionTask.getStatement().getDataNodeId(),
+              removeRegionTask.getModel());
       final TSStatus status = configNodeClient.removeRegion(req);
       if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         future.setException(new IoTDBException(status.message, status.code));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
index d34ae66ac16..b4c917373a1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -35,6 +35,10 @@ import org.apache.iotdb.db.protocol.session.IClientSession;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ExtendRegionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.MigrateRegionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ReconstructRegionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.RemoveRegionTask;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.view.AlterLogicalViewNode;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DeleteDevice;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropDB;
@@ -67,10 +71,6 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.ShowPipePlug
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.ShowPipesStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.StartPipeStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.StopPipeStatement;
-import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ExtendRegionStatement;
-import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.MigrateRegionStatement;
-import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ReconstructRegionStatement;
-import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.RemoveRegionStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.CreateTopicStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropTopicStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowSubscriptionsStatement;
@@ -253,14 +253,13 @@ public interface IConfigTaskExecutor {
   SettableFuture<ConfigTaskResult> countTimeSlotList(
       CountTimeSlotListStatement countTimeSlotListStatement);
 
-  SettableFuture<ConfigTaskResult> migrateRegion(MigrateRegionStatement 
migrateRegionStatement);
+  SettableFuture<ConfigTaskResult> migrateRegion(MigrateRegionTask 
migrateRegionTask);
 
-  SettableFuture<ConfigTaskResult> reconstructRegion(
-      ReconstructRegionStatement reconstructRegionStatement);
+  SettableFuture<ConfigTaskResult> reconstructRegion(ReconstructRegionTask 
reconstructRegionTask);
 
-  SettableFuture<ConfigTaskResult> extendRegion(ExtendRegionStatement 
extendRegionStatement);
+  SettableFuture<ConfigTaskResult> extendRegion(ExtendRegionTask 
extendRegionTask);
 
-  SettableFuture<ConfigTaskResult> removeRegion(RemoveRegionStatement 
removeRegionStatement);
+  SettableFuture<ConfigTaskResult> removeRegion(RemoveRegionTask 
removeRegionTask);
 
   SettableFuture<ConfigTaskResult> removeDataNode(RemoveDataNodeStatement 
removeDataNodeStatement);
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ExtendRegionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ExtendRegionTask.java
index 00dafd9d154..1ffce010927 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ExtendRegionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ExtendRegionTask.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region;
 
+import org.apache.iotdb.common.rpc.thrift.Model;
 import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
 import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExtendRegion;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ExtendRegionStatement;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -29,14 +31,30 @@ import com.google.common.util.concurrent.ListenableFuture;
 public class ExtendRegionTask implements IConfigTask {
 
   protected final ExtendRegionStatement statement;
+  private final Model model;
 
   public ExtendRegionTask(ExtendRegionStatement statement) {
     this.statement = statement;
+    this.model = Model.TREE;
+  }
+
+  public ExtendRegionTask(ExtendRegion extendRegion) {
+    this.statement =
+        new ExtendRegionStatement(extendRegion.getRegionId(), 
extendRegion.getDataNodeId());
+    this.model = Model.TABLE;
   }
 
   @Override
   public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor 
configTaskExecutor)
       throws InterruptedException {
-    return configTaskExecutor.extendRegion(statement);
+    return configTaskExecutor.extendRegion(this);
+  }
+
+  public ExtendRegionStatement getStatement() {
+    return statement;
+  }
+
+  public Model getModel() {
+    return model;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/MigrateRegionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/MigrateRegionTask.java
index fd22585aa8c..8c6f2bfe36b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/MigrateRegionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/MigrateRegionTask.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region;
 
+import org.apache.iotdb.common.rpc.thrift.Model;
 import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
 import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.MigrateRegion;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.MigrateRegionStatement;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -29,15 +31,32 @@ import com.google.common.util.concurrent.ListenableFuture;
 public class MigrateRegionTask implements IConfigTask {
 
   protected final MigrateRegionStatement statement;
+  private final Model model;
 
   public MigrateRegionTask(MigrateRegionStatement migrateRegionStatement) {
     this.statement = migrateRegionStatement;
+    this.model = Model.TREE;
+  }
+
+  public MigrateRegionTask(MigrateRegion migrateRegion) {
+    this.statement =
+        new MigrateRegionStatement(
+            migrateRegion.getRegionId(), migrateRegion.getFromId(), 
migrateRegion.getToId());
+    this.model = Model.TABLE;
   }
 
   @Override
   public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor 
configTaskExecutor) {
     // If the action is executed successfully, return the Future.
     // If your operation is async, you can return the corresponding future 
directly.
-    return configTaskExecutor.migrateRegion(statement);
+    return configTaskExecutor.migrateRegion(this);
+  }
+
+  public Model getModel() {
+    return this.model;
+  }
+
+  public MigrateRegionStatement getStatement() {
+    return statement;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ReconstructRegionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ReconstructRegionTask.java
index f5276ed64e7..e1d7127f749 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ReconstructRegionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ReconstructRegionTask.java
@@ -19,24 +19,43 @@
 
 package org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region;
 
+import org.apache.iotdb.common.rpc.thrift.Model;
 import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
 import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ReconstructRegionStatement;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 public class ReconstructRegionTask implements IConfigTask {
 
-  protected final ReconstructRegionStatement reconstructRegionStatement;
+  protected final ReconstructRegionStatement statement;
+  private final Model model;
 
   public ReconstructRegionTask(ReconstructRegionStatement 
reconstructRegionStatement) {
-    this.reconstructRegionStatement = reconstructRegionStatement;
+    this.statement = reconstructRegionStatement;
+    this.model = Model.TREE;
+  }
+
+  public ReconstructRegionTask(ReconstructRegion reconstructRegion) {
+    this.statement =
+        new ReconstructRegionStatement(
+            reconstructRegion.getDataNodeId(), 
reconstructRegion.getRegionIds());
+    this.model = Model.TABLE;
   }
 
   @Override
   public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor 
configTaskExecutor)
       throws InterruptedException {
-    return configTaskExecutor.reconstructRegion(reconstructRegionStatement);
+    return configTaskExecutor.reconstructRegion(this);
+  }
+
+  public Model getModel() {
+    return model;
+  }
+
+  public ReconstructRegionStatement getStatement() {
+    return statement;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/RemoveRegionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/RemoveRegionTask.java
index 26ecea097f7..86d4bafc9db 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/RemoveRegionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/RemoveRegionTask.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region;
 
+import org.apache.iotdb.common.rpc.thrift.Model;
 import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
 import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.RemoveRegionStatement;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -29,14 +31,30 @@ import com.google.common.util.concurrent.ListenableFuture;
 public class RemoveRegionTask implements IConfigTask {
 
   protected final RemoveRegionStatement statement;
+  private final Model model;
 
   public RemoveRegionTask(RemoveRegionStatement statement) {
     this.statement = statement;
+    this.model = Model.TREE;
+  }
+
+  public RemoveRegionTask(RemoveRegion removeRegion) {
+    this.statement =
+        new RemoveRegionStatement(removeRegion.getRegionId(), 
removeRegion.getDataNodeId());
+    this.model = Model.TABLE;
   }
 
   @Override
   public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor 
configTaskExecutor)
       throws InterruptedException {
-    return configTaskExecutor.removeRegion(statement);
+    return configTaskExecutor.removeRegion(this);
+  }
+
+  public RemoveRegionStatement getStatement() {
+    return statement;
+  }
+
+  public Model getModel() {
+    return model;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
index ed67e02098d..a5fa1f155fa 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
@@ -636,4 +636,20 @@ public abstract class AstVisitor<R, C> {
   protected R visitRelationalAuthorPlan(RelationalAuthorStatement node, C 
context) {
     return visitStatement(node, context);
   }
+
+  protected R visitMigrateRegion(MigrateRegion node, C context) {
+    return visitStatement(node, context);
+  }
+
+  protected R visitReconstructRegion(ReconstructRegion node, C context) {
+    return visitStatement(node, context);
+  }
+
+  protected R visitExtendRegion(ExtendRegion node, C context) {
+    return visitStatement(node, context);
+  }
+
+  protected R visitRemoveRegion(RemoveRegion node, C context) {
+    return visitStatement(node, context);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ExtendRegion.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ExtendRegion.java
new file mode 100644
index 00000000000..687777c8558
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ExtendRegion.java
@@ -0,0 +1,77 @@
+/*
+ * 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.db.queryengine.plan.relational.sql.ast;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+import java.util.Objects;
+
+public class ExtendRegion extends Statement {
+
+  private final int regionId;
+  private final int dataNodeId;
+
+  public ExtendRegion(int regionId, int dataNodeId) {
+    super(null);
+    this.regionId = regionId;
+    this.dataNodeId = dataNodeId;
+  }
+
+  @Override
+  public List<? extends Node> getChildren() {
+    return ImmutableList.of();
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(ExtendRegion.class, regionId, dataNodeId);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (!(obj instanceof ExtendRegion)) {
+      return false;
+    }
+    ExtendRegion another = (ExtendRegion) obj;
+    return regionId == another.regionId && dataNodeId == another.dataNodeId;
+  }
+
+  @Override
+  public String toString() {
+    return String.format("extend region %d to datanode %d", regionId, 
dataNodeId);
+  }
+
+  @Override
+  public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+    return visitor.visitExtendRegion(this, context);
+  }
+
+  public int getRegionId() {
+    return regionId;
+  }
+
+  public int getDataNodeId() {
+    return dataNodeId;
+  }
+}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/MigrateRegion.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/MigrateRegion.java
new file mode 100644
index 00000000000..4ec5497f471
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/MigrateRegion.java
@@ -0,0 +1,90 @@
+/*
+ * 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.db.queryengine.plan.relational.sql.ast;
+
+import com.google.common.collect.ImmutableList;
+
+import javax.annotation.Nullable;
+
+import java.util.List;
+import java.util.Objects;
+
+public class MigrateRegion extends Statement {
+  private final int regionId;
+
+  private final int fromId;
+
+  private final int toId;
+
+  public MigrateRegion(int regionId, int fromId, int toId) {
+    this(null, regionId, fromId, toId);
+  }
+
+  public MigrateRegion(@Nullable NodeLocation location, int regionId, int 
fromId, int toId) {
+    super(location);
+    this.regionId = regionId;
+    this.fromId = fromId;
+    this.toId = toId;
+  }
+
+  @Override
+  public List<? extends Node> getChildren() {
+    return ImmutableList.of();
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(MigrateRegion.class, regionId, fromId, toId);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (!(obj instanceof MigrateRegion)) {
+      return false;
+    }
+    MigrateRegion another = (MigrateRegion) obj;
+    return regionId == another.regionId && fromId == another.fromId && toId == 
another.toId;
+  }
+
+  @Override
+  public String toString() {
+    return String.format("migrate region %d from %d to %d", regionId, fromId, 
toId);
+  }
+
+  @Override
+  public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+    return visitor.visitMigrateRegion(this, context);
+  }
+
+  public int getRegionId() {
+    return regionId;
+  }
+
+  public int getFromId() {
+    return fromId;
+  }
+
+  public int getToId() {
+    return toId;
+  }
+}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ReconstructRegion.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ReconstructRegion.java
new file mode 100644
index 00000000000..df4aad22606
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ReconstructRegion.java
@@ -0,0 +1,76 @@
+/*
+ * 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.db.queryengine.plan.relational.sql.ast;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+import java.util.Objects;
+
+public class ReconstructRegion extends Statement {
+  final int dataNodeId;
+  final List<Integer> regionIds;
+
+  public ReconstructRegion(int dataNodeId, List<Integer> regionIds) {
+    super(null);
+    this.dataNodeId = dataNodeId;
+    this.regionIds = regionIds;
+  }
+
+  @Override
+  public List<? extends Node> getChildren() {
+    return ImmutableList.of();
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(ReconstructRegion.class, dataNodeId, regionIds);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (!(obj instanceof ReconstructRegion)) {
+      return false;
+    }
+    ReconstructRegion another = (ReconstructRegion) obj;
+    return dataNodeId == another.dataNodeId && 
regionIds.equals(another.regionIds);
+  }
+
+  @Override
+  public String toString() {
+    return String.format("reconstruct region %s of datanode %d", regionIds, 
dataNodeId);
+  }
+
+  @Override
+  public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+    return visitor.visitReconstructRegion(this, context);
+  }
+
+  public int getDataNodeId() {
+    return dataNodeId;
+  }
+
+  public List<Integer> getRegionIds() {
+    return regionIds;
+  }
+}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveRegion.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveRegion.java
new file mode 100644
index 00000000000..8c14433167a
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveRegion.java
@@ -0,0 +1,77 @@
+/*
+ * 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.db.queryengine.plan.relational.sql.ast;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+import java.util.Objects;
+
+public class RemoveRegion extends Statement {
+
+  private final int regionId;
+  private final int dataNodeId;
+
+  public RemoveRegion(int regionId, int dataNodeId) {
+    super(null);
+    this.regionId = regionId;
+    this.dataNodeId = dataNodeId;
+  }
+
+  @Override
+  public List<? extends Node> getChildren() {
+    return ImmutableList.of();
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(RemoveRegion.class, regionId, dataNodeId);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (!(obj instanceof RemoveRegion)) {
+      return false;
+    }
+    RemoveRegion another = (RemoveRegion) obj;
+    return regionId == another.regionId && dataNodeId == another.dataNodeId;
+  }
+
+  @Override
+  public String toString() {
+    return String.format("remove region %d from %d", regionId, dataNodeId);
+  }
+
+  @Override
+  public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+    return visitor.visitRemoveRegion(this, context);
+  }
+
+  public int getRegionId() {
+    return regionId;
+  }
+
+  public int getDataNodeId() {
+    return dataNodeId;
+  }
+}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
index 27465268674..c1802199e85 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
@@ -82,6 +82,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExistsPredicate;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Explain;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExplainAnalyze;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExtendRegion;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Fill;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Flush;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.FunctionCall;
@@ -108,6 +109,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Literal;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LoadTsFile;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LogicalExpression;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LongLiteral;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.MigrateRegion;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NaturalJoin;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Node;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NodeLocation;
@@ -124,9 +126,11 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.QuantifiedCompari
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Query;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.QueryBody;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.QuerySpecification;
+import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Relation;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameColumn;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameTable;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Row;
@@ -1141,7 +1145,34 @@ public class AstBuilder extends 
RelationalSqlBaseVisitor<Node> {
 
   @Override
   public Node 
visitMigrateRegionStatement(RelationalSqlParser.MigrateRegionStatementContext 
ctx) {
-    return super.visitMigrateRegionStatement(ctx);
+    return new MigrateRegion(
+        Integer.parseInt(ctx.regionId.getText()),
+        Integer.parseInt(ctx.fromId.getText()),
+        Integer.parseInt(ctx.toId.getText()));
+  }
+
+  @Override
+  public Node visitReconstructRegionStatement(
+      RelationalSqlParser.ReconstructRegionStatementContext ctx) {
+    int dataNodeId = Integer.parseInt(ctx.targetDataNodeId.getText());
+    List<Integer> regionIds =
+        ctx.regionIds.stream()
+            .map(Token::getText)
+            .map(Integer::parseInt)
+            .collect(Collectors.toList());
+    return new ReconstructRegion(dataNodeId, regionIds);
+  }
+
+  @Override
+  public Node 
visitExtendRegionStatement(RelationalSqlParser.ExtendRegionStatementContext 
ctx) {
+    return new ExtendRegion(
+        Integer.parseInt(ctx.regionId.getText()), 
Integer.parseInt(ctx.targetDataNodeId.getText()));
+  }
+
+  @Override
+  public Node 
visitRemoveRegionStatement(RelationalSqlParser.RemoveRegionStatementContext 
ctx) {
+    return new RemoveRegion(
+        Integer.parseInt(ctx.regionId.getText()), 
Integer.parseInt(ctx.targetDataNodeId.getText()));
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/LoadTsFileManager.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/LoadTsFileManager.java
index 41bbbafe901..74bf838a8d3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/LoadTsFileManager.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/LoadTsFileManager.java
@@ -77,7 +77,7 @@ import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Stream;
 
 import static org.apache.iotdb.db.utils.constant.SqlConstant.ROOT;
-import static org.apache.iotdb.db.utils.constant.SqlConstant.ROOT_DOT;
+import static 
org.apache.iotdb.db.utils.constant.SqlConstant.TREE_MODEL_DATABASE_PREFIX;
 
 /**
  * {@link LoadTsFileManager} is used for dealing with {@link 
LoadTsFilePieceNode} and {@link
@@ -445,7 +445,8 @@ public class LoadTsFileManager {
       // Table model needs to register TableSchema
       final String tableName =
           chunkData.getDevice() != null ? chunkData.getDevice().getTableName() 
: null;
-      if (tableName != null && !(tableName.startsWith(ROOT_DOT) || 
tableName.equals(ROOT))) {
+      if (tableName != null
+          && !(tableName.startsWith(TREE_MODEL_DATABASE_PREFIX) || 
tableName.equals(ROOT))) {
         writer
             .getSchema()
             .getTableSchemaMap()
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java
index cad8f229c4e..625af893561 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java
@@ -36,7 +36,7 @@ public class SqlConstant {
 
   public static final String ROOT = "root";
 
-  public static final String ROOT_DOT = "root.";
+  public static final String TREE_MODEL_DATABASE_PREFIX = "root.";
 
   public static final String QUOTE = "'";
   public static final String DQUOTE = "\"";
diff --git 
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
 
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
index 20180597005..3d825dcf7fb 100644
--- 
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
+++ 
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
@@ -108,6 +108,9 @@ statement
     | countTimeSlotListStatement
     | showSeriesSlotListStatement
     | migrateRegionStatement
+    | reconstructRegionStatement
+    | extendRegionStatement
+    | removeRegionStatement
     | removeDataNodeStatement
 
     // Admin Statement
@@ -479,6 +482,18 @@ migrateRegionStatement
     : MIGRATE REGION regionId=INTEGER_VALUE FROM fromId=INTEGER_VALUE TO 
toId=INTEGER_VALUE
     ;
 
+reconstructRegionStatement
+    : RECONSTRUCT REGION regionIds+=INTEGER_VALUE (COMMA 
regionIds+=INTEGER_VALUE)* ON targetDataNodeId=INTEGER_VALUE
+    ;
+
+extendRegionStatement
+    : EXTEND REGION regionId=INTEGER_VALUE TO targetDataNodeId=INTEGER_VALUE
+    ;
+
+removeRegionStatement
+    : REMOVE REGION regionId=INTEGER_VALUE FROM targetDataNodeId=INTEGER_VALUE
+    ;
+
 removeDataNodeStatement
     : REMOVE DATANODE dataNodeId=INTEGER_VALUE (',' dataNodeId=INTEGER_VALUE)*
     ;
@@ -1188,6 +1203,7 @@ EXCLUDING: 'EXCLUDING';
 EXECUTE: 'EXECUTE';
 EXISTS: 'EXISTS';
 EXPLAIN: 'EXPLAIN';
+EXTEND: 'EXTEND';
 EXTRACT: 'EXTRACT';
 EXTRACTOR: 'EXTRACTOR';
 FALSE: 'FALSE';
diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift 
b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
index 7385fafd2e0..c649566fe07 100644
--- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
@@ -310,21 +310,25 @@ struct TMigrateRegionReq {
     1: required i32 regionId
     2: required i32 fromId
     3: required i32 toId
+    4: required common.Model model
 }
 
 struct TReconstructRegionReq {
     1: required list<i32> regionIds
     2: required i32 dataNodeId
+    3: required common.Model model
 }
 
 struct TExtendRegionReq {
     1: required i32 regionId
     2: required i32 dataNodeId
+    3: required common.Model model
 }
 
 struct TRemoveRegionReq {
     1: required i32 regionId
     2: required i32 dataNodeId
+    3: required common.Model model
 }
 
 // Authorize

Reply via email to