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

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


The following commit(s) were added to refs/heads/TableModelIngestion by this 
push:
     new 13517590d5e finish analyze
13517590d5e is described below

commit 13517590d5e556692dbabe0ccf8a277b1479fba4
Author: jt2594838 <[email protected]>
AuthorDate: Tue Jun 11 19:34:12 2024 +0800

    finish analyze
---
 .../db/queryengine/plan/analyze/Analysis.java      |   6 +-
 .../db/queryengine/plan/analyze/AnalyzeUtils.java  |  61 +++++++--
 .../queryengine/plan/analyze/AnalyzeVisitor.java   | 150 +++++++++------------
 .../db/queryengine/plan/analyze/IAnalysis.java     |  15 +++
 .../plan/analyze/LoadTsfileAnalyzer.java           |   2 +-
 .../memory/StatementMemorySourceVisitor.java       |   2 +-
 .../plan/optimization/AggregationPushDown.java     |   2 +-
 .../plan/optimization/ColumnInjectionPushDown.java |   2 +-
 .../plan/optimization/LimitOffsetPushDown.java     |   2 +-
 .../OrderByExpressionWithLimitChangeToTopK.java    |   2 +-
 .../plan/optimization/PredicatePushDown.java       |   2 +-
 .../queryengine/plan/planner/LogicalPlanner.java   |   2 +-
 .../queryengine/plan/planner/TreeModelPlanner.java |   6 +-
 .../planner/distribution/DistributionPlanner.java  |  10 +-
 .../SimpleFragmentParallelPlanner.java             |  14 +-
 .../planner/plan/node/load/LoadTsFileNode.java     |   6 +-
 .../plan/relational/analyzer/Analysis.java         |   2 +-
 .../relational/analyzer/StatementAnalyzer.java     |  36 +----
 .../plan/relational/metadata/Metadata.java         |  15 +++
 .../plan/relational/planner/LogicalPlanner.java    |   2 +-
 .../distribute/FragmentInstanceGenerator.java      |   2 +-
 .../distribute/TableDistributionPlanner.java       |   2 +-
 .../db/queryengine/plan/analyze/AnalyzeTest.java   |   2 +-
 .../plan/optimization/OptimizationTestUtil.java    |   4 +-
 .../plan/planner/distribution/Util.java            |   4 +-
 .../plan/planner/distribution/Util2.java           |   4 +-
 .../planner/logical/LogicalPlannerTestUtil.java    |   2 +-
 27 files changed, 189 insertions(+), 170 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
index cb383edd45b..23caac86c1d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
@@ -370,11 +370,11 @@ public class Analysis implements IAnalysis {
     return (QueryStatement) statement;
   }
 
-  public Statement getStatement() {
+  public Statement getTreeStatement() {
     return statement;
   }
 
-  public void setStatement(Statement statement) {
+  public void setTreeStatement(Statement statement) {
     this.statement = statement;
   }
 
@@ -469,7 +469,7 @@ public class Analysis implements IAnalysis {
   public TsBlock constructResultForMemorySource(MPPQueryContext context) {
     StatementMemorySource memorySource =
         new StatementMemorySourceVisitor()
-            .process(getStatement(), new StatementMemorySourceContext(context, 
this));
+            .process(getTreeStatement(), new 
StatementMemorySourceContext(context, this));
     setRespDatasetHeader(memorySource.getDatasetHeader());
     return memorySource.getTsBlock();
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java
index af861730016..df3a795f1b1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java
@@ -33,7 +33,6 @@ import 
org.apache.iotdb.commons.partition.DataPartitionQueryParam;
 import org.apache.iotdb.commons.service.metric.PerformanceOverviewMetrics;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
-import org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaFetcher;
 import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertBaseStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.crud.InsertMultiTabletsStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement;
@@ -54,6 +53,41 @@ public class AnalyzeUtils {
     // util class
   }
 
+  public static IAnalysis analyzeInsert(MPPQueryContext context,
+      InsertBaseStatement insertBaseStatement, Runnable schemaValidation,
+      DataPartitionQueryFunc partitionFetcher) {
+    context.setQueryType(QueryType.WRITE);
+    insertBaseStatement.semanticCheck();
+    IAnalysis analysis = new 
org.apache.iotdb.db.queryengine.plan.analyze.Analysis();
+    validateSchema(analysis, insertBaseStatement,
+        schemaValidation);
+    InsertBaseStatement realStatement = removeLogicalView(analysis, 
insertBaseStatement);
+    if (analysis.isFinishQueryAfterAnalyze()) {
+      return analysis;
+    }
+    analysis.setTreeStatement(realStatement);
+
+    if (realStatement instanceof InsertTabletStatement) {
+      InsertTabletStatement realInsertTabletStatement = 
(InsertTabletStatement) realStatement;
+      DataPartitionQueryParam dataPartitionQueryParam = new 
DataPartitionQueryParam();
+      dataPartitionQueryParam.setDevicePath(
+          realInsertTabletStatement.getDevicePath().getFullPath());
+      dataPartitionQueryParam.setTimePartitionSlotList(
+          realInsertTabletStatement.getTimePartitionSlots());
+
+      analysis = getAnalysisForWriting(
+          analysis,
+          Collections.singletonList(dataPartitionQueryParam),
+          context.getSession().getUserName(), partitionFetcher);
+    } else {
+      analysis =  computeAnalysisForMultiTablets(
+          analysis,
+          (InsertMultiTabletsStatement) realStatement,
+          context.getSession().getUserName(), partitionFetcher);
+    }
+    return analysis;
+  }
+
   public static void validateSchema(
       IAnalysis analysis, InsertBaseStatement insertStatement,
       Runnable schemaValidation) {
@@ -103,12 +137,12 @@ public class AnalyzeUtils {
   }
 
   /** get analysis according to statement and params */
-  public static Analysis getAnalysisForWriting(
-      Analysis analysis, List<DataPartitionQueryParam> 
dataPartitionQueryParams, String userName,
-      IPartitionFetcher partitionFetcher) {
+  public static IAnalysis getAnalysisForWriting(
+      IAnalysis analysis, List<DataPartitionQueryParam> 
dataPartitionQueryParams, String userName,
+      DataPartitionQueryFunc partitionQueryFunc) {
 
     DataPartition dataPartition =
-        partitionFetcher.getOrCreateDataPartition(dataPartitionQueryParams, 
userName);
+        partitionQueryFunc.queryDataPartition(dataPartitionQueryParams, 
userName);
     if (dataPartition.isEmpty()) {
       analysis.setFinishQueryAfterAnalyze(true);
       analysis.setFailStatus(
@@ -121,9 +155,9 @@ public class AnalyzeUtils {
     return analysis;
   }
 
-  public static Analysis computeAnalysisForInsertRows(
-      Analysis analysis, InsertRowsStatement insertRowsStatement, String 
userName,
-      IPartitionFetcher partitionFetcher) {
+  public static IAnalysis computeAnalysisForInsertRows(
+      IAnalysis analysis, InsertRowsStatement insertRowsStatement, String 
userName,
+      DataPartitionQueryFunc partitionFetcher) {
     Map<String, Set<TTimePartitionSlot>> dataPartitionQueryParamMap = new 
HashMap<>();
     for (InsertRowStatement insertRowStatement : 
insertRowsStatement.getInsertRowStatementList()) {
       Set<TTimePartitionSlot> timePartitionSlotSet =
@@ -143,9 +177,9 @@ public class AnalyzeUtils {
     return getAnalysisForWriting(analysis, dataPartitionQueryParams, userName, 
partitionFetcher);
   }
 
-  public static Analysis computeAnalysisForMultiTablets(
-      Analysis analysis, InsertMultiTabletsStatement 
insertMultiTabletsStatement, String userName
-      , IPartitionFetcher partitionFetcher) {
+  public static IAnalysis computeAnalysisForMultiTablets(
+      IAnalysis analysis, InsertMultiTabletsStatement 
insertMultiTabletsStatement, String userName
+      , DataPartitionQueryFunc partitionFetcher) {
     Map<String, Set<TTimePartitionSlot>> dataPartitionQueryParamMap = new 
HashMap<>();
     for (InsertTabletStatement insertTabletStatement :
         insertMultiTabletsStatement.getInsertTabletStatementList()) {
@@ -165,4 +199,9 @@ public class AnalyzeUtils {
 
     return getAnalysisForWriting(analysis, dataPartitionQueryParams, userName, 
partitionFetcher);
   }
+
+  public interface DataPartitionQueryFunc {
+    DataPartition queryDataPartition(List<DataPartitionQueryParam> 
dataPartitionQueryParams,
+        String userName);
+  }
 }
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 af95e958a8c..b63ea6ddc1e 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
@@ -206,7 +206,7 @@ import static 
org.apache.iotdb.db.schemaengine.schemaregion.view.visitor.GetSour
 import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME_HEADER;
 
 /** This visitor is used to analyze each type of Statement and returns the 
{@link Analysis}. */
-public class AnalyzeVisitor extends StatementVisitor<Analysis, 
MPPQueryContext> {
+public class AnalyzeVisitor extends StatementVisitor<IAnalysis, 
MPPQueryContext> {
 
   private static final Logger logger = 
LoggerFactory.getLogger(AnalyzeVisitor.class);
 
@@ -241,7 +241,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   @Override
   public Analysis visitExplain(ExplainStatement explainStatement, 
MPPQueryContext context) {
     Analysis analysis = visitQuery(explainStatement.getQueryStatement(), 
context);
-    analysis.setStatement(explainStatement);
+    analysis.setTreeStatement(explainStatement);
     analysis.setFinishQueryAfterAnalyze(true);
     return analysis;
   }
@@ -251,7 +251,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       ExplainAnalyzeStatement explainAnalyzeStatement, MPPQueryContext 
context) {
     Analysis analysis = 
visitQuery(explainAnalyzeStatement.getQueryStatement(), context);
     context.setExplainAnalyze(true);
-    analysis.setStatement(explainAnalyzeStatement);
+    analysis.setTreeStatement(explainAnalyzeStatement);
     analysis.setRespDatasetHeader(
         new DatasetHeader(
             Collections.singletonList(
@@ -406,7 +406,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         (QueryStatement)
             concatPathRewriter.rewrite(
                 queryStatement, new 
PathPatternTree(queryStatement.useWildcard()), context);
-    analysis.setStatement(queryStatement);
+    analysis.setTreeStatement(queryStatement);
 
     // request schema fetch API
     long startTime = System.nanoTime();
@@ -578,8 +578,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     }
     analysis.setUseLogicalView(useLogicalView);
     if (useLogicalView
-        && analysis.getStatement() instanceof QueryStatement
-        && (((QueryStatement) analysis.getStatement()).isGroupByTag())) {
+        && analysis.getTreeStatement() instanceof QueryStatement
+        && (((QueryStatement) analysis.getTreeStatement()).isGroupByTag())) {
       throw new SemanticException("Views cannot be used in GROUP BY TAGS query 
yet.");
     }
 
@@ -2277,7 +2277,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   }
 
   @Override
-  public Analysis visitInsert(InsertStatement insertStatement, MPPQueryContext 
context) {
+  public IAnalysis visitInsert(InsertStatement insertStatement, 
MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
     long[] timeArray = insertStatement.getTimes();
     PartialPath devicePath = insertStatement.getDevice();
@@ -2362,7 +2362,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     }
 
     Analysis analysis = new Analysis();
-    analysis.setStatement(createTimeSeriesStatement);
+    analysis.setTreeStatement(createTimeSeriesStatement);
 
     checkIsTableCompatible(createTimeSeriesStatement.getPath(), context);
     checkIsTemplateCompatible(
@@ -2474,7 +2474,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     }
 
     Analysis analysis = new Analysis();
-    analysis.setStatement(createAlignedTimeSeriesStatement);
+    analysis.setTreeStatement(createAlignedTimeSeriesStatement);
 
     checkIsTableCompatible(createAlignedTimeSeriesStatement.getDevicePath(), 
context);
     checkIsTemplateCompatible(
@@ -2504,7 +2504,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     context.setQueryType(QueryType.WRITE);
 
     Analysis analysis = new Analysis();
-    analysis.setStatement(internalCreateTimeSeriesStatement);
+    analysis.setTreeStatement(internalCreateTimeSeriesStatement);
     checkIsTableCompatible(internalCreateTimeSeriesStatement.getDevicePath(), 
context);
     checkIsTemplateCompatible(
         internalCreateTimeSeriesStatement.getDevicePath(),
@@ -2534,7 +2534,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     context.setQueryType(QueryType.WRITE);
 
     Analysis analysis = new Analysis();
-    analysis.setStatement(internalCreateMultiTimeSeriesStatement);
+    analysis.setTreeStatement(internalCreateMultiTimeSeriesStatement);
 
     PathPatternTree pathPatternTree = new PathPatternTree();
     
DataNodeSchemaLockManager.getInstance().takeReadLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
@@ -2560,7 +2560,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       CreateMultiTimeSeriesStatement createMultiTimeSeriesStatement, 
MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
     Analysis analysis = new Analysis();
-    analysis.setStatement(createMultiTimeSeriesStatement);
+    analysis.setTreeStatement(createMultiTimeSeriesStatement);
 
     analyzeSchemaProps(createMultiTimeSeriesStatement.getPropsList());
 
@@ -2591,7 +2591,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       AlterTimeSeriesStatement alterTimeSeriesStatement, MPPQueryContext 
context) {
     context.setQueryType(QueryType.WRITE);
     Analysis analysis = new Analysis();
-    analysis.setStatement(alterTimeSeriesStatement);
+    analysis.setTreeStatement(alterTimeSeriesStatement);
 
     Pair<Template, PartialPath> templateInfo =
         schemaFetcher.checkTemplateSetAndPreSetInfo(
@@ -2615,41 +2615,15 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   }
 
   @Override
-  public Analysis visitInsertTablet(
+  public IAnalysis visitInsertTablet(
       InsertTabletStatement insertTabletStatement, MPPQueryContext context) {
-    context.setQueryType(QueryType.WRITE);
-    insertTabletStatement.semanticCheck();
-    Analysis analysis = new Analysis();
-    validateSchema(analysis, insertTabletStatement,
-        () -> SchemaValidator.validate(schemaFetcher, insertTabletStatement, 
context));
-    InsertBaseStatement realStatement = removeLogicalView(analysis, 
insertTabletStatement);
-    if (analysis.isFinishQueryAfterAnalyze()) {
-      return analysis;
-    }
-    analysis.setStatement(realStatement);
-
-    if (realStatement instanceof InsertTabletStatement) {
-      InsertTabletStatement realInsertTabletStatement = 
(InsertTabletStatement) realStatement;
-      DataPartitionQueryParam dataPartitionQueryParam = new 
DataPartitionQueryParam();
-      dataPartitionQueryParam.setDevicePath(
-          realInsertTabletStatement.getDevicePath().getFullPath());
-      dataPartitionQueryParam.setTimePartitionSlotList(
-          realInsertTabletStatement.getTimePartitionSlots());
-
-      return getAnalysisForWriting(
-          analysis,
-          Collections.singletonList(dataPartitionQueryParam),
-          context.getSession().getUserName(), partitionFetcher);
-    } else {
-      return computeAnalysisForMultiTablets(
-          analysis,
-          (InsertMultiTabletsStatement) realStatement,
-          context.getSession().getUserName(), partitionFetcher);
-    }
+    return AnalyzeUtils.analyzeInsert(context, insertTabletStatement,
+        () -> SchemaValidator.validate(schemaFetcher, insertTabletStatement, 
context),
+        partitionFetcher::getOrCreateDataPartition);
   }
 
   @Override
-  public Analysis visitInsertRow(InsertRowStatement insertRowStatement, 
MPPQueryContext context) {
+  public IAnalysis visitInsertRow(InsertRowStatement insertRowStatement, 
MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
     insertRowStatement.semanticCheck();
     Analysis analysis = new Analysis();
@@ -2659,7 +2633,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     if (analysis.isFinishQueryAfterAnalyze()) {
       return analysis;
     }
-    analysis.setStatement(realInsertStatement);
+    analysis.setTreeStatement(realInsertStatement);
 
     if (realInsertStatement instanceof InsertRowStatement) {
       InsertRowStatement realInsertRowStatement = (InsertRowStatement) 
realInsertStatement;
@@ -2671,16 +2645,16 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       return getAnalysisForWriting(
           analysis,
           Collections.singletonList(dataPartitionQueryParam),
-          context.getSession().getUserName(), partitionFetcher);
+          context.getSession().getUserName(), 
partitionFetcher::getOrCreateDataPartition);
     } else {
       return computeAnalysisForInsertRows(
           analysis, (InsertRowsStatement) realInsertStatement, 
context.getSession().getUserName()
-          , partitionFetcher);
+          , partitionFetcher::getOrCreateDataPartition);
     }
   }
 
   @Override
-  public Analysis visitInsertRows(
+  public IAnalysis visitInsertRows(
       InsertRowsStatement insertRowsStatement, MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
     insertRowsStatement.semanticCheck();
@@ -2692,14 +2666,14 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     if (analysis.isFinishQueryAfterAnalyze()) {
       return analysis;
     }
-    analysis.setStatement(realInsertRowsStatement);
+    analysis.setTreeStatement(realInsertRowsStatement);
 
     return computeAnalysisForInsertRows(
-        analysis, realInsertRowsStatement, context.getSession().getUserName(), 
partitionFetcher);
+        analysis, realInsertRowsStatement, context.getSession().getUserName(), 
partitionFetcher::getOrCreateDataPartition);
   }
 
   @Override
-  public Analysis visitInsertMultiTablets(
+  public IAnalysis visitInsertMultiTablets(
       InsertMultiTabletsStatement insertMultiTabletsStatement, MPPQueryContext 
context) {
     context.setQueryType(QueryType.WRITE);
     insertMultiTabletsStatement.semanticCheck();
@@ -2711,14 +2685,14 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     if (analysis.isFinishQueryAfterAnalyze()) {
       return analysis;
     }
-    analysis.setStatement(realStatement);
+    analysis.setTreeStatement(realStatement);
 
     return computeAnalysisForMultiTablets(
-        analysis, realStatement, context.getSession().getUserName(), 
partitionFetcher);
+        analysis, realStatement, context.getSession().getUserName(), 
partitionFetcher::getOrCreateDataPartition);
   }
 
   @Override
-  public Analysis visitInsertRowsOfOneDevice(
+  public IAnalysis visitInsertRowsOfOneDevice(
       InsertRowsOfOneDeviceStatement insertRowsOfOneDeviceStatement, 
MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
     insertRowsOfOneDeviceStatement.semanticCheck();
@@ -2730,7 +2704,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     if (analysis.isFinishQueryAfterAnalyze()) {
       return analysis;
     }
-    analysis.setStatement(realInsertStatement);
+    analysis.setTreeStatement(realInsertStatement);
 
     if (realInsertStatement instanceof InsertRowsOfOneDeviceStatement) {
       InsertRowsOfOneDeviceStatement realStatement =
@@ -2743,22 +2717,22 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
           analysis,
           Collections.singletonList(dataPartitionQueryParam),
           context.getSession().getUserName(),
-          partitionFetcher);
+          partitionFetcher::getOrCreateDataPartition);
     } else {
       return computeAnalysisForInsertRows(
           analysis, (InsertRowsStatement) realInsertStatement, 
context.getSession().getUserName()
-          , partitionFetcher);
+          , partitionFetcher::getOrCreateDataPartition);
     }
   }
 
   @Override
-  public Analysis visitPipeEnrichedStatement(
+  public IAnalysis visitPipeEnrichedStatement(
       PipeEnrichedStatement pipeEnrichedStatement, MPPQueryContext context) {
-    Analysis analysis = pipeEnrichedStatement.getInnerStatement().accept(this, 
context);
+    IAnalysis analysis = 
pipeEnrichedStatement.getInnerStatement().accept(this, context);
 
     // statement may be changed because of logical view
-    pipeEnrichedStatement.setInnerStatement(analysis.getStatement());
-    analysis.setStatement(pipeEnrichedStatement);
+    pipeEnrichedStatement.setInnerStatement(analysis.getTreeStatement());
+    analysis.setTreeStatement(pipeEnrichedStatement);
     return analysis;
   }
 
@@ -2837,7 +2811,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowTimeSeries(
       ShowTimeSeriesStatement showTimeSeriesStatement, MPPQueryContext 
context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showTimeSeriesStatement);
+    analysis.setTreeStatement(showTimeSeriesStatement);
 
     PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendPathPattern(showTimeSeriesStatement.getPathPattern());
@@ -2890,7 +2864,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowStorageGroup(
       ShowDatabaseStatement showDatabaseStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showDatabaseStatement);
+    analysis.setTreeStatement(showDatabaseStatement);
     analysis.setRespDatasetHeader(
         
DatasetHeaderFactory.getShowStorageGroupHeader(showDatabaseStatement.isDetailed()));
     return analysis;
@@ -2899,7 +2873,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   @Override
   public Analysis visitShowTTL(ShowTTLStatement showTTLStatement, 
MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showTTLStatement);
+    analysis.setTreeStatement(showTTLStatement);
     analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowTTLHeader());
     return analysis;
   }
@@ -2965,7 +2939,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowDevices(
       ShowDevicesStatement showDevicesStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showDevicesStatement);
+    analysis.setTreeStatement(showDevicesStatement);
 
     PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendPathPattern(
@@ -2989,7 +2963,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowCluster(
       ShowClusterStatement showClusterStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showClusterStatement);
+    analysis.setTreeStatement(showClusterStatement);
     if (showClusterStatement.isDetails()) {
       
analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowClusterDetailsHeader());
     } else {
@@ -3002,7 +2976,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitCountStorageGroup(
       CountDatabaseStatement countDatabaseStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(countDatabaseStatement);
+    analysis.setTreeStatement(countDatabaseStatement);
     
analysis.setRespDatasetHeader(DatasetHeaderFactory.getCountStorageGroupHeader());
     return analysis;
   }
@@ -3011,7 +2985,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitSchemaFetch(
       SchemaFetchStatement schemaFetchStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(schemaFetchStatement);
+    analysis.setTreeStatement(schemaFetchStatement);
 
     SchemaPartition schemaPartition =
         
partitionFetcher.getSchemaPartition(schemaFetchStatement.getPatternTree());
@@ -3028,7 +3002,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitCountDevices(
       CountDevicesStatement countDevicesStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(countDevicesStatement);
+    analysis.setTreeStatement(countDevicesStatement);
 
     PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendPathPattern(
@@ -3049,7 +3023,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitCountTimeSeries(
       CountTimeSeriesStatement countTimeSeriesStatement, MPPQueryContext 
context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(countTimeSeriesStatement);
+    analysis.setTreeStatement(countTimeSeriesStatement);
 
     PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendPathPattern(countTimeSeriesStatement.getPathPattern());
@@ -3081,7 +3055,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitCountLevelTimeSeries(
       CountLevelTimeSeriesStatement countLevelTimeSeriesStatement, 
MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(countLevelTimeSeriesStatement);
+    analysis.setTreeStatement(countLevelTimeSeriesStatement);
 
     PathPatternTree patternTree = new PathPatternTree();
     
patternTree.appendPathPattern(countLevelTimeSeriesStatement.getPathPattern());
@@ -3098,7 +3072,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   @Override
   public Analysis visitCountNodes(CountNodesStatement countStatement, 
MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(countStatement);
+    analysis.setTreeStatement(countStatement);
 
     PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendPathPattern(countStatement.getPathPattern());
@@ -3143,7 +3117,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowVersion(
       ShowVersionStatement showVersionStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showVersionStatement);
+    analysis.setTreeStatement(showVersionStatement);
     analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowVersionHeader());
     analysis.setFinishQueryAfterAnalyze(true);
     return analysis;
@@ -3152,7 +3126,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   private Analysis visitSchemaNodeManagementPartition(
       Statement statement, PartialPath path, PathPatternTree scope, 
DatasetHeader header) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(statement);
+    analysis.setTreeStatement(statement);
 
     PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendPathPattern(path);
@@ -3177,7 +3151,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       DeleteDataStatement deleteDataStatement, MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
     Analysis analysis = new Analysis();
-    analysis.setStatement(deleteDataStatement);
+    analysis.setTreeStatement(deleteDataStatement);
 
     PathPatternTree patternTree = new PathPatternTree();
     deleteDataStatement.getPathList().forEach(patternTree::appendPathPattern);
@@ -3249,7 +3223,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
           "Measurement under template is not allowed to have the same 
measurement name");
     }
     Analysis analysis = new Analysis();
-    analysis.setStatement(createTemplateStatement);
+    analysis.setTreeStatement(createTemplateStatement);
     return analysis;
   }
 
@@ -3258,7 +3232,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       ShowNodesInSchemaTemplateStatement showNodesInSchemaTemplateStatement,
       MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showNodesInSchemaTemplateStatement);
+    analysis.setTreeStatement(showNodesInSchemaTemplateStatement);
     
analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowNodesInSchemaTemplateHeader());
     return analysis;
   }
@@ -3267,7 +3241,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowSchemaTemplate(
       ShowSchemaTemplateStatement showSchemaTemplateStatement, MPPQueryContext 
context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showSchemaTemplateStatement);
+    analysis.setTreeStatement(showSchemaTemplateStatement);
     
analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowSchemaTemplateHeader());
     return analysis;
   }
@@ -3277,7 +3251,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       SetSchemaTemplateStatement setSchemaTemplateStatement, MPPQueryContext 
context) {
     context.setQueryType(QueryType.WRITE);
     Analysis analysis = new Analysis();
-    analysis.setStatement(setSchemaTemplateStatement);
+    analysis.setTreeStatement(setSchemaTemplateStatement);
     return analysis;
   }
 
@@ -3285,7 +3259,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowPathSetTemplate(
       ShowPathSetTemplateStatement showPathSetTemplateStatement, 
MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showPathSetTemplateStatement);
+    analysis.setTreeStatement(showPathSetTemplateStatement);
     
analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowPathSetTemplateHeader());
     return analysis;
   }
@@ -3295,7 +3269,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       ActivateTemplateStatement activateTemplateStatement, MPPQueryContext 
context) {
     context.setQueryType(QueryType.WRITE);
     Analysis analysis = new Analysis();
-    analysis.setStatement(activateTemplateStatement);
+    analysis.setTreeStatement(activateTemplateStatement);
 
     PartialPath activatePath = activateTemplateStatement.getPath();
 
@@ -3325,7 +3299,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       BatchActivateTemplateStatement batchActivateTemplateStatement, 
MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
     Analysis analysis = new Analysis();
-    analysis.setStatement(batchActivateTemplateStatement);
+    analysis.setTreeStatement(batchActivateTemplateStatement);
 
     Map<PartialPath, Pair<Template, PartialPath>> deviceTemplateSetInfoMap =
         new 
HashMap<>(batchActivateTemplateStatement.getDevicePathList().size());
@@ -3361,7 +3335,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
     Analysis analysis = new Analysis();
-    analysis.setStatement(internalBatchActivateTemplateStatement);
+    analysis.setTreeStatement(internalBatchActivateTemplateStatement);
 
     PathPatternTree patternTree = new PathPatternTree();
     for (PartialPath activatePath :
@@ -3382,7 +3356,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowPathsUsingTemplate(
       ShowPathsUsingTemplateStatement showPathsUsingTemplateStatement, 
MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showPathsUsingTemplateStatement);
+    analysis.setTreeStatement(showPathsUsingTemplateStatement);
     
analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowPathsUsingTemplateHeader());
 
     Pair<Template, List<PartialPath>> templateSetInfo =
@@ -3429,7 +3403,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowQueries(
       ShowQueriesStatement showQueriesStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showQueriesStatement);
+    analysis.setTreeStatement(showQueriesStatement);
     analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowQueriesHeader());
     analysis.setVirtualSource(true);
 
@@ -3501,7 +3475,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       CreateLogicalViewStatement createLogicalViewStatement, MPPQueryContext 
context) {
     Analysis analysis = new Analysis();
     context.setQueryType(QueryType.WRITE);
-    analysis.setStatement(createLogicalViewStatement);
+    analysis.setTreeStatement(createLogicalViewStatement);
 
     if (createLogicalViewStatement.getViewExpressions() == null) {
       // Analyze query in statement
@@ -3763,7 +3737,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       ShowLogicalViewStatement showLogicalViewStatement, MPPQueryContext 
context) {
     context.setQueryType(QueryType.READ);
     Analysis analysis = new Analysis();
-    analysis.setStatement(showLogicalViewStatement);
+    analysis.setTreeStatement(showLogicalViewStatement);
 
     PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendPathPattern(showLogicalViewStatement.getPathPattern());
@@ -3780,7 +3754,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowCurrentTimestamp(
       ShowCurrentTimestampStatement showCurrentTimestampStatement, 
MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(showCurrentTimestampStatement);
+    analysis.setTreeStatement(showCurrentTimestampStatement);
     analysis.setFinishQueryAfterAnalyze(true);
     
analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowCurrentTimestampHeader());
     return analysis;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java
index bb3821aef6e..1fcb7bf41ec 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java
@@ -20,9 +20,11 @@
 package org.apache.iotdb.db.queryengine.plan.analyze;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.partition.DataPartition;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
 
+import org.apache.iotdb.db.queryengine.plan.statement.Statement;
 import org.apache.tsfile.read.common.block.TsBlock;
 
 public interface IAnalysis {
@@ -50,4 +52,17 @@ public interface IAnalysis {
   default void setFailStatus(TSStatus status) {
 
   }
+
+  default boolean isFinishQueryAfterAnalyze() {
+    return false;
+  }
+
+  default void setTreeStatement(Statement realStatement) {}
+
+  default void setDataPartitionInfo(DataPartition dataPartition) {
+  }
+
+  default Statement getTreeStatement(){
+    return null;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsfileAnalyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsfileAnalyzer.java
index a372772e374..70d0a382525 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsfileAnalyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsfileAnalyzer.java
@@ -195,7 +195,7 @@ public class LoadTsfileAnalyzer {
 
     // data partition will be queried in the scheduler
     final Analysis analysis = new Analysis();
-    analysis.setStatement(loadTsFileStatement);
+    analysis.setTreeStatement(loadTsFileStatement);
     return analysis;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/memory/StatementMemorySourceVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/memory/StatementMemorySourceVisitor.java
index 7a37902dbb9..6a2bbab43fd 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/memory/StatementMemorySourceVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/memory/StatementMemorySourceVisitor.java
@@ -79,7 +79,7 @@ public class StatementMemorySourceVisitor
   @Override
   public StatementMemorySource visitExplain(
       ExplainStatement node, StatementMemorySourceContext context) {
-    context.getAnalysis().setStatement(node.getQueryStatement());
+    context.getAnalysis().setTreeStatement(node.getQueryStatement());
     DatasetHeader header =
         new DatasetHeader(
             Collections.singletonList(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java
index 00907e2f669..8f0c7e5dad9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java
@@ -79,7 +79,7 @@ public class AggregationPushDown implements PlanOptimizer {
 
   @Override
   public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext 
context) {
-    if (analysis.getStatement().getType() != StatementType.QUERY) {
+    if (analysis.getTreeStatement().getType() != StatementType.QUERY) {
       return plan;
     }
     QueryStatement queryStatement = analysis.getQueryStatement();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/ColumnInjectionPushDown.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/ColumnInjectionPushDown.java
index f90346f3c51..921ab330588 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/ColumnInjectionPushDown.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/ColumnInjectionPushDown.java
@@ -63,7 +63,7 @@ public class ColumnInjectionPushDown implements PlanOptimizer 
{
 
   @Override
   public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext 
context) {
-    if (analysis.getStatement().getType() != StatementType.QUERY) {
+    if (analysis.getTreeStatement().getType() != StatementType.QUERY) {
       return plan;
     }
     QueryStatement queryStatement = analysis.getQueryStatement();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
index df73a23dd18..da560a63026 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
@@ -67,7 +67,7 @@ public class LimitOffsetPushDown implements PlanOptimizer {
 
   @Override
   public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext 
context) {
-    if (analysis.getStatement().getType() != StatementType.QUERY) {
+    if (analysis.getTreeStatement().getType() != StatementType.QUERY) {
       return plan;
     }
     QueryStatement queryStatement = analysis.getQueryStatement();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java
index 1f0730b3c6b..90b5d2fdb43 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/OrderByExpressionWithLimitChangeToTopK.java
@@ -65,7 +65,7 @@ public class OrderByExpressionWithLimitChangeToTopK 
implements PlanOptimizer {
 
   @Override
   public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext 
context) {
-    if (analysis.getStatement().getType() != StatementType.QUERY) {
+    if (analysis.getTreeStatement().getType() != StatementType.QUERY) {
       return plan;
     }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/PredicatePushDown.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/PredicatePushDown.java
index 65a7023bb31..475eced371d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/PredicatePushDown.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/PredicatePushDown.java
@@ -62,7 +62,7 @@ public class PredicatePushDown implements PlanOptimizer {
 
   @Override
   public PlanNode optimize(PlanNode plan, Analysis analysis, MPPQueryContext 
context) {
-    if (analysis.getStatement().getType() != StatementType.QUERY) {
+    if (analysis.getTreeStatement().getType() != StatementType.QUERY) {
       return plan;
     }
     QueryStatement queryStatement = analysis.getQueryStatement();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java
index 5f460f0267d..64f6b273176 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java
@@ -45,7 +45,7 @@ public class LogicalPlanner {
 
   public LogicalQueryPlan plan(Analysis analysis) {
     long startTime = System.nanoTime();
-    PlanNode rootNode = new 
LogicalPlanVisitor(analysis).process(analysis.getStatement(), context);
+    PlanNode rootNode = new 
LogicalPlanVisitor(analysis).process(analysis.getTreeStatement(), context);
 
     // optimize the query logical plan
     if (analysis.isQuery()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java
index 843374ec49c..a819fa950de 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java
@@ -162,9 +162,9 @@ public class TreeModelPlanner implements IPlanner {
 
     // Get the inner statement of PipeEnrichedStatement
     Statement statementToRedirect =
-        analysis.getStatement() instanceof PipeEnrichedStatement
-            ? ((PipeEnrichedStatement) 
analysis.getStatement()).getInnerStatement()
-            : analysis.getStatement();
+        analysis.getTreeStatement() instanceof PipeEnrichedStatement
+            ? ((PipeEnrichedStatement) 
analysis.getTreeStatement()).getInnerStatement()
+            : analysis.getTreeStatement();
 
     if (statementToRedirect instanceof InsertBaseStatement
         && !analysis.isFinishQueryAfterAnalyze()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java
index 4a4d168a321..dd0974ac635 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java
@@ -89,7 +89,7 @@ public class DistributionPlanner {
   public PlanNode addExchangeNode(PlanNode root) {
     ExchangeNodeAdder adder = new ExchangeNodeAdder(this.analysis);
     NodeGroupContext nodeGroupContext =
-        new NodeGroupContext(context, analysis.getStatement(), root);
+        new NodeGroupContext(context, analysis.getTreeStatement(), root);
     PlanNode newRoot = adder.visit(root, nodeGroupContext);
     adjustUpStream(newRoot, nodeGroupContext);
     return newRoot;
@@ -112,8 +112,8 @@ public class DistributionPlanner {
     }
 
     final boolean needShuffleSinkNode =
-        analysis.getStatement() instanceof QueryStatement
-            && needShuffleSinkNode((QueryStatement) analysis.getStatement(), 
context);
+        analysis.getTreeStatement() instanceof QueryStatement
+            && needShuffleSinkNode((QueryStatement) 
analysis.getTreeStatement(), context);
 
     adjustUpStreamHelper(root, new HashMap<>(), needShuffleSinkNode, context);
   }
@@ -183,7 +183,7 @@ public class DistributionPlanner {
   }
 
   public PlanNode optimize(PlanNode rootWithExchange) {
-    if (analysis.getStatement() != null && analysis.getStatement().isQuery()) {
+    if (analysis.getTreeStatement() != null && 
analysis.getTreeStatement().isQuery()) {
       for (PlanOptimizer optimizer : optimizers) {
         rootWithExchange = optimizer.optimize(rootWithExchange, analysis, 
context);
       }
@@ -201,7 +201,7 @@ public class DistributionPlanner {
 
     PlanNode rootWithExchange = addExchangeNode(rootAfterRewrite);
     PlanNode optimizedRootWithExchange = optimize(rootWithExchange);
-    if (analysis.getStatement() != null && analysis.getStatement().isQuery()) {
+    if (analysis.getTreeStatement() != null && 
analysis.getTreeStatement().isQuery()) {
       analysis
           .getRespDatasetHeader()
           
.setColumnToTsBlockIndexMap(optimizedRootWithExchange.getOutputColumnNames());
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java
index 0a7f17166c3..e955f5f5a22 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java
@@ -106,8 +106,8 @@ public class SimpleFragmentParallelPlanner implements 
IFragmentParallelPlaner {
                 dataNodeFIMap.get(fragmentInstance.getHostDataNode()).size()));
 
     // compute dataNodeSeriesScanNum in LastQueryScanNode
-    if (analysis.getStatement() instanceof QueryStatement
-        && ((QueryStatement) analysis.getStatement()).isLastQuery()) {
+    if (analysis.getTreeStatement() instanceof QueryStatement
+        && ((QueryStatement) analysis.getTreeStatement()).isLastQuery()) {
       final Map<Path, AtomicInteger> pathSumMap = new HashMap<>();
       dataNodeFIMap
           .values()
@@ -183,11 +183,11 @@ public class SimpleFragmentParallelPlanner implements 
IFragmentParallelPlaner {
           return v;
         });
 
-    if (analysis.getStatement() instanceof QueryStatement
-        || analysis.getStatement() instanceof ExplainAnalyzeStatement
-        || analysis.getStatement() instanceof ShowQueriesStatement
-        || (analysis.getStatement() instanceof ShowTimeSeriesStatement
-            && ((ShowTimeSeriesStatement) 
analysis.getStatement()).isOrderByHeat())) {
+    if (analysis.getTreeStatement() instanceof QueryStatement
+        || analysis.getTreeStatement() instanceof ExplainAnalyzeStatement
+        || analysis.getTreeStatement() instanceof ShowQueriesStatement
+        || (analysis.getTreeStatement() instanceof ShowTimeSeriesStatement
+            && ((ShowTimeSeriesStatement) 
analysis.getTreeStatement()).isOrderByHeat())) {
       
fragmentInstance.getFragment().generateTypeProvider(queryContext.getTypeProvider());
     }
     instanceMap.putIfAbsent(fragment.getId(), fragmentInstance);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadTsFileNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadTsFileNode.java
index 74df1b08dbd..b7bb2b24859 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadTsFileNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/load/LoadTsFileNode.java
@@ -91,10 +91,10 @@ public class LoadTsFileNode extends WritePlanNode {
   public List<WritePlanNode> splitByPartition(Analysis analysis) {
     List<WritePlanNode> res = new ArrayList<>();
     LoadTsFileStatement statement =
-        analysis.getStatement() instanceof PipeEnrichedStatement
+        analysis.getTreeStatement() instanceof PipeEnrichedStatement
             ? (LoadTsFileStatement)
-                ((PipeEnrichedStatement) 
analysis.getStatement()).getInnerStatement()
-            : (LoadTsFileStatement) analysis.getStatement();
+                ((PipeEnrichedStatement) 
analysis.getTreeStatement()).getInnerStatement()
+            : (LoadTsFileStatement) analysis.getTreeStatement();
 
     for (int i = 0; i < resources.size(); i++) {
       res.add(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
index 9faf14e320d..b8749f6957f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
@@ -186,7 +186,7 @@ public class Analysis implements IAnalysis {
     return parameters;
   }
 
-  public Statement getStatement() {
+  public Statement getTreeStatement() {
     return root;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
index 75e7153513a..9ba4c068c7f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.execution.warnings.IoTDBWarning;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
+import org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeUtils;
 import org.apache.iotdb.db.queryengine.plan.analyze.IAnalysis;
 import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
 import org.apache.iotdb.db.queryengine.plan.analyze.schema.SchemaValidator;
@@ -372,36 +373,11 @@ public class StatementAnalyzer {
 
       final MPPQueryContext context = insert.getContext();
       final InsertTabletStatement insertTabletStatement = 
insert.getInnerTreeStatement();
-      context.setQueryType(QueryType.WRITE);
-      insertTabletStatement.semanticCheck();
-      IAnalysis analysis = new 
org.apache.iotdb.db.queryengine.plan.analyze.Analysis();
-
-      validateSchema(analysis, insertTabletStatement,
-          () -> SchemaValidator.validate(metadata, insert, context));
-      InsertBaseStatement realStatement = removeLogicalView(analysis, 
insertTabletStatement);
-      if (analysis.isFinishQueryAfterAnalyze()) {
-        return ret;
-      }
-      analysis.setStatement(realStatement);
-
-      if (realStatement instanceof InsertTabletStatement) {
-        InsertTabletStatement realInsertTabletStatement = 
(InsertTabletStatement) realStatement;
-        DataPartitionQueryParam dataPartitionQueryParam = new 
DataPartitionQueryParam();
-        dataPartitionQueryParam.setDevicePath(
-            realInsertTabletStatement.getDevicePath().getFullPath());
-        dataPartitionQueryParam.setTimePartitionSlotList(
-            realInsertTabletStatement.getTimePartitionSlots());
-
-        analysis = getAnalysisForWriting(
-            analysis,
-            Collections.singletonList(dataPartitionQueryParam),
-            context.getSession().getUserName(), partitionFetcher);
-      } else {
-        analysis =  computeAnalysisForMultiTablets(
-            analysis,
-            (InsertMultiTabletsStatement) realStatement,
-            context.getSession().getUserName(), partitionFetcher);
-      }
+
+      IAnalysis analysis = AnalyzeUtils.analyzeInsert(context, 
insertTabletStatement,
+          () -> SchemaValidator.validate(metadata, insert, context),
+          metadata::getOrCreateDataPartition);
+
       // TODO-TableIngestion: use IAnalysis
       // StatementAnalyzer.this.analysis = analysis;
       return ret;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
index df047d7d652..1411338c070 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
@@ -19,6 +19,9 @@
 
 package org.apache.iotdb.db.queryengine.plan.relational.metadata;
 
+import java.util.Map;
+import org.apache.iotdb.commons.partition.DataPartition;
+import org.apache.iotdb.commons.partition.DataPartitionQueryParam;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import 
org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaComputationWithAutoCreation;
@@ -84,4 +87,16 @@ public interface Metadata {
       MPPQueryContext context) {
     throw new UnsupportedOperationException();
   }
+
+  /**
+   * Get or create data partition, used in cluster write scenarios. if 
enableAutoCreateSchema is
+   * true and database/series/time slots not exists, then automatically create.
+   *
+   * @param dataPartitionQueryParams the list of DataPartitionQueryParams
+   * @param userName
+   */
+  default DataPartition getOrCreateDataPartition(
+      List<DataPartitionQueryParam> dataPartitionQueryParams, String userName) 
{
+    throw new UnsupportedOperationException();
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java
index 719ede30231..8526d39da25 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java
@@ -85,7 +85,7 @@ public class LogicalPlanner {
   }
 
   public LogicalQueryPlan plan(Analysis analysis) throws IoTDBException {
-    PlanNode planNode = planStatement(analysis, analysis.getStatement());
+    PlanNode planNode = planStatement(analysis, analysis.getTreeStatement());
 
     relationalPlanOptimizers.forEach(
         optimizer ->
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/FragmentInstanceGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/FragmentInstanceGenerator.java
index 623217e340f..6ce858d179d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/FragmentInstanceGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/FragmentInstanceGenerator.java
@@ -141,7 +141,7 @@ public class FragmentInstanceGenerator {
           return v;
         });
 
-    if (analysis.getStatement() instanceof Query) {
+    if (analysis.getTreeStatement() instanceof Query) {
       
fragmentInstance.getFragment().generateTableModelTypeProvider(queryContext.getTypeProvider());
     }
     instanceMap.putIfAbsent(fragment.getId(), fragmentInstance);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributionPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributionPlanner.java
index 83f1548ee3a..7fa34d6de89 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributionPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributionPlanner.java
@@ -59,7 +59,7 @@ public class TableDistributionPlanner {
     }
 
     PlanNode outputNodeWithExchange = distributedPlanNodeResult.get(0);
-    if (analysis.getStatement() instanceof Query) {
+    if (analysis.getTreeStatement() instanceof Query) {
       analysis
           .getRespDatasetHeader()
           .setColumnToTsBlockIndexMap(
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java
index b9681477344..a3716c720de 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java
@@ -642,7 +642,7 @@ public class AnalyzeTest {
 
     for (int i = 0; i < sqls.length; i++) {
       Analysis analysis = analyzeSQL(sqls[i]);
-      QueryStatement queryStatement = (QueryStatement) analysis.getStatement();
+      QueryStatement queryStatement = (QueryStatement) 
analysis.getTreeStatement();
       if (predicates[i] == null) {
         Assert.assertNull(queryStatement.getWhereCondition());
       } else {
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/OptimizationTestUtil.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/OptimizationTestUtil.java
index 2df3f0ef124..921ea82cc54 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/OptimizationTestUtil.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/OptimizationTestUtil.java
@@ -122,7 +122,7 @@ public class OptimizationTestUtil {
     Analysis analysis = analyzer.analyze(statement);
 
     PlanNode actualPlan =
-        new LogicalPlanVisitor(analysis).process(analysis.getStatement(), 
context);
+        new LogicalPlanVisitor(analysis).process(analysis.getTreeStatement(), 
context);
     for (PlanOptimizer preOptimizer : preOptimizers) {
       actualPlan = preOptimizer.optimize(actualPlan, analysis, context);
     }
@@ -142,7 +142,7 @@ public class OptimizationTestUtil {
     Analysis analysis = analyzer.analyze(statement);
 
     PlanNode actualPlan =
-        new LogicalPlanVisitor(analysis).process(analysis.getStatement(), 
context);
+        new LogicalPlanVisitor(analysis).process(analysis.getTreeStatement(), 
context);
     for (PlanOptimizer preOptimizer : preOptimizers) {
       actualPlan = preOptimizer.optimize(actualPlan, analysis, context);
     }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java
index 59cd36a2f8a..223d12f6af3 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java
@@ -228,8 +228,8 @@ public class Util {
       analysis.setSchemaPartitionInfo(schemaPartition);
       analysis.setSchemaTree(genSchemaTree());
       // to avoid some special case which is not the point of test
-      analysis.setStatement(Mockito.mock(QueryStatement.class));
-      Mockito.when(analysis.getStatement().isQuery()).thenReturn(false);
+      analysis.setTreeStatement(Mockito.mock(QueryStatement.class));
+      Mockito.when(analysis.getTreeStatement().isQuery()).thenReturn(false);
       return analysis;
     } catch (IllegalPathException e) {
       return new Analysis();
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java
index eb802edd9e5..a2583bf812a 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java
@@ -142,8 +142,8 @@ public class Util2 {
     analysis.setSchemaPartitionInfo(schemaPartition);
     analysis.setSchemaTree(genSchemaTree());
     // to avoid some special case which is not the point of test
-    analysis.setStatement(Mockito.mock(QueryStatement.class));
-    Mockito.when(analysis.getStatement().isQuery()).thenReturn(false);
+    analysis.setTreeStatement(Mockito.mock(QueryStatement.class));
+    Mockito.when(analysis.getTreeStatement().isQuery()).thenReturn(false);
     return analysis;
   }
 
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/LogicalPlannerTestUtil.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/LogicalPlannerTestUtil.java
index 176cc7bde18..f48b2ef6d43 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/LogicalPlannerTestUtil.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/LogicalPlannerTestUtil.java
@@ -55,6 +55,6 @@ public class LogicalPlannerTestUtil {
     Analyzer analyzer =
         new Analyzer(context, new FakePartitionFetcherImpl(), new 
FakeSchemaFetcherImpl());
     Analysis analysis = analyzer.analyze(statement);
-    return new LogicalPlanVisitor(analysis).process(analysis.getStatement(), 
context);
+    return new 
LogicalPlanVisitor(analysis).process(analysis.getTreeStatement(), context);
   }
 }

Reply via email to