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

caogaofei pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/ty/TableModelGrammar by this 
push:
     new a166a5f3f4f make TypeProvider of tree model and table model clear; add 
TableModelTypeProviderExtractor, ExpressionTranslateVisitor; make select 
projection expression available
     new 4059f88df97 merge
a166a5f3f4f is described below

commit a166a5f3f4f74c40db9b8666bc1c633f183a4367
Author: Beyyes <[email protected]>
AuthorDate: Tue Apr 23 18:49:46 2024 +0800

    make TypeProvider of tree model and table model clear; add 
TableModelTypeProviderExtractor, ExpressionTranslateVisitor; make select 
projection expression available
---
 .../execution/operator/AggregationUtil.java        |   2 +-
 .../relational/ColumnTransformerBuilder.java       |  74 ++++++------
 .../db/queryengine/plan/analyze/TypeProvider.java  |  80 +++++++------
 .../visitor/ColumnTransformerVisitor.java          |   2 +-
 .../predicate/ConvertPredicateToFilterVisitor.java |   2 +-
 .../plan/planner/LogicalPlanBuilder.java           |  24 ++--
 .../plan/planner/LogicalPlanVisitor.java           |   6 +-
 .../plan/planner/OperatorTreeGenerator.java        |  20 ++--
 .../plan/planner/SubPlanTypeExtractor.java         |  11 +-
 .../plan/planner/TableOperatorGenerator.java       |  12 +-
 .../plan/planner/TemplatedLogicalPlan.java         |   4 +-
 .../plan/planner/distribution/SourceRewriter.java  |   2 +-
 .../plan/relational/planner/LogicalPlanner.java    |  12 +-
 .../plan/relational/planner/PlanBuilder.java       |  74 ++++--------
 .../plan/relational/planner/QueryPlanner.java      |  83 +++++++-------
 .../plan/relational/planner/RelationPlanner.java   |  13 ++-
 .../TableModelTypeProviderExtractor.java           |  46 +++++---
 .../planner/ir/ExpressionTranslateVisitor.java     | 127 +++++++++++++++++++++
 .../planner/optimizations/IndexScan.java           |  10 +-
 .../execution/operator/OperatorMemoryTest.java     |  18 +--
 .../plan/planner/PipelineBuilderTest.java          |  22 ++--
 21 files changed, 392 insertions(+), 252 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationUtil.java
index d8b835f96c6..3cce822ac41 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationUtil.java
@@ -217,7 +217,7 @@ public class AggregationUtil {
     for (AggregationDescriptor descriptor : aggregationDescriptors) {
       List<TSDataType> outPutDataTypes =
           descriptor.getOutputColumnNames().stream()
-              .map(typeProvider::getType)
+              .map(typeProvider::getTreeModelType)
               .collect(Collectors.toList());
       for (TSDataType tsDataType : outPutDataTypes) {
         timeValueColumnsSizePerLine += getOutputColumnSizePerLine(tsDataType);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
index 577ef24121c..fec63e63cdf 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
@@ -118,44 +118,50 @@ public class ColumnTransformerBuilder
   @Override
   protected ColumnTransformer visitArithmeticBinary(
       ArithmeticBinaryExpression node, Context context) {
-    ColumnTransformer res =
-        context.cache.computeIfAbsent(
-            node,
-            n -> {
-              if (context.hasSeen.containsKey(node)) {
-                IdentityColumnTransformer identity =
-                    new IdentityColumnTransformer(
-                        DOUBLE, context.originSize + 
context.commonTransformerList.size());
-                ColumnTransformer columnTransformer = 
context.hasSeen.get(node);
-                columnTransformer.addReferenceCount();
-                context.commonTransformerList.add(columnTransformer);
-                context.leafList.add(identity);
-                context.inputDataTypes.add(TSDataType.DOUBLE);
-                return identity;
-              } else {
-                ColumnTransformer left = process(node.getLeft(), context);
-                ColumnTransformer right = process(node.getRight(), context);
-                switch (node.getOperator()) {
-                  case ADD:
-                    return new ArithmeticAdditionColumnTransformer(DOUBLE, 
left, right);
-                  case SUBTRACT:
-                    return new ArithmeticSubtractionColumnTransformer(DOUBLE, 
left, right);
-                  case MULTIPLY:
-                    return new 
ArithmeticMultiplicationColumnTransformer(DOUBLE, left, right);
-                  case DIVIDE:
-                    return new ArithmeticDivisionColumnTransformer(DOUBLE, 
left, right);
-                  case MODULUS:
-                    return new ArithmeticModuloColumnTransformer(DOUBLE, left, 
right);
-                  default:
-                    throw new UnsupportedOperationException(
-                        String.format(UNSUPPORTED_EXPRESSION, 
node.getOperator()));
-                }
-              }
-            });
+    ColumnTransformer res;
+    if (context.cache.containsKey(node)) {
+      res = context.cache.get(node);
+    } else {
+      res = getArithmeticBinaryTransformer(node, context);
+      context.cache.put(node, res);
+    }
     res.addReferenceCount();
     return res;
   }
 
+  private ColumnTransformer getArithmeticBinaryTransformer(
+      ArithmeticBinaryExpression node, Context context) {
+    if (context.hasSeen.containsKey(node)) {
+      IdentityColumnTransformer identity =
+          new IdentityColumnTransformer(
+              DOUBLE, context.originSize + 
context.commonTransformerList.size());
+      ColumnTransformer columnTransformer = context.hasSeen.get(node);
+      columnTransformer.addReferenceCount();
+      context.commonTransformerList.add(columnTransformer);
+      context.leafList.add(identity);
+      context.inputDataTypes.add(TSDataType.DOUBLE);
+      return identity;
+    } else {
+      ColumnTransformer left = process(node.getLeft(), context);
+      ColumnTransformer right = process(node.getRight(), context);
+      switch (node.getOperator()) {
+        case ADD:
+          return new ArithmeticAdditionColumnTransformer(DOUBLE, left, right);
+        case SUBTRACT:
+          return new ArithmeticSubtractionColumnTransformer(DOUBLE, left, 
right);
+        case MULTIPLY:
+          return new ArithmeticMultiplicationColumnTransformer(DOUBLE, left, 
right);
+        case DIVIDE:
+          return new ArithmeticDivisionColumnTransformer(DOUBLE, left, right);
+        case MODULUS:
+          return new ArithmeticModuloColumnTransformer(DOUBLE, left, right);
+        default:
+          throw new UnsupportedOperationException(
+              String.format(UNSUPPORTED_EXPRESSION, node.getOperator()));
+      }
+    }
+  }
+
   @Override
   protected ColumnTransformer visitArithmeticUnary(
       ArithmeticUnaryExpression node, Context context) {
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 2ac23332cbe..39945fc27ca 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
@@ -42,36 +42,35 @@ import static 
org.apache.iotdb.db.queryengine.plan.expression.leaf.TimestampOper
 
 public class TypeProvider {
 
-  private final Map<String, TSDataType> typeMap;
+  private final Map<String, TSDataType> treeModelTypeMap;
 
   private TemplatedInfo templatedInfo;
 
   public TypeProvider() {
-    this.typeMap = new HashMap<>();
-    types = null;
+    this.treeModelTypeMap = new HashMap<>();
   }
 
-  public TypeProvider(Map<String, TSDataType> typeMap, TemplatedInfo 
templatedInfo) {
-    this.typeMap = typeMap;
+  public TypeProvider(Map<String, TSDataType> treeModelTypeMap, TemplatedInfo 
templatedInfo) {
+    this.treeModelTypeMap = treeModelTypeMap;
     this.templatedInfo = templatedInfo;
     // The type of TimeStampOperand is INT64
-    this.typeMap.putIfAbsent(TIMESTAMP_EXPRESSION_STRING, TSDataType.INT64);
-    types = null;
+    this.treeModelTypeMap.putIfAbsent(TIMESTAMP_EXPRESSION_STRING, 
TSDataType.INT64);
+    this.tableModelTypes = null;
   }
 
-  public TSDataType getType(String symbol) {
-    return typeMap.get(symbol);
+  public TSDataType getTreeModelType(String symbol) {
+    return treeModelTypeMap.get(symbol);
   }
 
-  public void setType(String symbol, TSDataType dataType) {
+  public void setTreeModelType(String symbol, TSDataType dataType) {
     // DataType of NullOperand is null, we needn't put it into TypeProvider
     if (dataType != null) {
-      this.typeMap.put(symbol, dataType);
+      this.treeModelTypeMap.put(symbol, dataType);
     }
   }
 
-  public Map<String, TSDataType> getTypeMap() {
-    return this.typeMap;
+  public Map<String, TSDataType> getTreeModelTypeMap() {
+    return this.treeModelTypeMap;
   }
 
   public void setTemplatedInfo(TemplatedInfo templatedInfo) {
@@ -84,7 +83,7 @@ public class TypeProvider {
 
   // ----------------------used for relational 
model----------------------------
 
-  private final Map<Symbol, Type> types;
+  private Map<Symbol, Type> tableModelTypes = new HashMap<>();
 
   public static TypeProvider viewOf(Map<Symbol, Type> types) {
     return new TypeProvider(types);
@@ -98,43 +97,50 @@ public class TypeProvider {
     return new TypeProvider(ImmutableMap.of());
   }
 
-  public TypeProvider(Map<Symbol, Type> types) {
-    this.types = types;
+  public TypeProvider(Map<Symbol, Type> tableModelTypes) {
+    this.tableModelTypes = tableModelTypes;
 
-    this.typeMap = null;
+    this.treeModelTypeMap = null;
   }
 
   public TypeProvider(
-      Map<String, TSDataType> typeMap, TemplatedInfo templatedInfo, 
Map<Symbol, Type> types) {
-    this.typeMap = typeMap;
+      Map<String, TSDataType> treeModelTypeMap,
+      TemplatedInfo templatedInfo,
+      Map<Symbol, Type> tableModelTypes) {
+    this.treeModelTypeMap = treeModelTypeMap;
     this.templatedInfo = templatedInfo;
-    this.types = types;
+
+    this.tableModelTypes = tableModelTypes;
   }
 
   public Type getTableModelType(Symbol symbol) {
     requireNonNull(symbol, "symbol is null");
 
-    Type type = types.get(symbol);
-    checkArgument(type != null, "no type found for symbol '%s'", symbol);
+    Type type = tableModelTypes.get(symbol);
+    checkArgument(type != null, "no type found for symbol '%s' in 
TypeProvider", symbol);
 
     return type;
   }
 
+  public boolean isSymbolExist(Symbol symbol) {
+    return tableModelTypes.containsKey(symbol);
+  }
+
   public void putTableModelType(Symbol symbol, Type type) {
     requireNonNull(symbol, "symbol is null");
 
-    types.put(symbol, type);
+    tableModelTypes.put(symbol, type);
   }
 
-  public Map<Symbol, Type> allTypes() {
+  public Map<Symbol, Type> allTableModelTypes() {
     // types may be a HashMap, so creating an ImmutableMap here would add 
extra cost when allTypes
     // gets called frequently
-    return Collections.unmodifiableMap(types);
+    return Collections.unmodifiableMap(tableModelTypes);
   }
 
   public void serialize(ByteBuffer byteBuffer) {
-    ReadWriteIOUtils.write(typeMap.size(), byteBuffer);
-    for (Map.Entry<String, TSDataType> entry : typeMap.entrySet()) {
+    ReadWriteIOUtils.write(treeModelTypeMap.size(), byteBuffer);
+    for (Map.Entry<String, TSDataType> entry : treeModelTypeMap.entrySet()) {
       ReadWriteIOUtils.write(entry.getKey(), byteBuffer);
       ReadWriteIOUtils.write(entry.getValue().ordinal(), byteBuffer);
     }
@@ -146,11 +152,11 @@ public class TypeProvider {
       templatedInfo.serialize(byteBuffer);
     }
 
-    if (types == null) {
+    if (tableModelTypes == null) {
       ReadWriteIOUtils.write((byte) 0, byteBuffer);
     } else {
-      ReadWriteIOUtils.write(types.size(), byteBuffer);
-      for (Map.Entry<Symbol, Type> entry : types.entrySet()) {
+      ReadWriteIOUtils.write(tableModelTypes.size(), byteBuffer);
+      for (Map.Entry<Symbol, Type> entry : tableModelTypes.entrySet()) {
         ReadWriteIOUtils.write(entry.getKey().getName(), byteBuffer);
         ReadWriteIOUtils.write(entry.getValue().getTypeEnum().ordinal(), 
byteBuffer);
       }
@@ -158,8 +164,8 @@ public class TypeProvider {
   }
 
   public void serialize(DataOutputStream stream) throws IOException {
-    ReadWriteIOUtils.write(typeMap.size(), stream);
-    for (Map.Entry<String, TSDataType> entry : typeMap.entrySet()) {
+    ReadWriteIOUtils.write(treeModelTypeMap.size(), stream);
+    for (Map.Entry<String, TSDataType> entry : treeModelTypeMap.entrySet()) {
       ReadWriteIOUtils.write(entry.getKey(), stream);
       ReadWriteIOUtils.write(entry.getValue().ordinal(), stream);
     }
@@ -171,11 +177,11 @@ public class TypeProvider {
       templatedInfo.serialize(stream);
     }
 
-    if (types == null) {
+    if (tableModelTypes == null) {
       ReadWriteIOUtils.write((byte) 0, stream);
     } else {
-      ReadWriteIOUtils.write(types.size(), stream);
-      for (Map.Entry<Symbol, Type> entry : types.entrySet()) {
+      ReadWriteIOUtils.write(tableModelTypes.size(), stream);
+      for (Map.Entry<Symbol, Type> entry : tableModelTypes.entrySet()) {
         ReadWriteIOUtils.write(entry.getKey().getName(), stream);
         ReadWriteIOUtils.write(entry.getValue().getTypeEnum().ordinal(), 
stream);
       }
@@ -223,11 +229,11 @@ public class TypeProvider {
       return false;
     }
     TypeProvider that = (TypeProvider) o;
-    return Objects.equals(typeMap, that.typeMap);
+    return Objects.equals(treeModelTypeMap, that.treeModelTypeMap);
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(typeMap);
+    return Objects.hash(treeModelTypeMap);
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ColumnTransformerVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ColumnTransformerVisitor.java
index 09da66f3d9c..e537d7fc763 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ColumnTransformerVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ColumnTransformerVisitor.java
@@ -579,7 +579,7 @@ public class ColumnTransformerVisitor
 
     public TSDataType getType(Expression expression) {
       if (typeProvider != null) {
-        return typeProvider.getType(expression.getOutputSymbol());
+        return typeProvider.getTreeModelType(expression.getOutputSymbol());
       }
       return expressionTypes.get(NodeRef.of(expression));
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/predicate/ConvertPredicateToFilterVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/predicate/ConvertPredicateToFilterVisitor.java
index eb4a5ceebfe..69afeaa7a71 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/predicate/ConvertPredicateToFilterVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/predicate/ConvertPredicateToFilterVisitor.java
@@ -400,7 +400,7 @@ public class ConvertPredicateToFilterVisitor
       if (isBuildPlanUseTemplate) {
         return schemaMap.get(path.getFullPath()).getType();
       } else {
-        return typeProvider.getType(path.getFullPath());
+        return typeProvider.getTreeModelType(path.getFullPath());
       }
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
index 2a56d0e8140..05e0a90b4c4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
@@ -169,7 +169,7 @@ public class LogicalPlanBuilder {
               && !expression.getExpressionString().equals(ENDTIME)) {
             context
                 .getTypeProvider()
-                .setType(expression.getExpressionString(), 
getPreAnalyzedType(expression));
+                .setTreeModelType(expression.getExpressionString(), 
getPreAnalyzedType(expression));
           }
         });
   }
@@ -178,11 +178,11 @@ public class LogicalPlanBuilder {
     if (keys == null) {
       return;
     }
-    keys.forEach(k -> context.getTypeProvider().setType(k, dataType));
+    keys.forEach(k -> context.getTypeProvider().setTreeModelType(k, dataType));
   }
 
   private void updateTypeProviderWithConstantType(String columnName, 
TSDataType dataType) {
-    context.getTypeProvider().setType(columnName, dataType);
+    context.getTypeProvider().setTreeModelType(columnName, dataType);
   }
 
   public LogicalPlanBuilder planRawDataSource(
@@ -347,7 +347,7 @@ public class LogicalPlanBuilder {
         columnHeader ->
             context
                 .getTypeProvider()
-                .setType(columnHeader.getColumnName(), 
columnHeader.getColumnType()));
+                .setTreeModelType(columnHeader.getColumnName(), 
columnHeader.getColumnType()));
 
     return this;
   }
@@ -705,7 +705,7 @@ public class LogicalPlanBuilder {
       // Currently UDAF only supports one input series
       String inputExpressionStr =
           
aggregationDescriptor.getInputExpressions().get(0).getExpressionString();
-      typeProvider.setType(
+      typeProvider.setTreeModelType(
           String.format("%s(%s)", partialAggregationNames, 
inputExpressionStr), aggregationType);
     } else {
       List<String> partialAggregationsNames =
@@ -729,9 +729,11 @@ public class LogicalPlanBuilder {
       TypeProvider typeProvider, String partialAggregationName, String 
inputExpressionStr) {
     TSDataType aggregationType =
         
SchemaUtils.getBuiltinAggregationTypeByFuncName(partialAggregationName);
-    typeProvider.setType(
+    typeProvider.setTreeModelType(
         String.format("%s(%s)", partialAggregationName, inputExpressionStr),
-        aggregationType == null ? typeProvider.getType(inputExpressionStr) : 
aggregationType);
+        aggregationType == null
+            ? typeProvider.getTreeModelType(inputExpressionStr)
+            : aggregationType);
   }
 
   public static void updateTypeProviderByPartialAggregation(
@@ -747,13 +749,13 @@ public class LogicalPlanBuilder {
         // Currently UDAF only supports one input series
         String inputExpressionStr =
             
aggregationDescriptor.getInputExpressions().get(0).getExpressionString();
-        typeProvider.setType(
+        typeProvider.setTreeModelType(
             String.format("%s(%s)", partialAggregationNames, 
inputExpressionStr), aggregationType);
       } else {
         PartialPath path =
             ((TimeSeriesOperand) 
aggregationDescriptor.getOutputExpressions().get(0)).getPath();
         for (String partialAggregationName : partialAggregationsNames) {
-          typeProvider.setType(
+          typeProvider.setTreeModelType(
               String.format("%s(%s)", partialAggregationName, 
path.getFullPath()),
               SchemaUtils.getSeriesTypeByPath(path, partialAggregationName));
         }
@@ -861,7 +863,7 @@ public class LogicalPlanBuilder {
               -1);
     }
 
-    context.getTypeProvider().setType(DEVICE, TSDataType.TEXT);
+    context.getTypeProvider().setTreeModelType(DEVICE, TSDataType.TEXT);
     updateTypeProvider(deviceViewOutputExpressions);
 
     if (queryStatement.needPushDownSort()
@@ -1566,7 +1568,7 @@ public class LogicalPlanBuilder {
         columnHeader ->
             context
                 .getTypeProvider()
-                .setType(columnHeader.getColumnName(), 
columnHeader.getColumnType()));
+                .setTreeModelType(columnHeader.getColumnName(), 
columnHeader.getColumnType()));
     return this;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
index d10897534d0..a9e34803149 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
@@ -136,7 +136,9 @@ public class LogicalPlanVisitor extends 
StatementVisitor<PlanNode, MPPQueryConte
             explainAnalyzeStatement.isVerbose(),
             context.getLocalQueryId(),
             context.getTimeOut());
-    context.getTypeProvider().setType(ColumnHeaderConstant.EXPLAIN_ANALYZE, 
TSDataType.TEXT);
+    context
+        .getTypeProvider()
+        .setTreeModelType(ColumnHeaderConstant.EXPLAIN_ANALYZE, 
TSDataType.TEXT);
     return root;
   }
 
@@ -281,7 +283,7 @@ public class LogicalPlanVisitor extends 
StatementVisitor<PlanNode, MPPQueryConte
               || needTransform(sourceTransformExpressions)
               || cannotUseStatistics(aggregationExpressions, 
sourceTransformExpressions);
       if (queryStatement.isOutputEndTime()) {
-        context.getTypeProvider().setType(ENDTIME, TSDataType.INT64);
+        context.getTypeProvider().setTreeModelType(ENDTIME, TSDataType.INT64);
       }
       AggregationStep curStep;
       if (isRawDataSource) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
index 3b13ac78a9d..acd45e35757 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
@@ -1021,7 +1021,9 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
                 aggregationName,
                 getAggregationTypeByFuncName(aggregationName),
                 Collections.singletonList(
-                    
context.getTypeProvider().getType(functionExpression.getOutputSymbol())),
+                    context
+                        .getTypeProvider()
+                        
.getTreeModelType(functionExpression.getOutputSymbol())),
                 functionExpression.getExpressions(),
                 functionExpression.getFunctionAttributes(),
                 timeAscending,
@@ -1570,7 +1572,8 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
                   x ->
                       context
                           .getTypeProvider()
-                          
.getType(descriptor.getInputExpressions().get(x).getExpressionString()))
+                          .getTreeModelType(
+                              
descriptor.getInputExpressions().get(x).getExpressionString()))
               .collect(Collectors.toList());
       aggregators.add(
           new Aggregator(
@@ -1630,7 +1633,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
         List<InputLocation[]> inputLocations = 
calcInputLocationList(aggregationDescriptor, layout);
         List<TSDataType> inputDataTypes =
             aggregationDescriptor.getInputExpressions().stream()
-                .map(x -> 
context.getTypeProvider().getType(x.getExpressionString()))
+                .map(x -> 
context.getTypeProvider().getTreeModelType(x.getExpressionString()))
                 .collect(Collectors.toList());
         aggregators.add(
             new Aggregator(
@@ -1697,7 +1700,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
               descriptor.getAggregationFuncName(),
               descriptor.getAggregationType(),
               descriptor.getInputExpressions().stream()
-                  .map(x -> 
context.getTypeProvider().getType(x.getExpressionString()))
+                  .map(x -> 
context.getTypeProvider().getTreeModelType(x.getExpressionString()))
                   .collect(Collectors.toList()),
               descriptor.getInputExpressions(),
               descriptor.getInputAttributes(),
@@ -1770,7 +1773,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
                   descriptor.getAggregationFuncName(),
                   descriptor.getAggregationType(),
                   descriptor.getInputExpressions().stream()
-                      .map(x -> 
context.getTypeProvider().getType(x.getExpressionString()))
+                      .map(x -> 
context.getTypeProvider().getTreeModelType(x.getExpressionString()))
                       .collect(Collectors.toList()),
                   descriptor.getInputExpressions(),
                   descriptor.getInputAttributes(),
@@ -1811,7 +1814,8 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
               throw new IllegalArgumentException("groupByVariationExpression 
can't be null");
             }
             String controlColumn = 
groupByVariationExpression.getExpressionString();
-            TSDataType controlColumnType = 
context.getTypeProvider().getType(controlColumn);
+            TSDataType controlColumnType =
+                context.getTypeProvider().getTreeModelType(controlColumn);
             windowParameter =
                 new VariationWindowParameter(
                     controlColumnType,
@@ -2838,7 +2842,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
       return node.getChildren().stream()
           .map(PlanNode::getOutputColumnNames)
           .flatMap(List::stream)
-          .map(typeProvider::getType)
+          .map(typeProvider::getTreeModelType)
           .collect(Collectors.toList());
     } else {
       return getInputColumnTypesUseTemplate(node);
@@ -2867,7 +2871,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
 
   private List<TSDataType> getOutputColumnTypes(PlanNode node, TypeProvider 
typeProvider) {
     return node.getOutputColumnNames().stream()
-        .map(typeProvider::getType)
+        .map(typeProvider::getTreeModelType)
         .collect(Collectors.toList());
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/SubPlanTypeExtractor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/SubPlanTypeExtractor.java
index b8efa1e3b3d..0a8cf6dc827 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/SubPlanTypeExtractor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/SubPlanTypeExtractor.java
@@ -50,7 +50,7 @@ public class SubPlanTypeExtractor {
   public static TypeProvider extractor(PlanNode root, TypeProvider allTypes) {
 
     TypeProvider typeProvider =
-        new TypeProvider(allTypes.getTypeMap(), allTypes.getTemplatedInfo());
+        new TypeProvider(allTypes.getTreeModelTypeMap(), 
allTypes.getTemplatedInfo());
     root.accept(new Visitor(typeProvider, allTypes), null);
     return typeProvider;
   }
@@ -68,7 +68,7 @@ public class SubPlanTypeExtractor {
     @Override
     public Void visitPlan(PlanNode node, Void context) {
       node.getOutputColumnNames()
-          .forEach(name -> typeProvider.setType(name, allTypes.getType(name)));
+          .forEach(name -> typeProvider.setTreeModelType(name, 
allTypes.getTreeModelType(name)));
       for (PlanNode source : node.getChildren()) {
         source.accept(this, context);
       }
@@ -78,7 +78,7 @@ public class SubPlanTypeExtractor {
     @Override
     public Void visitSeriesAggregationScan(SeriesAggregationScanNode node, 
Void context) {
       String sourcePath = node.getSeriesPath().getFullPath();
-      typeProvider.setType(sourcePath, allTypes.getType(sourcePath));
+      typeProvider.setTreeModelType(sourcePath, 
allTypes.getTreeModelType(sourcePath));
       return visitPlan(node, context);
     }
 
@@ -88,7 +88,7 @@ public class SubPlanTypeExtractor {
       AlignedPath alignedPath = node.getAlignedPath();
       for (int i = 0; i < alignedPath.getColumnNum(); i++) {
         String sourcePath = 
alignedPath.getPathWithMeasurement(i).getFullPath();
-        typeProvider.setType(sourcePath, allTypes.getType(sourcePath));
+        typeProvider.setTreeModelType(sourcePath, 
allTypes.getTreeModelType(sourcePath));
       }
       return visitPlan(node, context);
     }
@@ -200,7 +200,8 @@ public class SubPlanTypeExtractor {
           .forEach(
               expression -> {
                 String expressionStr = expression.getExpressionString();
-                typeProvider.setType(expressionStr, 
allTypes.getType(expressionStr));
+                typeProvider.setTreeModelType(
+                    expressionStr, allTypes.getTreeModelType(expressionStr));
               });
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
index bd17059f141..57fbd344bd8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
@@ -236,6 +236,7 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
           Optional.of(pushDownPredicate),
           tableScanOperator,
           node.getOutputSymbols().stream()
+              .filter(symbol -> 
!TIMESTAMP_EXPRESSION_STRING.equalsIgnoreCase(symbol.getName()))
               .map(Symbol::toSymbolReference)
               .toArray(Expression[]::new),
           tableScanOperator.getResultDataTypes(),
@@ -296,7 +297,10 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
     return constructFilterAndProjectOperator(
         predicate,
         inputOperator,
-        
node.getOutputSymbols().stream().map(Symbol::toSymbolReference).toArray(Expression[]::new),
+        node.getOutputSymbols().stream()
+            .filter(symbol -> 
!TIMESTAMP_EXPRESSION_STRING.equalsIgnoreCase(symbol.getName()))
+            .map(Symbol::toSymbolReference)
+            .toArray(Expression[]::new),
         inputDataTypes,
         inputLocations,
         node.getPlanNodeId(),
@@ -414,7 +418,11 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
     return constructFilterAndProjectOperator(
         predicate,
         inputOperator,
-        node.getAssignments().getExpressions().toArray(new Expression[0]),
+        node.getAssignments().getMap().entrySet().stream()
+            .filter(
+                entry -> 
!TIMESTAMP_EXPRESSION_STRING.equalsIgnoreCase(entry.getKey().getName()))
+            .map(Map.Entry::getValue)
+            .toArray(Expression[]::new),
         inputDataTypes,
         inputLocations,
         node.getPlanNodeId(),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TemplatedLogicalPlan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TemplatedLogicalPlan.java
index 75222efb6fc..7c8111e1f29 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TemplatedLogicalPlan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TemplatedLogicalPlan.java
@@ -117,7 +117,9 @@ public class TemplatedLogicalPlan {
           .getExpressionTypes()
           .forEach(
               (key, value) ->
-                  
context.getTypeProvider().setType(key.getNode().getOutputSymbol(), value));
+                  context
+                      .getTypeProvider()
+                      .setTreeModelType(key.getNode().getOutputSymbol(), 
value));
     }
 
     context
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
index 97dfaf23fc0..0aa0014d81f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
@@ -259,7 +259,7 @@ public class SourceRewriter extends 
BaseSourceRewriter<DistributionPlanContext>
             context
                 .queryContext
                 .getTypeProvider()
-                .setType(partialFunctionExpression.getOutputSymbol(), 
dataType);
+                .setTreeModelType(partialFunctionExpression.getOutputSymbol(), 
dataType);
           }
           
newPartialOutputColumns.add(partialFunctionExpression.getOutputSymbol());
         }
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 531dc4fdff5..9190bcf5928 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
@@ -49,6 +49,7 @@ import java.util.Arrays;
 import java.util.List;
 
 import static java.util.Objects.requireNonNull;
+import static 
org.apache.iotdb.db.queryengine.plan.expression.leaf.TimestampOperand.TIMESTAMP_EXPRESSION_STRING;
 import static org.apache.tsfile.read.common.type.IntType.INT32;
 
 public class LogicalPlanner {
@@ -110,15 +111,17 @@ public class LogicalPlanner {
     RelationType outputDescriptor = analysis.getOutputDescriptor();
     for (Field field : outputDescriptor.getVisibleFields()) {
       String name = field.getName().orElse("_col" + columnNumber);
-      if (!"time".equalsIgnoreCase(name)) {
-        columnHeaders.add(new ColumnHeader(name, 
transferTypeToTsDataType(field.getType())));
-      }
 
       names.add(name);
       int fieldIndex = outputDescriptor.indexOf(field);
       Symbol symbol = plan.getSymbol(fieldIndex);
       outputs.add(symbol);
 
+      if (!TIMESTAMP_EXPRESSION_STRING.equalsIgnoreCase(name)) {
+        columnHeaders.add(
+            new ColumnHeader(symbol.getName(), 
transferTypeToTsDataType(field.getType())));
+      }
+
       columnNumber++;
     }
 
@@ -141,8 +144,7 @@ public class LogicalPlanner {
   }
 
   private RelationPlanner getRelationPlanner(Analysis analysis) {
-    return new RelationPlanner(
-        analysis, symbolAllocator, context.getQueryId(), sessionInfo, 
ImmutableMap.of());
+    return new RelationPlanner(analysis, symbolAllocator, context, 
sessionInfo, ImmutableMap.of());
   }
 
   public TSDataType transferTypeToTsDataType(Type type) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
index d48cc74ef71..38af83ec7f8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
@@ -13,32 +13,25 @@
  */
 package org.apache.iotdb.db.queryengine.plan.relational.planner;
 
-import org.apache.iotdb.db.queryengine.common.QueryId;
-import org.apache.iotdb.db.queryengine.common.SessionInfo;
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.NodeRef;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.ResolvedField;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Scope;
+import 
org.apache.iotdb.db.queryengine.plan.relational.planner.ir.ExpressionTranslateVisitor;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ProjectNode;
-import org.apache.iotdb.db.relational.sql.tree.ComparisonExpression;
 import org.apache.iotdb.db.relational.sql.tree.Expression;
 import org.apache.iotdb.db.relational.sql.tree.FieldReference;
-import org.apache.iotdb.db.relational.sql.tree.Identifier;
-import org.apache.iotdb.db.relational.sql.tree.LogicalExpression;
-import org.apache.iotdb.db.relational.sql.tree.SymbolReference;
-
-import com.google.common.collect.ImmutableMap;
 
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import static com.google.common.base.Verify.verify;
-import static com.google.common.collect.ImmutableList.toImmutableList;
 import static java.util.Objects.requireNonNull;
 
 public class PlanBuilder {
@@ -58,16 +51,7 @@ public class PlanBuilder {
     this.fieldSymbols = fieldSymbols;
   }
 
-  public static PlanBuilder newPlanBuilder(
-      RelationPlan plan, Analysis analysis, SessionInfo session) {
-    return newPlanBuilder(plan, analysis, ImmutableMap.of(), session);
-  }
-
-  public static PlanBuilder newPlanBuilder(
-      RelationPlan plan,
-      Analysis analysis,
-      Map<ScopeAware<Expression>, Symbol> mappings,
-      SessionInfo session) {
+  public static PlanBuilder newPlanBuilder(RelationPlan plan, Analysis 
analysis) {
     return new PlanBuilder(
         plan.getRoot(), analysis, plan.getFieldMappings().toArray(new 
Symbol[0]));
   }
@@ -88,39 +72,20 @@ public class PlanBuilder {
     return this.fieldSymbols;
   }
 
-  public Expression rewrite(Expression root, boolean isRoot) {
+  public Expression rewrite(Expression root) {
     verify(
         analysis.isAnalyzed(root),
         "Expression is not analyzed (%s): %s",
         root.getClass().getName(),
         root);
-    return translate(root, isRoot);
+    return translate(root);
   }
 
-  private Expression translate(Expression expression, boolean isRoot) {
-    // TODO add more translate expressions impl
-    if (expression instanceof FieldReference) {
-      return new 
SymbolReference(getSymbolForColumn(expression).get().getName());
-    } else if (expression instanceof ComparisonExpression) {
-      ComparisonExpression comparisonExpression = (ComparisonExpression) 
expression;
-      Expression left = translate(comparisonExpression.getLeft(), false);
-      Expression right = translate(comparisonExpression.getRight(), false);
-      return new ComparisonExpression(comparisonExpression.getOperator(), 
left, right);
-    } else if (expression instanceof Identifier) {
-      return 
getSymbolForColumn(expression).map(Symbol::toSymbolReference).get();
-    } else if (expression instanceof LogicalExpression) {
-      LogicalExpression logicalExpression = (LogicalExpression) expression;
-      return new LogicalExpression(
-          logicalExpression.getOperator(),
-          logicalExpression.getTerms().stream()
-              .map(e -> translate(e, false))
-              .collect(toImmutableList()));
-    }
-
-    return expression;
+  private Expression translate(Expression expression) {
+    return new ExpressionTranslateVisitor().process(expression, this);
   }
 
-  private Optional<Symbol> getSymbolForColumn(Expression expression) {
+  public Optional<Symbol> getSymbolForColumn(Expression expression) {
     if (!analysis.isColumnReference(expression)) {
       // Expression can be a reference to lambda argument (or 
DereferenceExpression based on lambda
       // argument reference).
@@ -142,33 +107,34 @@ public class PlanBuilder {
       Iterable<T> expressions,
       Analysis analysis,
       SymbolAllocator symbolAllocator,
-      QueryId idAllocator) {
+      MPPQueryContext queryContext) {
     Assignments.Builder projections = Assignments.builder();
 
     // add an identity projection for underlying plan
     projections.putIdentities(root.getOutputSymbols());
 
-    Set<String> set = new HashSet<>();
-    for (Symbol symbol : root.getOutputSymbols()) {
-      set.add(symbol.toString());
-    }
+    Set<String> symbolSet =
+        
root.getOutputSymbols().stream().map(Symbol::getName).collect(Collectors.toSet());
 
     Map<Expression, Symbol> mappings = new HashMap<>();
     for (T expression : expressions) {
       // Skip any expressions that have already been translated and recorded 
in the
       // translation map, or that are duplicated in the list of exp
       if (!mappings.containsKey(expression)
-          && !set.contains(expression.toString().toLowerCase())
+          && !symbolSet.contains(expression.toString().toLowerCase())
           && !(expression instanceof FieldReference)) {
-        set.add(expression.toString());
-        Symbol symbol = symbolAllocator.newSymbol("expr", 
analysis.getType(expression));
-        projections.put(symbol, expression);
+        symbolSet.add(expression.toString());
+        // Symbol symbol = symbolAllocator.newSymbol("expr", 
analysis.getType(expression));
+        Symbol symbol =
+            symbolAllocator.newSymbol(expression.toString(), 
analysis.getType(expression));
+        queryContext.getTypeProvider().putTableModelType(symbol, 
analysis.getType(expression));
+        projections.put(symbol, translate(expression));
         mappings.put(expression, symbol);
       }
     }
 
     return new PlanBuilder(
-        new ProjectNode(idAllocator.genPlanNodeId(), this.root, 
projections.build()),
+        new ProjectNode(queryContext.getQueryId().genPlanNodeId(), this.root, 
projections.build()),
         this.analysis,
         this.fieldSymbols);
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
index f542fb07c7d..5f1f193e2e6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
@@ -13,6 +13,7 @@
  */
 package org.apache.iotdb.db.queryengine.plan.relational.planner;
 
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.QueryId;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
@@ -54,7 +55,8 @@ import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.PredicateU
 public class QueryPlanner {
   private final Analysis analysis;
   private final SymbolAllocator symbolAllocator;
-  private final QueryId idAllocator;
+  private final MPPQueryContext queryContext;
+  private final QueryId queryIdAllocator;
   private final SessionInfo session;
   private final Map<NodeRef<Node>, RelationPlan> recursiveSubqueries;
 
@@ -64,18 +66,19 @@ public class QueryPlanner {
   public QueryPlanner(
       Analysis analysis,
       SymbolAllocator symbolAllocator,
-      QueryId idAllocator,
+      MPPQueryContext queryContext,
       SessionInfo session,
       Map<NodeRef<Node>, RelationPlan> recursiveSubqueries) {
     requireNonNull(analysis, "analysis is null");
     requireNonNull(symbolAllocator, "symbolAllocator is null");
-    requireNonNull(idAllocator, "idAllocator is null");
+    requireNonNull(queryContext, "idAllocator is null");
     requireNonNull(session, "session is null");
     requireNonNull(recursiveSubqueries, "recursiveSubqueries is null");
 
     this.analysis = analysis;
     this.symbolAllocator = symbolAllocator;
-    this.idAllocator = idAllocator;
+    this.queryContext = queryContext;
+    this.queryIdAllocator = queryContext.getQueryId();
     this.session = session;
     this.recursiveSubqueries = recursiveSubqueries;
   }
@@ -83,9 +86,6 @@ public class QueryPlanner {
   public RelationPlan plan(Query query) {
     PlanBuilder builder = planQueryBody(query.getQueryBody());
 
-    List<Expression> orderBy = analysis.getOrderByExpressions(query);
-    // builder = subqueryPlanner.handleSubqueries(builder, orderBy, 
analysis.getSubqueries(query));
-
     // TODO result is :input[0], :input[1], :input[2]
     List<Analysis.SelectExpression> selectExpressions = 
analysis.getSelectExpressions(query);
     List<Expression> outputs =
@@ -93,10 +93,11 @@ public class QueryPlanner {
             .map(Analysis.SelectExpression::getExpression)
             .collect(toImmutableList());
 
+    List<Expression> orderBy = analysis.getOrderByExpressions(query);
     if (orderBy.size() > 0) {
       builder =
           builder.appendProjections(
-              Iterables.concat(orderBy, outputs), analysis, symbolAllocator, 
idAllocator);
+              Iterables.concat(orderBy, outputs), analysis, symbolAllocator, 
queryContext);
     }
 
     Optional<OrderingScheme> orderingScheme =
@@ -104,27 +105,28 @@ public class QueryPlanner {
     builder = sort(builder, orderingScheme);
     builder = offset(builder, query.getOffset());
     builder = limit(builder, query.getLimit(), orderingScheme);
-    builder = builder.appendProjections(outputs, analysis, symbolAllocator, 
idAllocator);
+    builder = builder.appendProjections(outputs, analysis, symbolAllocator, 
queryContext);
 
     return new RelationPlan(
-        builder.getRoot(), analysis.getScope(query), computeOutputs(builder, 
analysis, outputs));
+        builder.getRoot(), analysis.getScope(query), computeOutputs(builder, 
outputs));
   }
 
   public RelationPlan plan(QuerySpecification node) {
     PlanBuilder builder = planFrom(node);
 
-    builder = filter(builder, analysis.getWhere(node), node);
+    builder = filter(builder, analysis.getWhere(node));
 
     List<Analysis.SelectExpression> selectExpressions = 
analysis.getSelectExpressions(node);
-    List<Expression> expressions =
-        selectExpressions.stream()
-            .map(Analysis.SelectExpression::getExpression)
-            .collect(toImmutableList());
 
     if (hasExpressionsToUnfold(selectExpressions)) {
+      List<Expression> expressions =
+          selectExpressions.stream()
+              .map(Analysis.SelectExpression::getExpression)
+              .collect(toImmutableList());
+
       // pre-project the folded expressions to preserve any non-deterministic 
semantics of functions
       // that might be referenced
-      builder = builder.appendProjections(expressions, analysis, 
symbolAllocator, idAllocator);
+      builder = builder.appendProjections(expressions, analysis, 
symbolAllocator, queryContext);
     }
 
     List<Expression> outputs = outputExpressions(selectExpressions);
@@ -137,13 +139,13 @@ public class QueryPlanner {
         // aggregations are visible.
         List<Expression> orderByAggregates = 
analysis.getOrderByAggregates(node.getOrderBy().get());
         builder =
-            builder.appendProjections(orderByAggregates, analysis, 
symbolAllocator, idAllocator);
+            builder.appendProjections(orderByAggregates, analysis, 
symbolAllocator, queryContext);
       }
 
       // Add projections for the outputs of SELECT, but stack them on top of 
the ones from the FROM
       // clause so both are visible
       // when resolving the ORDER BY clause.
-      builder = builder.appendProjections(outputs, analysis, symbolAllocator, 
idAllocator);
+      builder = builder.appendProjections(outputs, analysis, symbolAllocator, 
queryContext);
 
       // The new scope is the composite of the fields from the FROM and SELECT 
clause (local nested
       // scopes). Fields from the bottom of
@@ -163,7 +165,7 @@ public class QueryPlanner {
     if (orderBy.size() > 0) {
       builder =
           builder.appendProjections(
-              Iterables.concat(orderBy, outputs), analysis, symbolAllocator, 
idAllocator);
+              Iterables.concat(orderBy, outputs), analysis, symbolAllocator, 
queryContext);
     }
 
     Optional<OrderingScheme> orderingScheme =
@@ -171,10 +173,11 @@ public class QueryPlanner {
     builder = sort(builder, orderingScheme);
     builder = offset(builder, node.getOffset());
     builder = limit(builder, node.getLimit(), orderingScheme);
-    builder = builder.appendProjections(outputs, analysis, symbolAllocator, 
idAllocator);
+
+    builder = builder.appendProjections(outputs, analysis, symbolAllocator, 
queryContext);
 
     return new RelationPlan(
-        builder.getRoot(), analysis.getScope(node), computeOutputs(builder, 
analysis, outputs));
+        builder.getRoot(), analysis.getScope(node), computeOutputs(builder, 
outputs));
 
     // TODO handle aggregate, having, distinct, subQuery later
   }
@@ -204,11 +207,9 @@ public class QueryPlanner {
   }
 
   private static List<Symbol> computeOutputs(
-      PlanBuilder builder, Analysis analysis, List<Expression> 
outputExpressions) {
+      PlanBuilder builder, List<Expression> outputExpressions) {
     ImmutableList.Builder<Symbol> outputSymbols = ImmutableList.builder();
     for (Expression expression : outputExpressions) {
-      // Symbol symbol = builder.translate(analysis, expression);
-      // outputSymbols.add(symbol);
       Symbol symbol = null;
       if (expression instanceof FieldReference) {
         FieldReference reference = (FieldReference) expression;
@@ -221,26 +222,26 @@ public class QueryPlanner {
 
   private PlanBuilder planQueryBody(QueryBody queryBody) {
     RelationPlan relationPlan =
-        new RelationPlanner(analysis, symbolAllocator, idAllocator, session, 
recursiveSubqueries)
+        new RelationPlanner(analysis, symbolAllocator, queryContext, session, 
recursiveSubqueries)
             .process(queryBody, null);
 
-    return newPlanBuilder(relationPlan, analysis, session);
+    return newPlanBuilder(relationPlan, analysis);
   }
 
   private PlanBuilder planFrom(QuerySpecification node) {
     if (node.getFrom().isPresent()) {
       RelationPlan relationPlan =
-          new RelationPlanner(analysis, symbolAllocator, idAllocator, session, 
recursiveSubqueries)
+          new RelationPlanner(analysis, symbolAllocator, queryContext, 
session, recursiveSubqueries)
               .process(node.getFrom().get(), null);
-      return newPlanBuilder(relationPlan, analysis, session);
+      return newPlanBuilder(relationPlan, analysis);
     } else {
       throw new IllegalStateException("From clause must not by empty");
     }
   }
 
-  private PlanBuilder filter(PlanBuilder subPlan, Expression predicate, Node 
node) {
+  private PlanBuilder filter(PlanBuilder planBuilder, Expression predicate) {
     if (predicate == null) {
-      return subPlan;
+      return planBuilder;
     }
 
     Pair<Expression, Boolean> resultPair = 
extractGlobalTimePredicate(predicate, true, true);
@@ -248,13 +249,15 @@ public class QueryPlanner {
     analysis.setGlobalTableModelTimePredicate(globalTimePredicate);
     boolean hasValueFilter = resultPair.right;
     if (!hasValueFilter) {
-      return subPlan;
+      return planBuilder;
     }
-    // TODO if predicate equals true, no need filter
+    // TODO if predicate equals TrueConstant, no need filter
 
-    return subPlan.withNewRoot(
+    return planBuilder.withNewRoot(
         new FilterNode(
-            idAllocator.genPlanNodeId(), subPlan.getRoot(), 
subPlan.rewrite(predicate, true)));
+            queryIdAllocator.genPlanNodeId(),
+            planBuilder.getRoot(),
+            planBuilder.rewrite(predicate)));
 
     // subPlan = subqueryPlanner.handleSubqueries(subPlan, predicate, 
analysis.getSubqueries(node));
   }
@@ -298,7 +301,8 @@ public class QueryPlanner {
     }
 
     return subPlan.withNewRoot(
-        new SortNode(idAllocator.genPlanNodeId(), subPlan.getRoot(), 
orderingScheme.get(), false));
+        new SortNode(
+            queryIdAllocator.genPlanNodeId(), subPlan.getRoot(), 
orderingScheme.get(), false));
   }
 
   private PlanBuilder offset(PlanBuilder subPlan, Optional<Offset> offset) {
@@ -308,20 +312,17 @@ public class QueryPlanner {
 
     return subPlan.withNewRoot(
         new OffsetNode(
-            idAllocator.genPlanNodeId(), subPlan.getRoot(), 
analysis.getOffset(offset.get())));
+            queryIdAllocator.genPlanNodeId(), subPlan.getRoot(), 
analysis.getOffset(offset.get())));
   }
 
   private PlanBuilder limit(
       PlanBuilder subPlan, Optional<Node> limit, Optional<OrderingScheme> 
orderingScheme) {
     if (limit.isPresent() && analysis.getLimit(limit.get()).isPresent()) {
       Optional<OrderingScheme> tiesResolvingScheme = Optional.empty();
-      //            if (limit.get() instanceof FetchFirst && ((FetchFirst)
-      // limit.get()).isWithTies()) {
-      //                tiesResolvingScheme = orderingScheme;
-      //            }
+
       return subPlan.withNewRoot(
           new LimitNode(
-              idAllocator.genPlanNodeId(),
+              queryIdAllocator.genPlanNodeId(),
               subPlan.getRoot(),
               analysis.getLimit(limit.get()).getAsLong(),
               tiesResolvingScheme));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
index 50c33ee6c58..d991db2ca71 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
@@ -14,6 +14,7 @@
 package org.apache.iotdb.db.queryengine.plan.relational.planner;
 
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.QueryId;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
@@ -49,6 +50,7 @@ import static java.util.Objects.requireNonNull;
 public class RelationPlanner extends AstVisitor<RelationPlan, Void> {
   private final Analysis analysis;
   private final SymbolAllocator symbolAllocator;
+  private final MPPQueryContext queryContext;
   private final QueryId idAllocator;
   private final SessionInfo sessionInfo;
   private final Map<NodeRef<Node>, RelationPlan> recursiveSubqueries;
@@ -56,18 +58,19 @@ public class RelationPlanner extends 
AstVisitor<RelationPlan, Void> {
   public RelationPlanner(
       Analysis analysis,
       SymbolAllocator symbolAllocator,
-      QueryId idAllocator,
+      MPPQueryContext queryContext,
       SessionInfo sessionInfo,
       Map<NodeRef<Node>, RelationPlan> recursiveSubqueries) {
     requireNonNull(analysis, "analysis is null");
     requireNonNull(symbolAllocator, "symbolAllocator is null");
-    requireNonNull(idAllocator, "idAllocator is null");
+    requireNonNull(queryContext, "queryContext is null");
     requireNonNull(sessionInfo, "session is null");
     requireNonNull(recursiveSubqueries, "recursiveSubqueries is null");
 
     this.analysis = analysis;
     this.symbolAllocator = symbolAllocator;
-    this.idAllocator = idAllocator;
+    this.queryContext = queryContext;
+    this.idAllocator = queryContext.getQueryId();
     this.sessionInfo = sessionInfo;
     this.recursiveSubqueries = recursiveSubqueries;
   }
@@ -75,7 +78,7 @@ public class RelationPlanner extends AstVisitor<RelationPlan, 
Void> {
   @Override
   protected RelationPlan visitQuery(Query node, Void context) {
     return new QueryPlanner(
-            analysis, symbolAllocator, idAllocator, sessionInfo, 
recursiveSubqueries)
+            analysis, symbolAllocator, queryContext, sessionInfo, 
recursiveSubqueries)
         .plan(node);
   }
 
@@ -133,7 +136,7 @@ public class RelationPlanner extends 
AstVisitor<RelationPlan, Void> {
   @Override
   protected RelationPlan visitQuerySpecification(QuerySpecification node, Void 
context) {
     return new QueryPlanner(
-            analysis, symbolAllocator, idAllocator, sessionInfo, 
recursiveSubqueries)
+            analysis, symbolAllocator, queryContext, sessionInfo, 
recursiveSubqueries)
         .plan(node);
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableModelTypeProviderExtractor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableModelTypeProviderExtractor.java
index 2ac38f8b0da..60b1b564898 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableModelTypeProviderExtractor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableModelTypeProviderExtractor.java
@@ -22,32 +22,43 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OutputNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ProjectNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode;
+import org.apache.iotdb.db.relational.sql.tree.Expression;
 
 import org.apache.tsfile.read.common.type.BooleanType;
 
 import java.util.HashMap;
+import java.util.Map;
 
 public class TableModelTypeProviderExtractor {
-  public static TypeProvider extractor(PlanNode root, TypeProvider allTypes) {
-    TypeProvider typeProvider = new TypeProvider(new HashMap<>());
-    root.accept(new Visitor(typeProvider, allTypes), null);
-    return typeProvider;
+
+  private TableModelTypeProviderExtractor() {}
+
+  public static TypeProvider extractor(PlanNode root, TypeProvider 
analyzedTypeProvider) {
+    TypeProvider operatorTypeProvider = new TypeProvider(new HashMap<>());
+    root.accept(new Visitor(operatorTypeProvider, analyzedTypeProvider), null);
+    return operatorTypeProvider;
   }
 
   private static class Visitor extends SimplePlanVisitor<Void> {
-    private final TypeProvider typeProvider;
-    private final TypeProvider allTypes;
 
-    public Visitor(TypeProvider typeProvider, TypeProvider allTypes) {
-      this.typeProvider = typeProvider;
-      this.allTypes = allTypes;
+    // typeProvider used for be operator execution
+    private final TypeProvider beTypeProvider;
+
+    // typeProvider analyzed in fe stage
+    private final TypeProvider feTypeProvider;
+
+    public Visitor(TypeProvider beTypeProvider, TypeProvider feTypeProvider) {
+      this.beTypeProvider = beTypeProvider;
+      this.feTypeProvider = feTypeProvider;
     }
 
     @Override
     public Void visitPlan(PlanNode node, Void context) {
       node.getOutputSymbols()
           .forEach(
-              symbol -> typeProvider.putTableModelType(symbol, 
allTypes.getTableModelType(symbol)));
+              symbol ->
+                  beTypeProvider.putTableModelType(
+                      symbol, feTypeProvider.getTableModelType(symbol)));
       for (PlanNode source : node.getChildren()) {
         source.accept(this, context);
       }
@@ -56,24 +67,27 @@ public class TableModelTypeProviderExtractor {
 
     @Override
     public Void visitTableScan(TableScanNode node, Void context) {
-      node.getAssignments().forEach((k, v) -> 
typeProvider.putTableModelType(k, v.getType()));
+      node.getAssignments().forEach((k, v) -> 
beTypeProvider.putTableModelType(k, v.getType()));
       return null;
     }
 
     @Override
     public Void visitProject(ProjectNode node, Void context) {
       node.getChild().accept(this, context);
-      // TODO add expression process logic
-      //            node.getAssignments().forEach((k,v) -> 
typeProvider.putTableModelType(k,
-      //                    v.getType()));
+      for (Map.Entry<Symbol, Expression> entry : 
node.getAssignments().getMap().entrySet()) {
+        Symbol symbol = entry.getKey();
+        if (!beTypeProvider.isSymbolExist(symbol)) {
+          beTypeProvider.putTableModelType(symbol, 
feTypeProvider.getTableModelType(symbol));
+        }
+      }
       return null;
     }
 
     @Override
     public Void visitFilter(FilterNode node, Void context) {
       node.getChild().accept(this, context);
-      // fixme toString method of expression is not expected
-      typeProvider.putTableModelType(
+      // TODO consider complex filter expression
+      beTypeProvider.putTableModelType(
           new Symbol(node.getPredicate().toString()), BooleanType.BOOLEAN);
       return null;
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTranslateVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTranslateVisitor.java
new file mode 100644
index 00000000000..400184f91b0
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTranslateVisitor.java
@@ -0,0 +1,127 @@
+/*
+ * 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.relational.planner.ir;
+
+import org.apache.iotdb.db.queryengine.plan.relational.planner.PlanBuilder;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
+import org.apache.iotdb.db.relational.sql.tree.ArithmeticBinaryExpression;
+import org.apache.iotdb.db.relational.sql.tree.AstVisitor;
+import org.apache.iotdb.db.relational.sql.tree.BetweenPredicate;
+import org.apache.iotdb.db.relational.sql.tree.ComparisonExpression;
+import org.apache.iotdb.db.relational.sql.tree.Expression;
+import org.apache.iotdb.db.relational.sql.tree.Identifier;
+import org.apache.iotdb.db.relational.sql.tree.IfExpression;
+import org.apache.iotdb.db.relational.sql.tree.InPredicate;
+import org.apache.iotdb.db.relational.sql.tree.IsNotNullPredicate;
+import org.apache.iotdb.db.relational.sql.tree.IsNullPredicate;
+import org.apache.iotdb.db.relational.sql.tree.LikePredicate;
+import org.apache.iotdb.db.relational.sql.tree.Literal;
+import org.apache.iotdb.db.relational.sql.tree.LogicalExpression;
+import org.apache.iotdb.db.relational.sql.tree.NotExpression;
+import org.apache.iotdb.db.relational.sql.tree.NullIfExpression;
+import org.apache.iotdb.db.relational.sql.tree.SearchedCaseExpression;
+import org.apache.iotdb.db.relational.sql.tree.SimpleCaseExpression;
+import org.apache.iotdb.db.relational.sql.tree.SymbolReference;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+/** Change Identifier to SymbolReference */
+public class ExpressionTranslateVisitor extends AstVisitor<Expression, 
PlanBuilder> {
+
+  @Override
+  protected Expression visitSymbolReference(SymbolReference node, PlanBuilder 
context) {
+    return new 
SymbolReference(context.getSymbolForColumn(node).get().getName());
+  }
+
+  @Override
+  protected Expression visitIdentifier(Identifier node, PlanBuilder context) {
+    return 
context.getSymbolForColumn(node).map(Symbol::toSymbolReference).get();
+  }
+
+  @Override
+  protected Expression visitInPredicate(InPredicate node, PlanBuilder context) 
{
+    return null;
+  }
+
+  @Override
+  protected Expression visitIsNullPredicate(IsNullPredicate node, PlanBuilder 
context) {
+    return null;
+  }
+
+  @Override
+  protected Expression visitIsNotNullPredicate(IsNotNullPredicate node, 
PlanBuilder context) {
+    return null;
+  }
+
+  @Override
+  protected Expression visitLikePredicate(LikePredicate node, PlanBuilder 
context) {
+    return null;
+  }
+
+  @Override
+  protected Expression visitLogicalExpression(LogicalExpression node, 
PlanBuilder context) {
+    return new LogicalExpression(
+        node.getOperator(),
+        node.getTerms().stream().map(e -> process(e, 
context)).collect(toImmutableList()));
+  }
+
+  @Override
+  protected Expression visitNotExpression(NotExpression node, PlanBuilder 
context) {
+    return null;
+  }
+
+  @Override
+  protected Expression visitComparisonExpression(ComparisonExpression node, 
PlanBuilder context) {
+    Expression left = process(node.getLeft(), context);
+    Expression right = process(node.getRight(), context);
+    return new ComparisonExpression(node.getOperator(), left, right);
+  }
+
+  @Override
+  protected Expression visitSimpleCaseExpression(SimpleCaseExpression node, 
PlanBuilder context) {
+    return null;
+  }
+
+  @Override
+  protected Expression visitSearchedCaseExpression(
+      SearchedCaseExpression node, PlanBuilder context) {
+    return null;
+  }
+
+  @Override
+  protected Expression visitIfExpression(IfExpression node, PlanBuilder 
context) {
+    return null;
+  }
+
+  @Override
+  protected Expression visitNullIfExpression(NullIfExpression node, 
PlanBuilder context) {
+    return null;
+  }
+
+  @Override
+  protected Expression visitBetweenPredicate(BetweenPredicate node, 
PlanBuilder context) {
+    return null;
+  }
+
+  @Override
+  protected Expression visitArithmeticBinary(ArithmeticBinaryExpression node, 
PlanBuilder context) {
+    return new ArithmeticBinaryExpression(
+        node.getOperator(), process(node.getLeft(), context), 
process(node.getRight(), context));
+  }
+
+  @Override
+  protected Expression visitLiteral(Literal node, PlanBuilder context) {
+    return node;
+  }
+}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java
index 102393d666d..a70281dcfe4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java
@@ -20,7 +20,6 @@ import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
 import org.apache.iotdb.commons.partition.DataPartition;
 import org.apache.iotdb.commons.partition.DataPartitionQueryParam;
-import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
@@ -34,6 +33,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.Predic
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.DeviceEntry;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode;
 import org.apache.iotdb.db.relational.sql.tree.Expression;
@@ -101,12 +101,8 @@ public class IndexScan implements RelationalPlanOptimizer {
       Expression indexExpression = context.getPredicate();
       if (indexExpression != null) {
         Set<String> idOrAttributeColumnNames =
-            node.getAssignments().entrySet().stream()
-                .filter(
-                    e ->
-                        
TsTableColumnCategory.ID.equals(e.getValue().getColumnCategory())
-                            || 
ATTRIBUTE.equals(e.getValue().getColumnCategory()))
-                .map(e -> e.getKey().getName())
+            node.getIdAndAttributeIndexMap().keySet().stream()
+                .map(Symbol::getName)
                 .collect(Collectors.toSet());
         if (indexExpression instanceof LogicalExpression) {
           for (Expression subExpression : ((LogicalExpression) 
indexExpression).getTerms()) {
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
index 94a98b19f90..c16c89a10d1 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
@@ -976,9 +976,9 @@ public class OperatorMemoryTest {
     try {
       MeasurementPath measurementPath = new MeasurementPath("root.sg.d1.s1", 
TSDataType.TEXT);
       TypeProvider typeProvider = new TypeProvider();
-      typeProvider.setType("count(root.sg.d1.s1)", TSDataType.INT64);
-      typeProvider.setType("min_time(root.sg.d1.s1)", TSDataType.INT64);
-      typeProvider.setType("first_value(root.sg.d1.s1)", TSDataType.TEXT);
+      typeProvider.setTreeModelType("count(root.sg.d1.s1)", TSDataType.INT64);
+      typeProvider.setTreeModelType("min_time(root.sg.d1.s1)", 
TSDataType.INT64);
+      typeProvider.setTreeModelType("first_value(root.sg.d1.s1)", 
TSDataType.TEXT);
 
       // case1: without group by, step is SINGLE
       List<AggregationDescriptor> aggregationDescriptors1 =
@@ -1235,8 +1235,8 @@ public class OperatorMemoryTest {
 
     MeasurementPath measurementPath = new MeasurementPath("root.sg.d1.s1", 
TSDataType.TEXT);
     TypeProvider typeProvider = new TypeProvider();
-    typeProvider.setType("count(root.sg.d1.s1)", TSDataType.INT64);
-    typeProvider.setType("first_value(root.sg.d1.s1)", TSDataType.TEXT);
+    typeProvider.setTreeModelType("count(root.sg.d1.s1)", TSDataType.INT64);
+    typeProvider.setTreeModelType("first_value(root.sg.d1.s1)", 
TSDataType.TEXT);
 
     List<AggregationDescriptor> aggregationDescriptors =
         Arrays.asList(
@@ -1308,8 +1308,8 @@ public class OperatorMemoryTest {
 
     MeasurementPath measurementPath = new MeasurementPath("root.sg.d1.s1", 
TSDataType.TEXT);
     TypeProvider typeProvider = new TypeProvider();
-    typeProvider.setType("count(root.sg.d1.s1)", TSDataType.INT64);
-    typeProvider.setType("first_value(root.sg.d1.s1)", TSDataType.TEXT);
+    typeProvider.setTreeModelType("count(root.sg.d1.s1)", TSDataType.INT64);
+    typeProvider.setTreeModelType("first_value(root.sg.d1.s1)", 
TSDataType.TEXT);
 
     List<AggregationDescriptor> aggregationDescriptors =
         Arrays.asList(
@@ -1388,8 +1388,8 @@ public class OperatorMemoryTest {
 
     MeasurementPath measurementPath = new MeasurementPath("root.sg.d1.s1", 
TSDataType.TEXT);
     TypeProvider typeProvider = new TypeProvider();
-    typeProvider.setType("count(root.sg.d1.s1)", TSDataType.INT64);
-    typeProvider.setType("first_value(root.sg.d1.s1)", TSDataType.TEXT);
+    typeProvider.setTreeModelType("count(root.sg.d1.s1)", TSDataType.INT64);
+    typeProvider.setTreeModelType("first_value(root.sg.d1.s1)", 
TSDataType.TEXT);
 
     List<AggregationDescriptor> aggregationDescriptors =
         Arrays.asList(
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/PipelineBuilderTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/PipelineBuilderTest.java
index 2161445954c..46065c623c9 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/PipelineBuilderTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/PipelineBuilderTest.java
@@ -783,10 +783,10 @@ public class PipelineBuilderTest {
   @Test
   public void testConsumeOneByOneChildrenPipelineBuilderDependency() throws 
IllegalPathException {
     TypeProvider typeProvider = new TypeProvider();
-    typeProvider.setType("root.sg.d0.s1", TSDataType.INT64);
-    typeProvider.setType("root.sg.d1.s1", TSDataType.INT64);
-    typeProvider.setType("count(root.sg.d0.s1)", TSDataType.INT64);
-    typeProvider.setType("count(root.sg.d1.s1)", TSDataType.INT64);
+    typeProvider.setTreeModelType("root.sg.d0.s1", TSDataType.INT64);
+    typeProvider.setTreeModelType("root.sg.d1.s1", TSDataType.INT64);
+    typeProvider.setTreeModelType("count(root.sg.d0.s1)", TSDataType.INT64);
+    typeProvider.setTreeModelType("count(root.sg.d1.s1)", TSDataType.INT64);
     DeviceViewNode deviceViewNode =
         new DeviceViewNode(new PlanNodeId("DeviceViewNode"), null, null, null);
     for (int i = 0; i < 2; i++) {
@@ -1071,7 +1071,7 @@ public class PipelineBuilderTest {
           new SeriesScanNode(
               new PlanNodeId(String.format("SeriesScanNode%d", i)),
               new MeasurementPath(String.format("root.sg.d%d.s1", i), 
TSDataType.INT32));
-      typeProvider.setType(seriesScanNode.getSeriesPath().toString(), 
TSDataType.INT32);
+      typeProvider.setTreeModelType(seriesScanNode.getSeriesPath().toString(), 
TSDataType.INT32);
       fullOuterTimeJoinNode.addChild(seriesScanNode);
     }
     return fullOuterTimeJoinNode;
@@ -1095,7 +1095,7 @@ public class PipelineBuilderTest {
           new SeriesScanNode(
               new PlanNodeId(String.format("SeriesScanNode%d", i)),
               new MeasurementPath(String.format("root.sg.d%d.s1", i), 
TSDataType.INT32));
-      typeProvider.setType(seriesScanNode.getSeriesPath().toString(), 
TSDataType.INT32);
+      typeProvider.setTreeModelType(seriesScanNode.getSeriesPath().toString(), 
TSDataType.INT32);
       fullOuterTimeJoinNode.addChild(seriesScanNode);
     }
     return fullOuterTimeJoinNode;
@@ -1110,7 +1110,7 @@ public class PipelineBuilderTest {
           new SeriesScanNode(
               new PlanNodeId(String.format("SeriesScanNode%d", i)),
               new MeasurementPath(String.format("root.sg.d%d.s1", i), 
TSDataType.INT32));
-      typeProvider.setType(seriesScanNode.getSeriesPath().toString(), 
TSDataType.INT32);
+      typeProvider.setTreeModelType(seriesScanNode.getSeriesPath().toString(), 
TSDataType.INT32);
       leftOuterTimeJoinNode.addChild(seriesScanNode);
     }
     return leftOuterTimeJoinNode;
@@ -1159,11 +1159,11 @@ public class PipelineBuilderTest {
           new SeriesScanNode(
               new PlanNodeId(String.format("SeriesScanNode%d", i)),
               new MeasurementPath(String.format("root.sg.d%d.s1", i), 
TSDataType.INT32));
-      typeProvider.setType(seriesScanNode.getSeriesPath().toString(), 
TSDataType.INT32);
+      typeProvider.setTreeModelType(seriesScanNode.getSeriesPath().toString(), 
TSDataType.INT32);
       singleDeviceViewNode.addChild(seriesScanNode);
-      typeProvider.setType("Time", TSDataType.INT64);
-      typeProvider.setType("Device", TSDataType.TEXT);
-      typeProvider.setType("s1", TSDataType.INT32);
+      typeProvider.setTreeModelType("Time", TSDataType.INT64);
+      typeProvider.setTreeModelType("Device", TSDataType.TEXT);
+      typeProvider.setTreeModelType("s1", TSDataType.INT32);
       topKNode.addChild(singleDeviceViewNode);
     }
     return topKNode;

Reply via email to