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

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

commit 10eef615d130cbc275b5850ee642be7923873d8e
Author: shuwenwei <[email protected]>
AuthorDate: Fri Apr 17 14:11:36 2026 +0800

    add ITableTypeProvider
---
 .../relational/ColumnTransformerBuilder.java       |  6 +-
 .../planner/ITableOperatorGeneratorContext.java    |  4 +-
 .../plan/planner/TableOperatorGenerator.java       | 93 +++++++++++-----------
 .../plan/analyze/ITableTypeProvider.java}          | 18 +++--
 .../plan/node/CommonPlanNodeDeserializer.java      |  8 +-
 .../planner/plan/node/IPlanNodeDeserializer.java   |  4 -
 ...zer.java => IPlanNodeDeserializerProvider.java} | 18 +----
 .../plan/planner/plan/node/PlanNodeType.java       | 29 ++++---
 .../db/queryengine/plan/analyze/TypeProvider.java  |  3 +-
 .../plan/planner/LocalExecutionPlanContext.java    |  6 ++
 .../plan/planner/plan/PlanFragment.java            |  4 +-
 .../plan/node/DataNodePlanNodeDeserializer.java    |  2 +-
 .../node/DataNodePlanNodeDeserializerProvider.java | 25 ++++++
 ...lanner.plan.node.IPlanNodeDeserializerProvider} |  2 +-
 14 files changed, 120 insertions(+), 102 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/execution/relational/ColumnTransformerBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/execution/relational/ColumnTransformerBuilder.java
index 55d115c66c1..8aeb4d80a4e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/execution/relational/ColumnTransformerBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/execution/relational/ColumnTransformerBuilder.java
@@ -148,6 +148,7 @@ import 
org.apache.iotdb.db.calc_commons.transformation.dag.column.unary.scalar.f
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.node_commons.common.SessionInfo;
+import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider;
 import 
org.apache.iotdb.db.node_commons.plan.planner.plan.parameter.InputLocation;
 import 
org.apache.iotdb.db.node_commons.plan.relational.function.arithmetic.AdditionResolver;
 import 
org.apache.iotdb.db.node_commons.plan.relational.function.arithmetic.DivisionResolver;
@@ -194,7 +195,6 @@ import 
org.apache.iotdb.db.node_commons.plan.relational.sql.ast.Trim;
 import org.apache.iotdb.db.node_commons.plan.relational.sql.ast.WhenClause;
 import 
org.apache.iotdb.db.node_commons.plan.relational.type.InternalTypeManager;
 import 
org.apache.iotdb.db.node_commons.plan.relational.type.TypeNotFoundException;
-import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
 import org.apache.iotdb.udf.api.customizer.analysis.ScalarFunctionAnalysis;
 import org.apache.iotdb.udf.api.customizer.parameter.FunctionArguments;
@@ -1940,7 +1940,7 @@ public class ColumnTransformerBuilder
 
     private final int originSize;
 
-    private final TypeProvider typeProvider;
+    private final ITableTypeProvider typeProvider;
 
     private final Metadata metadata;
 
@@ -1953,7 +1953,7 @@ public class ColumnTransformerBuilder
         List<ColumnTransformer> commonTransformerList,
         List<TSDataType> inputDataTypes,
         int originSize,
-        TypeProvider typeProvider,
+        ITableTypeProvider typeProvider,
         Metadata metadata) {
       this.sessionInfo = sessionInfo;
       this.leafList = leafList;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java
index 0948e39cb6a..b79be7861b6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java
@@ -19,12 +19,12 @@
 
 package org.apache.iotdb.db.calc_commons.plan.planner;
 
-import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider;
 
 import java.time.ZoneId;
 
 public interface ITableOperatorGeneratorContext {
-  TypeProvider getTypeProvider();
+  ITableTypeProvider getTableTypeProvider();
 
   ZoneId getZoneId();
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/TableOperatorGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/TableOperatorGenerator.java
index 59da75bfe1b..eb631cb297a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/TableOperatorGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/TableOperatorGenerator.java
@@ -105,6 +105,7 @@ import 
org.apache.iotdb.db.calc_commons.transformation.dag.column.ColumnTransfor
 import 
org.apache.iotdb.db.calc_commons.transformation.dag.column.leaf.LeafColumnTransformer;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.node_commons.common.SessionInfo;
+import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider;
 import 
org.apache.iotdb.db.node_commons.plan.planner.plan.node.ICoreQueryPlanVisitor;
 import org.apache.iotdb.db.node_commons.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.node_commons.plan.planner.plan.node.PlanNodeId;
@@ -160,7 +161,6 @@ import 
org.apache.iotdb.db.node_commons.plan.relational.sql.ast.Expression;
 import org.apache.iotdb.db.node_commons.plan.relational.sql.ast.Literal;
 import 
org.apache.iotdb.db.node_commons.plan.relational.sql.ast.SymbolReference;
 import 
org.apache.iotdb.db.node_commons.plan.relational.type.InternalTypeManager;
-import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
 import org.apache.iotdb.db.utils.datastructure.SortKey;
 import org.apache.iotdb.udf.api.relational.TableFunction;
@@ -278,7 +278,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
 
   @Override
   public Operator visitFilter(FilterNode node, C context) {
-    TypeProvider typeProvider = context.getTypeProvider();
+    ITableTypeProvider typeProvider = context.getTableTypeProvider();
     Optional<Expression> predicate = Optional.of(node.getPredicate());
     Operator inputOperator = node.getChild().accept(this, context);
     List<TSDataType> inputDataTypes = getInputColumnTypes(node, typeProvider);
@@ -328,7 +328,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
                           ImmutableList.of(),
                           ImmutableList.of(),
                           0,
-                          context.getTypeProvider(),
+                          context.getTableTypeProvider(),
                           metadata);
 
                   return visitor.process(p, filterColumnTransformerContext);
@@ -355,7 +355,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
             commonTransformerList,
             filterOutputDataTypes,
             inputLocations.size(),
-            context.getTypeProvider(),
+            context.getTableTypeProvider(),
             metadata);
 
     for (Expression expression : projectExpressions) {
@@ -382,7 +382,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
 
   @Override
   public Operator visitProject(ProjectNode node, C context) {
-    TypeProvider typeProvider = context.getTypeProvider();
+    ITableTypeProvider typeProvider = context.getTableTypeProvider();
     Optional<Expression> predicate;
     Operator inputOperator;
     List<TSDataType> inputDataTypes;
@@ -410,7 +410,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         context);
   }
 
-  private List<TSDataType> getInputColumnTypes(PlanNode node, TypeProvider 
typeProvider) {
+  private List<TSDataType> getInputColumnTypes(PlanNode node, 
ITableTypeProvider typeProvider) {
     // ignore "time" column
     return node.getChildren().stream()
         .map(PlanNode::getOutputSymbols)
@@ -423,7 +423,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
   public Operator visitGapFill(GapFillNode node, C context) {
     Operator child = node.getChild().accept(this, context);
     List<TSDataType> inputDataTypes =
-        getOutputColumnTypes(node.getChild(), context.getTypeProvider());
+        getOutputColumnTypes(node.getChild(), context.getTableTypeProvider());
     int timeColumnIndex = getColumnIndex(node.getGapFillColumn(), 
node.getChild());
     if (node.getGapFillGroupingKeys().isEmpty()) { // without group keys
       if (node.getMonthDuration() == 0) { // without month interval
@@ -496,7 +496,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
     Operator child = node.getChild().accept(this, context);
 
     List<TSDataType> inputDataTypes =
-        getOutputColumnTypes(node.getChild(), context.getTypeProvider());
+        getOutputColumnTypes(node.getChild(), context.getTableTypeProvider());
     int inputColumnCount = inputDataTypes.size();
     int helperColumnIndex = -1;
     if (node.getHelperColumn().isPresent()) {
@@ -572,7 +572,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
     Operator child = node.getChild().accept(this, context);
 
     List<TSDataType> inputDataTypes =
-        getOutputColumnTypes(node.getChild(), context.getTypeProvider());
+        getOutputColumnTypes(node.getChild(), context.getTableTypeProvider());
     int inputColumnCount = inputDataTypes.size();
     int helperColumnIndex = getColumnIndex(node.getHelperColumn(), 
node.getChild());
     ILinearFill[] fillArray = getLinearFill(inputColumnCount, inputDataTypes);
@@ -605,7 +605,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
     OperatorContext operatorContext =
         addOperatorContext(context, node.getPlanNodeId(), 
TableFillOperator.class.getSimpleName());
     List<TSDataType> inputDataTypes =
-        getOutputColumnTypes(node.getChild(), context.getTypeProvider());
+        getOutputColumnTypes(node.getChild(), context.getTableTypeProvider());
     int inputColumnCount = inputDataTypes.size();
     Literal filledValue = node.getFilledValue();
     return new TableFillOperator(
@@ -745,7 +745,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
     for (PlanNode child : node.getChildren()) {
       children.add(this.process(child, context));
     }
-    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTypeProvider());
+    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTableTypeProvider());
     int sortItemsCount = node.getOrderingScheme().getOrderBy().size();
 
     List<Integer> sortItemIndexList = new ArrayList<>(sortItemsCount);
@@ -755,7 +755,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         node.getOrderingScheme(),
         sortItemIndexList,
         sortItemDataTypeList,
-        context.getTypeProvider());
+        context.getTableTypeProvider());
 
     return new TableMergeSortOperator(
         operatorContext,
@@ -769,7 +769,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
   public Operator visitSort(SortNode node, C context) {
     OperatorContext operatorContext =
         addOperatorContext(context, node.getPlanNodeId(), 
TableSortOperator.class.getSimpleName());
-    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTypeProvider());
+    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTableTypeProvider());
     int sortItemsCount = node.getOrderingScheme().getOrderBy().size();
 
     List<Integer> sortItemIndexList = new ArrayList<>(sortItemsCount);
@@ -779,7 +779,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         node.getOrderingScheme(),
         sortItemIndexList,
         sortItemDataTypeList,
-        context.getTypeProvider());
+        context.getTableTypeProvider());
 
     Operator child = node.getChild().accept(this, context);
 
@@ -805,7 +805,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
     for (PlanNode child : node.getChildren()) {
       children.add(this.process(child, context));
     }
-    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTypeProvider());
+    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTableTypeProvider());
     int sortItemsCount = node.getOrderingScheme().getOrderBy().size();
 
     List<Integer> sortItemIndexList = new ArrayList<>(sortItemsCount);
@@ -815,7 +815,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         node.getOrderingScheme(),
         sortItemIndexList,
         sortItemDataTypeList,
-        context.getTypeProvider());
+        context.getTableTypeProvider());
     return new TableTopKOperator(
         operatorContext,
         children,
@@ -826,7 +826,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         node.isChildrenDataInOrder());
   }
 
-  protected List<TSDataType> getOutputColumnTypes(PlanNode node, TypeProvider 
typeProvider) {
+  protected List<TSDataType> getOutputColumnTypes(PlanNode node, 
ITableTypeProvider typeProvider) {
     return node.getOutputSymbols().stream()
         .map(s -> getTSDataType(typeProvider.getTableModelType(s)))
         .collect(Collectors.toList());
@@ -837,7 +837,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
       OrderingScheme orderingScheme,
       List<Integer> sortItemIndexList,
       List<TSDataType> sortItemDataTypeList,
-      TypeProvider typeProvider) {
+      ITableTypeProvider typeProvider) {
     Map<Symbol, Integer> columnIndex = new HashMap<>();
     int index = 0;
     for (Symbol symbol : outputSymbols) {
@@ -863,7 +863,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
     OperatorContext operatorContext =
         addOperatorContext(
             context, node.getPlanNodeId(), 
TableStreamSortOperator.class.getSimpleName());
-    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTypeProvider());
+    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTableTypeProvider());
     int sortItemsCount = node.getOrderingScheme().getOrderBy().size();
 
     List<Integer> sortItemIndexList = new ArrayList<>(sortItemsCount);
@@ -873,7 +873,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         node.getOrderingScheme(),
         sortItemIndexList,
         sortItemDataTypeList,
-        context.getTypeProvider());
+        context.getTableTypeProvider());
 
     Operator child = node.getChild().accept(this, context);
 
@@ -915,7 +915,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
 
   @Override
   public Operator visitJoin(JoinNode node, C context) {
-    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTypeProvider());
+    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTableTypeProvider());
 
     Operator leftChild = node.getLeftChild().accept(this, context);
     Operator rightChild = node.getRightChild().accept(this, context);
@@ -986,10 +986,10 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
       rightJoinKeyPositions[i] = rightJoinKeyPosition;
 
       Type leftJoinKeyType =
-          
context.getTypeProvider().getTableModelType(node.getCriteria().get(i).getLeft());
+          
context.getTableTypeProvider().getTableModelType(node.getCriteria().get(i).getLeft());
       checkIfJoinKeyTypeMatches(
           leftJoinKeyType,
-          
context.getTypeProvider().getTableModelType(node.getCriteria().get(i).getRight()));
+          
context.getTableTypeProvider().getTableModelType(node.getCriteria().get(i).getRight()));
       joinKeyTypes.add(leftJoinKeyType);
     }
 
@@ -1007,10 +1007,11 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
       }
       rightJoinKeyPositions[equiSize] = rightAsofJoinKeyPosition;
 
-      if 
(context.getTypeProvider().getTableModelType(asofJoinClause.getLeft()) != 
TIMESTAMP) {
+      if 
(context.getTableTypeProvider().getTableModelType(asofJoinClause.getLeft()) != 
TIMESTAMP) {
         throw new IllegalStateException("Type of left ASOF Join key is not 
TIMESTAMP");
       }
-      if 
(context.getTypeProvider().getTableModelType(asofJoinClause.getRight()) != 
TIMESTAMP) {
+      if 
(context.getTableTypeProvider().getTableModelType(asofJoinClause.getRight())
+          != TIMESTAMP) {
         throw new IllegalStateException("Type of right ASOF Join key is not 
TIMESTAMP");
       }
 
@@ -1158,7 +1159,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
 
   @Override
   public Operator visitSemiJoin(SemiJoinNode node, C context) {
-    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTypeProvider());
+    List<TSDataType> dataTypes = getOutputColumnTypes(node, 
context.getTableTypeProvider());
 
     Operator leftChild = node.getLeftChild().accept(this, context);
     Operator rightChild = node.getRightChild().accept(this, context);
@@ -1186,11 +1187,11 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         "FilteringSource of SemiJoinNode doesn't contain 
filteringSourceJoinSymbol.");
 
     Type sourceJoinKeyType =
-        
context.getTypeProvider().getTableModelType(node.getSourceJoinSymbol());
+        
context.getTableTypeProvider().getTableModelType(node.getSourceJoinSymbol());
 
     checkIfJoinKeyTypeMatches(
         sourceJoinKeyType,
-        
context.getTypeProvider().getTableModelType(node.getFilteringSourceJoinSymbol()));
+        
context.getTableTypeProvider().getTableModelType(node.getFilteringSourceJoinSymbol()));
 
     OperatorContext operatorContext =
         addOperatorContext(
@@ -1242,14 +1243,14 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
     Operator child = node.getChild().accept(this, context);
 
     if (node.getGroupingKeys().isEmpty()) {
-      return planGlobalAggregation(node, child, context.getTypeProvider(), 
context);
+      return planGlobalAggregation(node, child, 
context.getTableTypeProvider(), context);
     }
 
-    return planGroupByAggregation(node, child, context.getTypeProvider(), 
context);
+    return planGroupByAggregation(node, child, context.getTableTypeProvider(), 
context);
   }
 
   private Operator planGlobalAggregation(
-      AggregationNode node, Operator child, TypeProvider typeProvider, C 
context) {
+      AggregationNode node, Operator child, ITableTypeProvider typeProvider, C 
context) {
     OperatorContext operatorContext =
         addOperatorContext(
             context, node.getPlanNodeId(), 
AggregationOperator.class.getSimpleName());
@@ -1281,7 +1282,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
       Symbol symbol,
       AggregationNode.Aggregation aggregation,
       AggregationNode.Step step,
-      TypeProvider typeProvider,
+      ITableTypeProvider typeProvider,
       boolean scanAscending,
       boolean isAggTableScan,
       String timeColumnName,
@@ -1324,7 +1325,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
   }
 
   protected Operator planGroupByAggregation(
-      AggregationNode node, Operator child, TypeProvider typeProvider, C 
context) {
+      AggregationNode node, Operator child, ITableTypeProvider typeProvider, C 
context) {
     Map<Symbol, Integer> childLayout =
         makeLayoutFromOutputSymbols(node.getChild().getOutputSymbols());
 
@@ -1464,7 +1465,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
       Symbol symbol,
       AggregationNode.Aggregation aggregation,
       AggregationNode.Step step,
-      TypeProvider typeProvider) {
+      ITableTypeProvider typeProvider) {
     List<Integer> argumentChannels = new ArrayList<>();
     for (Expression argument : aggregation.getArguments()) {
       Symbol argumentSymbol = Symbol.from(argument);
@@ -1507,7 +1508,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
     if (node.getChildren().isEmpty()) {
       List<TSDataType> outputDataTypes =
           node.getOutputSymbols().stream()
-              .map(context.getTypeProvider()::getTableModelType)
+              .map(context.getTableTypeProvider()::getTableModelType)
               .map(InternalTypeManager::getTSDataType)
               .collect(Collectors.toList());
       OperatorContext operatorContext =
@@ -1522,13 +1523,13 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
 
       List<TSDataType> inputDataTypes =
           node.getChild().getOutputSymbols().stream()
-              .map(context.getTypeProvider()::getTableModelType)
+              .map(context.getTableTypeProvider()::getTableModelType)
               .map(InternalTypeManager::getTSDataType)
               .collect(Collectors.toList());
 
       List<TSDataType> outputDataTypes =
           node.getOutputSymbols().stream()
-              .map(context.getTypeProvider()::getTableModelType)
+              .map(context.getTableTypeProvider()::getTableModelType)
               .map(InternalTypeManager::getTSDataType)
               .collect(Collectors.toList());
 
@@ -1626,7 +1627,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
 
     // all output column types of the input table
     List<TSDataType> inputDataTypes =
-        getOutputColumnTypes(node.getChild(), context.getTypeProvider());
+        getOutputColumnTypes(node.getChild(), context.getTableTypeProvider());
 
     // input channels to be passed directly to output, excluding MEASURES 
columns
     ImmutableList.Builder<Integer> outputChannels = ImmutableList.builder();
@@ -1716,7 +1717,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
                   getOnlyElement(
                       getChannelsForSymbols(
                           ImmutableList.of(scalarPointer.getInputSymbol()), 
childLayout)),
-                  
context.getTypeProvider().getTableModelType(scalarPointer.getInputSymbol()),
+                  
context.getTableTypeProvider().getTableModelType(scalarPointer.getInputSymbol()),
                   
scalarPointer.getLogicalIndexPointer().toLogicalIndexNavigation(mapping)));
         } else if (pointer instanceof AggregationValuePointer) {
           AggregationValuePointer aggregationPointer = 
(AggregationValuePointer) pointer;
@@ -1807,7 +1808,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
                   getOnlyElement(
                       getChannelsForSymbols(
                           ImmutableList.of(scalarPointer.getInputSymbol()), 
childLayout)),
-                  
context.getTypeProvider().getTableModelType(scalarPointer.getInputSymbol()),
+                  
context.getTableTypeProvider().getTableModelType(scalarPointer.getInputSymbol()),
                   
scalarPointer.getLogicalIndexPointer().toLogicalIndexNavigation(mapping)));
         } else if (pointer instanceof AggregationValuePointer) {
           AggregationValuePointer aggregationPointer = 
(AggregationValuePointer) pointer;
@@ -1962,7 +1963,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         addOperatorContext(
             context, node.getPlanNodeId(), 
MarkDistinctOperator.class.getSimpleName());
 
-    TypeProvider typeProvider = context.getTypeProvider();
+    ITableTypeProvider typeProvider = context.getTableTypeProvider();
     Map<Symbol, Integer> childLayout =
         makeLayoutFromOutputSymbols(node.getChild().getOutputSymbols());
 
@@ -1978,7 +1979,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
 
   @Override
   public Operator visitWindowFunction(WindowNode node, C context) {
-    TypeProvider typeProvider = context.getTypeProvider();
+    ITableTypeProvider typeProvider = context.getTableTypeProvider();
     Operator child = node.getChild().accept(this, context);
     OperatorContext operatorContext =
         addOperatorContext(
@@ -2005,7 +2006,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
     ImmutableList.Builder<Integer> outputChannels = ImmutableList.builder();
     List<TSDataType> outputDataTypes = new ArrayList<>();
     List<TSDataType> inputDataTypes =
-        getOutputColumnTypes(node.getChild(), context.getTypeProvider());
+        getOutputColumnTypes(node.getChild(), context.getTableTypeProvider());
     for (int i = 0; i < inputDataTypes.size(); i++) {
       outputChannels.add(i);
       outputDataTypes.add(inputDataTypes.get(i));
@@ -2120,7 +2121,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
   private WindowAggregator buildWindowAggregator(
       Symbol symbol,
       WindowNode.Function function,
-      TypeProvider typeProvider,
+      ITableTypeProvider typeProvider,
       List<Integer> argumentChannels) {
     // Create accumulator first
     String functionName = 
function.getResolvedFunction().getSignature().getName();
@@ -2185,7 +2186,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         makeLayoutFromOutputSymbols(node.getChild().getOutputSymbols());
     List<Integer> partitionChannels = 
getChannelsForSymbols(partitionBySymbols, childLayout);
     List<TSDataType> inputDataTypes =
-        getOutputColumnTypes(node.getChild(), context.getTypeProvider());
+        getOutputColumnTypes(node.getChild(), context.getTableTypeProvider());
 
     ImmutableList.Builder<Integer> outputChannels = ImmutableList.builder();
     for (int i = 0; i < inputDataTypes.size(); i++) {
@@ -2222,7 +2223,7 @@ public abstract class TableOperatorGenerator<C extends 
ITableOperatorGeneratorCo
         makeLayoutFromOutputSymbols(node.getChild().getOutputSymbols());
     List<Integer> partitionChannels = 
getChannelsForSymbols(partitionBySymbols, childLayout);
     List<TSDataType> inputDataTypes =
-        getOutputColumnTypes(node.getChild(), context.getTypeProvider());
+        getOutputColumnTypes(node.getChild(), context.getTableTypeProvider());
     List<TSDataType> partitionTypes =
         
partitionChannels.stream().map(inputDataTypes::get).collect(toImmutableList());
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/analyze/ITableTypeProvider.java
similarity index 66%
copy from 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java
copy to 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/analyze/ITableTypeProvider.java
index 0948e39cb6a..b30a3edbebd 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/analyze/ITableTypeProvider.java
@@ -17,14 +17,20 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.calc_commons.plan.planner;
+package org.apache.iotdb.db.node_commons.plan.analyze;
 
-import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.node_commons.plan.relational.planner.Symbol;
 
-import java.time.ZoneId;
+import org.apache.tsfile.read.common.type.Type;
 
-public interface ITableOperatorGeneratorContext {
-  TypeProvider getTypeProvider();
+import java.util.Map;
 
-  ZoneId getZoneId();
+public interface ITableTypeProvider {
+  Type getTableModelType(Symbol symbol);
+
+  boolean isSymbolExist(Symbol symbol);
+
+  void putTableModelType(Symbol symbol, Type type);
+
+  Map<Symbol, Type> allTableModelTypes();
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/CommonPlanNodeDeserializer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/CommonPlanNodeDeserializer.java
index 3b508167851..392001e1989 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/CommonPlanNodeDeserializer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/CommonPlanNodeDeserializer.java
@@ -37,13 +37,14 @@ import 
org.apache.iotdb.db.node_commons.plan.relational.planner.node.UnionNode;
 import 
org.apache.iotdb.db.node_commons.plan.relational.planner.node.ValueFillNode;
 import 
org.apache.iotdb.db.node_commons.plan.relational.planner.node.ValuesNode;
 import 
org.apache.iotdb.db.node_commons.plan.relational.planner.node.WindowNode;
-import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
 
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
 public class CommonPlanNodeDeserializer implements IPlanNodeDeserializer {
+  public static final CommonPlanNodeDeserializer INSTANCE = new 
CommonPlanNodeDeserializer();
+
   @Override
   public PlanNode deserializeFromWAL(DataInputStream stream) throws 
IOException {
     throw new UnsupportedOperationException("Not supported for 
CommonPlanNodeDeserializer");
@@ -137,9 +138,4 @@ public class CommonPlanNodeDeserializer implements 
IPlanNodeDeserializer {
         throw new IllegalArgumentException("Invalid node type: " + nodeType);
     }
   }
-
-  @Override
-  public PlanNode deserializeWithTemplate(ByteBuffer buffer, TypeProvider 
typeProvider) {
-    throw new UnsupportedOperationException("Not supported for 
CommonPlanNodeDeserializer");
-  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java
index 9b90244b496..f918eec671a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java
@@ -14,8 +14,6 @@
 
 package org.apache.iotdb.db.node_commons.plan.planner.plan.node;
 
-import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
-
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -28,6 +26,4 @@ public interface IPlanNodeDeserializer {
   PlanNode deserialize(ByteBuffer buffer);
 
   PlanNode deserialize(ByteBuffer buffer, short nodeType);
-
-  PlanNode deserializeWithTemplate(ByteBuffer buffer, TypeProvider 
typeProvider);
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializerProvider.java
similarity index 55%
copy from 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java
copy to 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializerProvider.java
index 9b90244b496..72db2e50019 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializerProvider.java
@@ -14,20 +14,6 @@
 
 package org.apache.iotdb.db.node_commons.plan.planner.plan.node;
 
-import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public interface IPlanNodeDeserializer {
-  PlanNode deserializeFromWAL(DataInputStream stream) throws IOException;
-
-  PlanNode deserializeFromWAL(ByteBuffer buffer);
-
-  PlanNode deserialize(ByteBuffer buffer);
-
-  PlanNode deserialize(ByteBuffer buffer, short nodeType);
-
-  PlanNode deserializeWithTemplate(ByteBuffer buffer, TypeProvider 
typeProvider);
+public interface IPlanNodeDeserializerProvider {
+  IPlanNodeDeserializer getDeserializer();
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/PlanNodeType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/PlanNodeType.java
index 02291197f4c..328ed4c42bf 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/PlanNodeType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/PlanNodeType.java
@@ -19,8 +19,6 @@
 
 package org.apache.iotdb.db.node_commons.plan.planner.plan.node;
 
-import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
-
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 
 import java.io.DataInputStream;
@@ -208,14 +206,19 @@ public enum PlanNodeType {
   OBJECT_FILE_NODE((short) 2004),
   ;
 
-  private static IPlanNodeDeserializer deserializer;
+  private static final IPlanNodeDeserializer DESERIALIZER;
 
   static {
-    ServiceLoader<IPlanNodeDeserializer> loader = 
ServiceLoader.load(IPlanNodeDeserializer.class);
-    for (IPlanNodeDeserializer element : loader) {
-      deserializer = element;
+    IPlanNodeDeserializer deserializer = null;
+    ServiceLoader<IPlanNodeDeserializerProvider> loader =
+        ServiceLoader.load(IPlanNodeDeserializerProvider.class);
+    for (IPlanNodeDeserializerProvider provider : loader) {
+      if (deserializer != null) {
+        throw new IllegalStateException("Multiple 
IPlanNodeDeserializerProvider found");
+      }
+      deserializer = provider.getDeserializer();
     }
-    deserializer = deserializer == null ? new CommonPlanNodeDeserializer() : 
deserializer;
+    DESERIALIZER = deserializer == null ? CommonPlanNodeDeserializer.INSTANCE 
: deserializer;
   }
 
   public static final int BYTES = Short.BYTES;
@@ -239,22 +242,18 @@ public enum PlanNodeType {
   }
 
   public static PlanNode deserializeFromWAL(DataInputStream stream) throws 
IOException {
-    return deserializer.deserializeFromWAL(stream);
+    return DESERIALIZER.deserializeFromWAL(stream);
   }
 
   public static PlanNode deserializeFromWAL(ByteBuffer buffer) {
-    return deserializer.deserializeFromWAL(buffer);
+    return DESERIALIZER.deserializeFromWAL(buffer);
   }
 
   public static PlanNode deserialize(ByteBuffer buffer) {
-    return deserializer.deserialize(buffer);
+    return DESERIALIZER.deserialize(buffer);
   }
 
   public static PlanNode deserialize(ByteBuffer buffer, short nodeType) {
-    return deserializer.deserialize(buffer, nodeType);
-  }
-
-  public static PlanNode deserializeWithTemplate(ByteBuffer buffer, 
TypeProvider typeProvider) {
-    return deserializer.deserializeWithTemplate(buffer, typeProvider);
+    return DESERIALIZER.deserialize(buffer, nodeType);
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TypeProvider.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TypeProvider.java
index e5a6b8458cc..cd19b38a74d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TypeProvider.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TypeProvider.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.queryengine.plan.analyze;
 
+import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider;
 import org.apache.iotdb.db.node_commons.plan.relational.planner.Symbol;
 import org.apache.iotdb.db.node_commons.plan.relational.utils.TypeUtil;
 
@@ -40,7 +41,7 @@ import static 
com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 import static 
org.apache.iotdb.db.queryengine.plan.expression.leaf.TimestampOperand.TIMESTAMP_EXPRESSION_STRING;
 
-public class TypeProvider {
+public class TypeProvider implements ITableTypeProvider {
 
   private final Map<String, TSDataType> treeModelTypeMap;
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LocalExecutionPlanContext.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LocalExecutionPlanContext.java
index a410817decd..9a37072fb20 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LocalExecutionPlanContext.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LocalExecutionPlanContext.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.queryengine.plan.planner;
 import org.apache.iotdb.db.calc_commons.execution.operator.Operator;
 import 
org.apache.iotdb.db.calc_commons.plan.planner.ITableOperatorGeneratorContext;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider;
 import org.apache.iotdb.db.node_commons.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.node_commons.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.common.FragmentInstanceId;
@@ -308,6 +309,11 @@ public class LocalExecutionPlanContext implements 
ITableOperatorGeneratorContext
     return typeProvider;
   }
 
+  @Override
+  public ITableTypeProvider getTableTypeProvider() {
+    return typeProvider;
+  }
+
   public FragmentInstanceContext getInstanceContext() {
     return driverContext.getFragmentInstanceContext();
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/PlanFragment.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/PlanFragment.java
index 48a251050ee..d65524ac61d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/PlanFragment.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/PlanFragment.java
@@ -30,6 +30,7 @@ import org.apache.iotdb.db.queryengine.common.PlanFragmentId;
 import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.queryengine.plan.planner.SubPlanTypeExtractor;
 import 
org.apache.iotdb.db.queryengine.plan.planner.distribution.NodeDistribution;
+import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.DataNodePlanNodeDeserializer;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.AlignedSeriesAggregationScanNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.AlignedSeriesScanNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.VirtualSourceNode;
@@ -224,7 +225,8 @@ public class PlanFragment {
   public static PlanNode deserializeHelper(ByteBuffer byteBuffer, TypeProvider 
typeProvider) {
     PlanNode root;
     if (typeProvider != null && typeProvider.getTemplatedInfo() != null) {
-      root = PlanNodeType.deserializeWithTemplate(byteBuffer, typeProvider);
+      root =
+          
DataNodePlanNodeDeserializer.INSTANCE.deserializeWithTemplate(byteBuffer, 
typeProvider);
       if (root instanceof AlignedSeriesScanNode
           || root instanceof AlignedSeriesAggregationScanNode) {
         return root;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializer.java
index 35be4b56480..ebd8ae8d247 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializer.java
@@ -140,6 +140,7 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 
 public class DataNodePlanNodeDeserializer extends CommonPlanNodeDeserializer {
+  public static final DataNodePlanNodeDeserializer INSTANCE = new 
DataNodePlanNodeDeserializer();
 
   @Override
   public PlanNode deserializeFromWAL(DataInputStream stream) throws 
IOException {
@@ -474,7 +475,6 @@ public class DataNodePlanNodeDeserializer extends 
CommonPlanNodeDeserializer {
     }
   }
 
-  @Override
   public PlanNode deserializeWithTemplate(ByteBuffer buffer, TypeProvider 
typeProvider) {
     short nodeType = buffer.getShort();
     switch (nodeType) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializerProvider.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializerProvider.java
new file mode 100644
index 00000000000..f712056471f
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializerProvider.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed 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.planner.plan.node;
+
+import 
org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializer;
+import 
org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializerProvider;
+
+public class DataNodePlanNodeDeserializerProvider implements 
IPlanNodeDeserializerProvider {
+  @Override
+  public IPlanNodeDeserializer getDeserializer() {
+    return DataNodePlanNodeDeserializer.INSTANCE;
+  }
+}
diff --git 
a/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializer
 
b/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializerProvider
similarity index 69%
rename from 
iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializer
rename to 
iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializerProvider
index 7c010802331..bec380fc801 100644
--- 
a/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializer
+++ 
b/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializerProvider
@@ -1 +1 @@
-org.apache.iotdb.db.queryengine.plan.planner.plan.node.DataNodePlanNodeDeserializer
\ No newline at end of file
+org.apache.iotdb.db.queryengine.plan.planner.plan.node.DataNodePlanNodeDeserializerProvider


Reply via email to