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

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


The following commit(s) were added to refs/heads/master by this push:
     new 7e17e0d3f7 [fix](Nereids) select outfile column order is wrong (#24595)
7e17e0d3f7 is described below

commit 7e17e0d3f76982a86a7a1a6f085aec80d0c6940b
Author: morrySnow <101034200+morrys...@users.noreply.github.com>
AuthorDate: Wed Sep 20 09:27:40 2023 +0800

    [fix](Nereids) select outfile column order is wrong (#24595)
---
 .../glue/translator/PhysicalPlanTranslator.java    |  2 +-
 .../LogicalFileSinkToPhysicalFileSink.java         |  1 +
 ...ogicalOlapTableSinkToPhysicalOlapTableSink.java |  3 +-
 .../trees/plans/logical/LogicalOlapTableSink.java  | 15 ++++++-
 .../PhysicalDeferMaterializeResultSink.java        | 12 +-----
 .../trees/plans/physical/PhysicalFileSink.java     | 50 ++++++++++++++--------
 .../plans/physical/PhysicalOlapTableSink.java      | 41 ++++++++++++------
 .../trees/plans/physical/PhysicalResultSink.java   | 15 +------
 .../nereids/trees/plans/physical/PhysicalSink.java | 17 ++++++++
 9 files changed, 97 insertions(+), 59 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index 045082befd..59f4318811 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -369,7 +369,7 @@ public class PhysicalPlanTranslator extends 
DefaultPlanVisitor<PlanFragment, Pla
         );
         if (olapTableSink.isPartialUpdate() || 
(olapTableSink.isFromNativeInsertStmt()
                 && 
ConnectContext.get().getSessionVariable().isEnableUniqueKeyPartialUpdate())) {
-            OlapTable olapTable = (OlapTable) olapTableSink.getTargetTable();
+            OlapTable olapTable = olapTableSink.getTargetTable();
             if (!olapTable.getEnableUniqueKeyMergeOnWrite()) {
                 throw new AnalysisException("Partial update is only allowed in"
                         + "unique table with merge-on-write enabled.");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileSinkToPhysicalFileSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileSinkToPhysicalFileSink.java
index 456822c8de..3406185322 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileSinkToPhysicalFileSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileSinkToPhysicalFileSink.java
@@ -34,6 +34,7 @@ public class LogicalFileSinkToPhysicalFileSink extends 
OneImplementationRuleFact
         return logicalFileSink().thenApply(ctx -> {
             LogicalFileSink<? extends Plan> sink = ctx.root;
             return new PhysicalFileSink<>(
+                    sink.getOutputExprs(),
                     sink.getFilePath(),
                     sink.getFormat(),
                     sink.getProperties(),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalOlapTableSinkToPhysicalOlapTableSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalOlapTableSinkToPhysicalOlapTableSink.java
index e8cfaa9f80..2c727ebb8b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalOlapTableSinkToPhysicalOlapTableSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalOlapTableSinkToPhysicalOlapTableSink.java
@@ -36,8 +36,9 @@ public class LogicalOlapTableSinkToPhysicalOlapTableSink 
extends OneImplementati
             return new PhysicalOlapTableSink<>(
                     sink.getDatabase(),
                     sink.getTargetTable(),
-                    sink.getPartitionIds(),
                     sink.getCols(),
+                    sink.getPartitionIds(),
+                    sink.getOutputExprs(),
                     
ctx.connectContext.getSessionVariable().isEnableSingleReplicaInsert(),
                     sink.isPartialUpdate(),
                     sink.isFromNativeInsertStmt(),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapTableSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapTableSink.java
index 3366dbd7fd..d7d890dda6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapTableSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapTableSink.java
@@ -50,7 +50,7 @@ public class LogicalOlapTableSink<CHILD_TYPE extends Plan> 
extends LogicalSink<C
 
     public LogicalOlapTableSink(Database database, OlapTable targetTable, 
List<Column> cols, List<Long> partitionIds,
             List<NamedExpression> outputExprs, boolean isPartialUpdate, 
boolean isFromNativeInsertStmt,
-                    CHILD_TYPE child) {
+            CHILD_TYPE child) {
         this(database, targetTable, cols, partitionIds, outputExprs, 
isPartialUpdate, isFromNativeInsertStmt,
                 Optional.empty(), Optional.empty(), child);
     }
@@ -134,6 +134,19 @@ public class LogicalOlapTableSink<CHILD_TYPE extends Plan> 
extends LogicalSink<C
                 isPartialUpdate, isFromNativeInsertStmt);
     }
 
+    @Override
+    public String toString() {
+        return Utils.toSqlString("LogicalOlapTableSink[" + id.asInt() + "]",
+                "outputExprs", outputExprs,
+                "database", database,
+                "targetTable", targetTable,
+                "cols", cols,
+                "partitionIds", partitionIds,
+                "isPartialUpdate", isPartialUpdate,
+                "isFromNativeInsertStmt", isFromNativeInsertStmt
+        );
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalOlapTableSink(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDeferMaterializeResultSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDeferMaterializeResultSink.java
index 955c441157..4bb7a57964 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDeferMaterializeResultSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDeferMaterializeResultSink.java
@@ -22,8 +22,6 @@ import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.PhysicalProperties;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.NamedExpression;
-import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.algebra.Sink;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
@@ -61,7 +59,8 @@ public class PhysicalDeferMaterializeResultSink<CHILD_TYPE 
extends Plan>
             Optional<GroupExpression> groupExpression, LogicalProperties 
logicalProperties,
             @Nullable PhysicalProperties physicalProperties, Statistics 
statistics,
             CHILD_TYPE child) {
-        super(physicalResultSink.getType(), groupExpression, 
logicalProperties, physicalProperties, statistics, child);
+        super(physicalResultSink.getType(), physicalResultSink.outputExprs,
+                groupExpression, logicalProperties, physicalProperties, 
statistics, child);
         this.physicalResultSink = physicalResultSink;
         this.olapTable = olapTable;
         this.selectedIndexId = selectedIndexId;
@@ -122,13 +121,6 @@ public class PhysicalDeferMaterializeResultSink<CHILD_TYPE 
extends Plan>
                 groupExpression, getLogicalProperties(), physicalProperties, 
statistics, child());
     }
 
-    @Override
-    public List<Slot> computeOutput() {
-        return physicalResultSink.getOutputExprs().stream()
-                .map(NamedExpression::toSlot)
-                .collect(ImmutableList.toImmutableList());
-    }
-
     @Override
     public PhysicalDeferMaterializeResultSink<CHILD_TYPE> 
resetLogicalProperties() {
         return new PhysicalDeferMaterializeResultSink<>(physicalResultSink, 
olapTable, selectedIndexId,
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
index 56ff9aff08..bc18447118 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
@@ -21,11 +21,12 @@ import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.PhysicalProperties;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Sink;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 import org.apache.doris.statistics.Statistics;
 
 import com.google.common.base.Preconditions;
@@ -45,21 +46,26 @@ public class PhysicalFileSink<CHILD_TYPE extends Plan> 
extends PhysicalSink<CHIL
     private final String format;
     private final Map<String, String> properties;
 
-    public PhysicalFileSink(String filePath, String format, Map<String, 
String> properties,
+    public PhysicalFileSink(List<NamedExpression> outputExprs, String 
filePath, String format,
+            Map<String, String> properties,
             LogicalProperties logicalProperties, CHILD_TYPE child) {
-        this(filePath, format, properties, Optional.empty(), 
logicalProperties, child);
+        this(outputExprs, filePath, format, properties, Optional.empty(), 
logicalProperties, child);
     }
 
-    public PhysicalFileSink(String filePath, String format, Map<String, 
String> properties,
+    public PhysicalFileSink(List<NamedExpression> outputExprs, String 
filePath, String format,
+            Map<String, String> properties,
             Optional<GroupExpression> groupExpression, LogicalProperties 
logicalProperties,
             CHILD_TYPE child) {
-        this(filePath, format, properties, groupExpression, logicalProperties, 
PhysicalProperties.GATHER, null, child);
+        this(outputExprs, filePath, format, properties,
+                groupExpression, logicalProperties, PhysicalProperties.GATHER, 
null, child);
     }
 
-    public PhysicalFileSink(String filePath, String format, Map<String, 
String> properties,
+    public PhysicalFileSink(List<NamedExpression> outputExprs, String 
filePath, String format,
+            Map<String, String> properties,
             Optional<GroupExpression> groupExpression, LogicalProperties 
logicalProperties,
             PhysicalProperties physicalProperties, Statistics statistics, 
CHILD_TYPE child) {
-        super(PlanType.PHYSICAL_FILE_SINK, groupExpression, logicalProperties, 
physicalProperties, statistics, child);
+        super(PlanType.PHYSICAL_FILE_SINK, outputExprs,
+                groupExpression, logicalProperties, physicalProperties, 
statistics, child);
         this.filePath = filePath;
         this.format = format;
         this.properties = properties;
@@ -80,7 +86,8 @@ public class PhysicalFileSink<CHILD_TYPE extends Plan> 
extends PhysicalSink<CHIL
     @Override
     public Plan withChildren(List<Plan> children) {
         Preconditions.checkArgument(children.size() == 1, "PhysicalFileSink 
only accepts one child");
-        return new PhysicalFileSink<>(filePath, format, properties, 
getLogicalProperties(), children.get(0));
+        return new PhysicalFileSink<>(outputExprs, filePath, format, 
properties,
+                getLogicalProperties(), children.get(0));
     }
 
     @Override
@@ -112,32 +119,37 @@ public class PhysicalFileSink<CHILD_TYPE extends Plan> 
extends PhysicalSink<CHIL
         return Objects.hash(filePath, format, properties);
     }
 
+    @Override
+    public String toString() {
+        return Utils.toSqlString("PhysicalFileSink[" + id.asInt() + "]",
+                "outputExprs", outputExprs,
+                "filePath", filePath,
+                "format", format,
+                "properties", properties);
+    }
+
     @Override
     public Plan withGroupExpression(Optional<GroupExpression> groupExpression) 
{
-        return new PhysicalFileSink<>(filePath, format, properties, 
groupExpression, getLogicalProperties(), child());
+        return new PhysicalFileSink<>(outputExprs, filePath, format, 
properties,
+                groupExpression, getLogicalProperties(), child());
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
-        return new PhysicalFileSink<>(filePath, format, properties, 
groupExpression, logicalProperties.get(),
-                children.get(0));
+        return new PhysicalFileSink<>(outputExprs, filePath, format, 
properties,
+                groupExpression, logicalProperties.get(), children.get(0));
     }
 
     @Override
     public PhysicalPlan withPhysicalPropertiesAndStats(PhysicalProperties 
physicalProperties, Statistics statistics) {
-        return new PhysicalFileSink<>(filePath, format, properties, 
groupExpression, getLogicalProperties(),
-                physicalProperties, statistics, child());
-    }
-
-    @Override
-    public List<Slot> computeOutput() {
-        return child().getOutput();
+        return new PhysicalFileSink<>(outputExprs, filePath, format, 
properties, groupExpression,
+                getLogicalProperties(), physicalProperties, statistics, 
child());
     }
 
     @Override
     public PhysicalFileSink<CHILD_TYPE> resetLogicalProperties() {
-        return new PhysicalFileSink<>(filePath, format, properties, 
groupExpression, null,
+        return new PhysicalFileSink<>(outputExprs, filePath, format, 
properties, groupExpression, null,
                 physicalProperties, statistics, child());
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapTableSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapTableSink.java
index ed97e1e5c1..3c0a7177fc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapTableSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapTableSink.java
@@ -29,6 +29,7 @@ import 
org.apache.doris.nereids.properties.DistributionSpecHash.ShuffleType;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.PhysicalProperties;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
@@ -64,22 +65,25 @@ public class PhysicalOlapTableSink<CHILD_TYPE extends Plan> 
extends PhysicalSink
     /**
      * Constructor
      */
-    public PhysicalOlapTableSink(Database database, OlapTable targetTable, 
List<Long> partitionIds, List<Column> cols,
-            boolean singleReplicaLoad, boolean isPartialUpdate, boolean 
isFromNativeInsertStmt,
+    public PhysicalOlapTableSink(Database database, OlapTable targetTable, 
List<Column> cols, List<Long> partitionIds,
+            List<NamedExpression> outputExprs, boolean singleReplicaLoad,
+            boolean isPartialUpdate, boolean isFromNativeInsertStmt,
             Optional<GroupExpression> groupExpression, LogicalProperties 
logicalProperties, CHILD_TYPE child) {
-        this(database, targetTable, partitionIds, cols, singleReplicaLoad, 
isPartialUpdate, isFromNativeInsertStmt,
+        this(database, targetTable, cols, partitionIds, outputExprs,
+                singleReplicaLoad, isPartialUpdate, isFromNativeInsertStmt,
                 groupExpression, logicalProperties, PhysicalProperties.GATHER, 
null, child);
     }
 
     /**
      * Constructor
      */
-    public PhysicalOlapTableSink(Database database, OlapTable targetTable, 
List<Long> partitionIds, List<Column> cols,
-            boolean singleReplicaLoad, boolean isPartialUpdate, boolean 
isFromNativeInsertStmt,
+    public PhysicalOlapTableSink(Database database, OlapTable targetTable, 
List<Column> cols, List<Long> partitionIds,
+            List<NamedExpression> outputExprs, boolean singleReplicaLoad,
+            boolean isPartialUpdate, boolean isFromNativeInsertStmt,
             Optional<GroupExpression> groupExpression, LogicalProperties 
logicalProperties,
             PhysicalProperties physicalProperties, Statistics statistics, 
CHILD_TYPE child) {
-        super(PlanType.PHYSICAL_OLAP_TABLE_SINK, groupExpression, 
logicalProperties, physicalProperties,
-                statistics, child);
+        super(PlanType.PHYSICAL_OLAP_TABLE_SINK, outputExprs, groupExpression,
+                logicalProperties, physicalProperties, statistics, child);
         this.database = Objects.requireNonNull(database, "database != null in 
PhysicalOlapTableSink");
         this.targetTable = Objects.requireNonNull(targetTable, "targetTable != 
null in PhysicalOlapTableSink");
         this.cols = Utils.copyRequiredList(cols);
@@ -120,7 +124,7 @@ public class PhysicalOlapTableSink<CHILD_TYPE extends Plan> 
extends PhysicalSink
     @Override
     public Plan withChildren(List<Plan> children) {
         Preconditions.checkArgument(children.size() == 1, 
"PhysicalOlapTableSink only accepts one child");
-        return new PhysicalOlapTableSink<>(database, targetTable, 
partitionIds, cols,
+        return new PhysicalOlapTableSink<>(database, targetTable, cols, 
partitionIds, outputExprs,
                 singleReplicaLoad, isPartialUpdate, isFromNativeInsertStmt, 
groupExpression,
                         getLogicalProperties(), physicalProperties, 
statistics, children.get(0));
     }
@@ -150,8 +154,17 @@ public class PhysicalOlapTableSink<CHILD_TYPE extends 
Plan> extends PhysicalSink
     }
 
     @Override
-    public List<Slot> computeOutput() {
-        return child().getOutput();
+    public String toString() {
+        return Utils.toSqlString("LogicalOlapTableSink[" + id.asInt() + "]",
+                "outputExprs", outputExprs,
+                "database", database,
+                "targetTable", targetTable,
+                "cols", cols,
+                "partitionIds", partitionIds,
+                "singleReplicaLoad", singleReplicaLoad,
+                "isPartialUpdate", isPartialUpdate,
+                "isFromNativeInsertStmt", isFromNativeInsertStmt
+        );
     }
 
     @Override
@@ -179,20 +192,20 @@ public class PhysicalOlapTableSink<CHILD_TYPE extends 
Plan> extends PhysicalSink
 
     @Override
     public Plan withGroupExpression(Optional<GroupExpression> groupExpression) 
{
-        return new PhysicalOlapTableSink<>(database, targetTable, 
partitionIds, cols, singleReplicaLoad,
+        return new PhysicalOlapTableSink<>(database, targetTable, cols, 
partitionIds, outputExprs, singleReplicaLoad,
                 isPartialUpdate, isFromNativeInsertStmt, groupExpression, 
getLogicalProperties(), child());
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
-        return new PhysicalOlapTableSink<>(database, targetTable, 
partitionIds, cols, singleReplicaLoad,
+        return new PhysicalOlapTableSink<>(database, targetTable, cols, 
partitionIds, outputExprs, singleReplicaLoad,
                 isPartialUpdate, isFromNativeInsertStmt, groupExpression, 
logicalProperties.get(), children.get(0));
     }
 
     @Override
     public PhysicalPlan withPhysicalPropertiesAndStats(PhysicalProperties 
physicalProperties, Statistics statistics) {
-        return new PhysicalOlapTableSink<>(database, targetTable, 
partitionIds, cols, singleReplicaLoad,
+        return new PhysicalOlapTableSink<>(database, targetTable, cols, 
partitionIds, outputExprs, singleReplicaLoad,
                 isPartialUpdate, isFromNativeInsertStmt, groupExpression, 
getLogicalProperties(),
                         physicalProperties, statistics, child());
     }
@@ -233,7 +246,7 @@ public class PhysicalOlapTableSink<CHILD_TYPE extends Plan> 
extends PhysicalSink
 
     @Override
     public PhysicalOlapTableSink<Plan> resetLogicalProperties() {
-        return new PhysicalOlapTableSink<>(database, targetTable, 
partitionIds, cols, singleReplicaLoad,
+        return new PhysicalOlapTableSink<>(database, targetTable, cols, 
partitionIds, outputExprs, singleReplicaLoad,
                 isPartialUpdate, isFromNativeInsertStmt, groupExpression,
                         null, physicalProperties, statistics, child());
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalResultSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalResultSink.java
index 553b47d29b..eba99cdfb2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalResultSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalResultSink.java
@@ -22,7 +22,6 @@ import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.PhysicalProperties;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
-import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Sink;
@@ -31,7 +30,6 @@ import org.apache.doris.nereids.util.Utils;
 import org.apache.doris.statistics.Statistics;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.List;
@@ -43,8 +41,6 @@ import java.util.Optional;
  */
 public class PhysicalResultSink<CHILD_TYPE extends Plan> extends 
PhysicalSink<CHILD_TYPE> implements Sink {
 
-    private final List<NamedExpression> outputExprs;
-
     public PhysicalResultSink(List<NamedExpression> outputExprs, 
Optional<GroupExpression> groupExpression,
             LogicalProperties logicalProperties, CHILD_TYPE child) {
         this(outputExprs, groupExpression, logicalProperties, 
PhysicalProperties.GATHER, null, child);
@@ -53,8 +49,8 @@ public class PhysicalResultSink<CHILD_TYPE extends Plan> 
extends PhysicalSink<CH
     public PhysicalResultSink(List<NamedExpression> outputExprs, 
Optional<GroupExpression> groupExpression,
             LogicalProperties logicalProperties, @Nullable PhysicalProperties 
physicalProperties,
             Statistics statistics, CHILD_TYPE child) {
-        super(PlanType.PHYSICAL_RESULT_SINK, groupExpression, 
logicalProperties, physicalProperties, statistics, child);
-        this.outputExprs = outputExprs;
+        super(PlanType.PHYSICAL_RESULT_SINK, outputExprs, groupExpression,
+                logicalProperties, physicalProperties, statistics, child);
     }
 
     public List<NamedExpression> getOutputExprs() {
@@ -124,13 +120,6 @@ public class PhysicalResultSink<CHILD_TYPE extends Plan> 
extends PhysicalSink<CH
                 "outputExprs", outputExprs);
     }
 
-    @Override
-    public List<Slot> computeOutput() {
-        return outputExprs.stream()
-                .map(NamedExpression::toSlot)
-                .collect(ImmutableList.toImmutableList());
-    }
-
     @Override
     public PhysicalResultSink<CHILD_TYPE> resetLogicalProperties() {
         return new PhysicalResultSink<>(outputExprs, groupExpression,
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSink.java
index d9dd45d208..17cf97106e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSink.java
@@ -20,21 +20,38 @@ package org.apache.doris.nereids.trees.plans.physical;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.PhysicalProperties;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
+import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.statistics.Statistics;
 
+import com.google.common.collect.ImmutableList;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 /** abstract physical sink */
 public abstract class PhysicalSink<CHILD_TYPE extends Plan> extends 
PhysicalUnary<CHILD_TYPE> {
+
+    protected final List<NamedExpression> outputExprs;
+
     public PhysicalSink(PlanType type,
+            List<NamedExpression> outputExprs,
             Optional<GroupExpression> groupExpression,
             LogicalProperties logicalProperties,
             @Nullable PhysicalProperties physicalProperties,
             Statistics statistics, CHILD_TYPE child) {
         super(type, groupExpression, logicalProperties, physicalProperties, 
statistics, child);
+        this.outputExprs = 
ImmutableList.copyOf(Objects.requireNonNull(outputExprs, "outputExprs should 
not null"));
+    }
+
+    @Override
+    public List<Slot> computeOutput() {
+        return outputExprs.stream()
+                .map(NamedExpression::toSlot)
+                .collect(ImmutableList.toImmutableList());
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to