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

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


The following commit(s) were added to refs/heads/RefactorEA by this push:
     new 1d4fd2662c7 create a new ExplainAnalyzeNode for relation model
1d4fd2662c7 is described below

commit 1d4fd2662c7848509855a732ea96b29595102d05
Author: YangCaiyin <[email protected]>
AuthorDate: Tue Nov 26 17:01:00 2024 +0800

    create a new ExplainAnalyzeNode for relation model
---
 .../plan/planner/TableOperatorGenerator.java       |  2 +-
 .../plan/planner/plan/node/ExplainAnalyzeNode.java | 10 ++--
 .../plan/planner/plan/node/PlanNodeType.java       |  4 ++
 .../plan/planner/plan/node/PlanVisitor.java        |  6 +++
 .../relational/planner/TableLogicalPlanner.java    |  8 ++-
 .../planner/distribute/AddExchangeNodes.java       |  2 +-
 .../distribute/TableDistributedPlanGenerator.java  | 15 +++---
 .../planner}/node/ExplainAnalyzeNode.java          | 61 +++++++++++++---------
 .../optimizations/UnaliasSymbolReferences.java     |  2 +-
 9 files changed, 64 insertions(+), 46 deletions(-)

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 27f512f558d..a2a9ff81470 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
@@ -82,7 +82,6 @@ import 
org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggr
 import 
org.apache.iotdb.db.queryengine.execution.operator.source.relational.aggregation.grouped.StreamingHashAggregationOperator;
 import 
org.apache.iotdb.db.queryengine.execution.relational.ColumnTransformerBuilder;
 import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.ExplainAnalyzeNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
@@ -110,6 +109,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTableScanNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.CollectNode;
+import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExplainAnalyzeNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.GapFillNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/ExplainAnalyzeNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/ExplainAnalyzeNode.java
index c9e9709eccc..e496b65f4b0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/ExplainAnalyzeNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/ExplainAnalyzeNode.java
@@ -21,7 +21,6 @@ package 
org.apache.iotdb.db.queryengine.plan.planner.plan.node;
 
 import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
-import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 
@@ -60,11 +59,6 @@ public class ExplainAnalyzeNode extends 
SingleChildProcessNode {
     return Collections.singletonList(ColumnHeaderConstant.EXPLAIN_ANALYZE);
   }
 
-  @Override
-  public List<Symbol> getOutputSymbols() {
-    return 
Collections.singletonList(Symbol.of(ColumnHeaderConstant.EXPLAIN_ANALYZE));
-  }
-
   @Override
   public PlanNode replaceChildren(List<PlanNode> newChildren) {
     return new ExplainAnalyzeNode(getPlanNodeId(), newChildren.get(0), 
verbose, queryId, timeout);
@@ -74,6 +68,8 @@ public class ExplainAnalyzeNode extends 
SingleChildProcessNode {
   protected void serializeAttributes(ByteBuffer byteBuffer) {
     PlanNodeType.EXPLAIN_ANALYZE.serialize(byteBuffer);
     ReadWriteIOUtils.write(verbose, byteBuffer);
+    ReadWriteIOUtils.write(queryId, byteBuffer);
+    ReadWriteIOUtils.write(timeout, byteBuffer);
   }
 
   @Override
@@ -87,8 +83,8 @@ public class ExplainAnalyzeNode extends 
SingleChildProcessNode {
   public static ExplainAnalyzeNode deserialize(ByteBuffer byteBuffer) {
     boolean verbose = ReadWriteIOUtils.readBool(byteBuffer);
     long queryId = ReadWriteIOUtils.readLong(byteBuffer);
-    PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
     long timeout = ReadWriteIOUtils.readLong(byteBuffer);
+    PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
     return new ExplainAnalyzeNode(planNodeId, null, verbose, queryId, timeout);
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
index 5e5f58bac78..40adfdb6118 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
@@ -276,6 +276,7 @@ public enum PlanNodeType {
   TABLE_AGGREGATION_NODE((short) 1015),
   TABLE_AGGREGATION_TABLE_SCAN_NODE((short) 1016),
   TABLE_GAP_FILL_NODE((short) 1017),
+  TABLE_EXPLAIN_ANALYZE_NODE((short) 1018),
 
   RELATIONAL_INSERT_TABLET((short) 2000),
   RELATIONAL_INSERT_ROW((short) 2001),
@@ -626,6 +627,9 @@ public enum PlanNodeType {
             .deserialize(buffer);
       case 1017:
         return GapFillNode.deserialize(buffer);
+      case 1018:
+        return 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExplainAnalyzeNode
+            .deserialize(buffer);
       case 2000:
         return RelationalInsertTabletNode.deserialize(buffer);
       case 2001:
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
index da63cdc393e..95644366979 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
@@ -666,6 +666,12 @@ public abstract class PlanVisitor<R, C> {
     return visitMultiChildProcess(node, context);
   }
 
+  public R visitExplainAnalyze(
+      
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExplainAnalyzeNode 
node,
+      C context) {
+    return visitSingleChildProcess(node, context);
+  }
+
   public R visitOutput(
       org.apache.iotdb.db.queryengine.plan.relational.planner.node.OutputNode 
node, C context) {
     return visitSingleChildProcess(node, context);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableLogicalPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableLogicalPlanner.java
index d69a8a18b75..f42aa40386b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableLogicalPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableLogicalPlanner.java
@@ -25,7 +25,6 @@ import 
org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
 import org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan;
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.ExplainAnalyzeNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.read.CountSchemaMergeNode;
@@ -34,6 +33,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.Field;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.RelationType;
 import 
org.apache.iotdb.db.queryengine.plan.relational.execution.querystats.PlanOptimizersStatsCollector;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
+import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExplainAnalyzeNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.LimitNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OffsetNode;
@@ -67,6 +67,7 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.read.common.type.LongType;
+import org.apache.tsfile.read.common.type.StringType;
 import org.apache.tsfile.read.common.type.TypeFactory;
 
 import java.util.ArrayList;
@@ -448,13 +449,16 @@ public class TableLogicalPlanner {
   private RelationPlan planExplainAnalyze(final ExplainAnalyze statement, 
final Analysis analysis) {
     RelationPlan originalQueryPlan =
         createRelationPlan(analysis, (Query) (statement.getStatement()));
+    Symbol symbol =
+        symbolAllocator.newSymbol(ColumnHeaderConstant.EXPLAIN_ANALYZE, 
StringType.getInstance());
     PlanNode newRoot =
         new ExplainAnalyzeNode(
             queryContext.getQueryId().genPlanNodeId(),
             originalQueryPlan.getRoot(),
             statement.isVerbose(),
             queryContext.getLocalQueryId(),
-            queryContext.getTimeOut());
+            queryContext.getTimeOut(),
+            symbol);
     return new RelationPlan(
         newRoot,
         originalQueryPlan.getScope(),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/AddExchangeNodes.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/AddExchangeNodes.java
index 7b7b4f3b7df..db10774616d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/AddExchangeNodes.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/AddExchangeNodes.java
@@ -23,12 +23,12 @@ import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.commons.partition.DataPartition;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import 
org.apache.iotdb.db.queryengine.plan.planner.distribution.NodeDistribution;
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.ExplainAnalyzeNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.read.TableDeviceSourceNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.ExchangeNode;
+import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExplainAnalyzeNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceFetchNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceQueryCountNode;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
index c730c82ad29..8a3bdedf8f7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
@@ -21,9 +21,7 @@ import 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
 import org.apache.iotdb.commons.utils.PathUtils;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.QueryId;
-import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
 import 
org.apache.iotdb.db.queryengine.plan.planner.distribution.NodeDistribution;
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.ExplainAnalyzeNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
@@ -38,6 +36,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.planner.SymbolAllocator;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTableScanNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.CollectNode;
+import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExplainAnalyzeNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FillNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.GapFillNode;
@@ -62,7 +61,6 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
 import com.google.common.collect.ImmutableSet;
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.file.metadata.IDeviceID;
-import org.apache.tsfile.read.common.type.StringType;
 import org.apache.tsfile.utils.Pair;
 
 import javax.annotation.Nonnull;
@@ -142,6 +140,11 @@ public class TableDistributedPlanGenerator
     return Collections.singletonList(newNode);
   }
 
+  @Override
+  public List<PlanNode> visitExplainAnalyze(ExplainAnalyzeNode node, 
PlanContext context) {
+    return genResult(node, context);
+  }
+
   @Override
   public List<PlanNode> visitOutput(OutputNode node, PlanContext context) {
     List<PlanNode> childrenNodes = node.getChild().accept(this, context);
@@ -159,12 +162,6 @@ public class TableDistributedPlanGenerator
     return Collections.singletonList(node);
   }
 
-  @Override
-  public List<PlanNode> visitExplainAnalyze(ExplainAnalyzeNode node, 
PlanContext context) {
-    symbolAllocator.newSymbol(ColumnHeaderConstant.EXPLAIN_ANALYZE, 
StringType.getInstance());
-    return visitPlan(node, context);
-  }
-
   @Override
   public List<PlanNode> visitFill(FillNode node, PlanContext context) {
     if (!(node instanceof ValueFillNode)) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/ExplainAnalyzeNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ExplainAnalyzeNode.java
similarity index 58%
copy from 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/ExplainAnalyzeNode.java
copy to 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ExplainAnalyzeNode.java
index c9e9709eccc..7842afec126 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/ExplainAnalyzeNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ExplainAnalyzeNode.java
@@ -1,25 +1,23 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * 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.
+ * 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;
+package org.apache.iotdb.db.queryengine.plan.relational.planner.node;
 
-import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 
@@ -36,18 +34,25 @@ public class ExplainAnalyzeNode extends 
SingleChildProcessNode {
 
   private final long queryId;
   private final long timeout;
+  private final Symbol outputSymbol;
 
   public ExplainAnalyzeNode(
-      PlanNodeId id, PlanNode child, boolean verbose, long queryId, long 
timeout) {
+      PlanNodeId id,
+      PlanNode child,
+      boolean verbose,
+      long queryId,
+      long timeout,
+      Symbol outputSymbol) {
     super(id, child);
     this.verbose = verbose;
-    this.queryId = queryId;
     this.timeout = timeout;
+    this.queryId = queryId;
+    this.outputSymbol = outputSymbol;
   }
 
   @Override
   public PlanNode clone() {
-    return new ExplainAnalyzeNode(getPlanNodeId(), child, verbose, queryId, 
timeout);
+    return new ExplainAnalyzeNode(getPlanNodeId(), child, verbose, queryId, 
timeout, outputSymbol);
   }
 
   @Override
@@ -57,39 +62,45 @@ public class ExplainAnalyzeNode extends 
SingleChildProcessNode {
 
   @Override
   public List<String> getOutputColumnNames() {
-    return Collections.singletonList(ColumnHeaderConstant.EXPLAIN_ANALYZE);
+    return null;
   }
 
   @Override
   public List<Symbol> getOutputSymbols() {
-    return 
Collections.singletonList(Symbol.of(ColumnHeaderConstant.EXPLAIN_ANALYZE));
+    return Collections.singletonList(outputSymbol);
   }
 
   @Override
   public PlanNode replaceChildren(List<PlanNode> newChildren) {
-    return new ExplainAnalyzeNode(getPlanNodeId(), newChildren.get(0), 
verbose, queryId, timeout);
+    return new 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExplainAnalyzeNode(
+        getPlanNodeId(), newChildren.get(0), verbose, queryId, timeout, 
outputSymbol);
   }
 
   @Override
   protected void serializeAttributes(ByteBuffer byteBuffer) {
-    PlanNodeType.EXPLAIN_ANALYZE.serialize(byteBuffer);
+    PlanNodeType.TABLE_EXPLAIN_ANALYZE_NODE.serialize(byteBuffer);
     ReadWriteIOUtils.write(verbose, byteBuffer);
+    ReadWriteIOUtils.write(queryId, byteBuffer);
+    ReadWriteIOUtils.write(timeout, byteBuffer);
+    Symbol.serialize(outputSymbol, byteBuffer);
   }
 
   @Override
   protected void serializeAttributes(DataOutputStream stream) throws 
IOException {
-    PlanNodeType.EXPLAIN_ANALYZE.serialize(stream);
+    PlanNodeType.TABLE_EXPLAIN_ANALYZE_NODE.serialize(stream);
     ReadWriteIOUtils.write(verbose, stream);
     ReadWriteIOUtils.write(queryId, stream);
     ReadWriteIOUtils.write(timeout, stream);
+    Symbol.serialize(outputSymbol, stream);
   }
 
   public static ExplainAnalyzeNode deserialize(ByteBuffer byteBuffer) {
     boolean verbose = ReadWriteIOUtils.readBool(byteBuffer);
     long queryId = ReadWriteIOUtils.readLong(byteBuffer);
-    PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
     long timeout = ReadWriteIOUtils.readLong(byteBuffer);
-    return new ExplainAnalyzeNode(planNodeId, null, verbose, queryId, timeout);
+    Symbol outputSymbol = Symbol.deserialize(byteBuffer);
+    PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
+    return new ExplainAnalyzeNode(planNodeId, null, verbose, queryId, timeout, 
outputSymbol);
   }
 
   public boolean isVerbose() {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/UnaliasSymbolReferences.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/UnaliasSymbolReferences.java
index a325f9a974f..b79f9465319 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/UnaliasSymbolReferences.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/UnaliasSymbolReferences.java
@@ -13,7 +13,6 @@
  */
 package org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations;
 
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.ExplainAnalyzeNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
@@ -25,6 +24,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.SymbolAllocator;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.ir.DeterminismEvaluator;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationNode;
+import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExplainAnalyzeNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.GapFillNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode;

Reply via email to