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