This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push: new 5904c99d23 [fix](nereids) recompute logical properties in plan post process (#22356) (#22435) 5904c99d23 is described below commit 5904c99d23bad921b008eb7722c19f43855d9465 Author: starocean999 <40539150+starocean...@users.noreply.github.com> AuthorDate: Mon Jul 31 23:22:58 2023 +0800 [fix](nereids) recompute logical properties in plan post process (#22356) (#22435) --- .../nereids/processor/post/PlanPostProcessors.java | 1 + .../post/RecomputeLogicalPropertiesProcessor.java} | 20 ++++----- .../LogicalExceptToPhysicalExcept.java | 1 + .../LogicalIntersectToPhysicalIntersect.java | 1 + .../LogicalUnionToPhysicalUnion.java | 1 + .../LogicalWindowToPhysicalWindow.java | 1 + .../doris/nereids/trees/plans/AbstractPlan.java | 12 ++++++ .../trees/plans/logical/AbstractLogicalPlan.java | 13 ------ .../trees/plans/physical/AbstractPhysicalJoin.java | 11 +++++ .../trees/plans/physical/AbstractPhysicalPlan.java | 7 +++- .../plans/physical/PhysicalAssertNumRows.java | 6 +++ .../trees/plans/physical/PhysicalCTEAnchor.java | 12 ++++++ .../trees/plans/physical/PhysicalCTEProducer.java | 11 +++++ .../trees/plans/physical/PhysicalDistribute.java | 12 ++++++ .../trees/plans/physical/PhysicalExcept.java | 30 ++++++++----- .../trees/plans/physical/PhysicalFileSink.java | 12 ++++++ .../trees/plans/physical/PhysicalFilter.java | 12 ++++++ .../trees/plans/physical/PhysicalGenerate.java | 15 +++++++ .../plans/physical/PhysicalHashAggregate.java | 16 +++++++ .../trees/plans/physical/PhysicalHashJoin.java | 6 +++ .../trees/plans/physical/PhysicalIntersect.java | 29 ++++++++----- .../trees/plans/physical/PhysicalLimit.java | 12 ++++++ .../plans/physical/PhysicalNestedLoopJoin.java | 7 ++++ .../plans/physical/PhysicalOlapTableSink.java | 6 +++ .../plans/physical/PhysicalPartitionTopN.java | 12 ++++++ .../nereids/trees/plans/physical/PhysicalPlan.java | 4 ++ .../trees/plans/physical/PhysicalProject.java | 14 +++++++ .../trees/plans/physical/PhysicalQuickSort.java | 12 ++++++ .../trees/plans/physical/PhysicalRepeat.java | 6 +++ .../trees/plans/physical/PhysicalSetOperation.java | 14 +++++++ .../nereids/trees/plans/physical/PhysicalTopN.java | 13 ++++++ .../trees/plans/physical/PhysicalUnion.java | 49 +++++++++++++--------- .../trees/plans/physical/PhysicalWindow.java | 37 +++++++++++++--- .../doris/nereids/trees/plans/PlanOutputTest.java | 38 ----------------- .../data/nereids_syntax_p0/join_order.out | 3 ++ .../suites/nereids_syntax_p0/join_order.groovy | 10 +++++ 36 files changed, 357 insertions(+), 109 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessors.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessors.java index c7fe4309e6..3b47fb4b5d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessors.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessors.java @@ -71,6 +71,7 @@ public class PlanPostProcessors { builder.add(new Validator()); builder.add(new TopNScanOpt()); builder.add(new TwoPhaseReadOpt()); + builder.add(new RecomputeLogicalPropertiesProcessor()); return builder.build(); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RecomputeLogicalPropertiesProcessor.java similarity index 64% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RecomputeLogicalPropertiesProcessor.java index 5076abee22..835d1425b7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RecomputeLogicalPropertiesProcessor.java @@ -15,19 +15,19 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.trees.plans.physical; +package org.apache.doris.nereids.processor.post; -import org.apache.doris.nereids.properties.PhysicalProperties; +import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.trees.plans.Plan; -import org.apache.doris.statistics.Statistics; +import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan; /** - * interface for all physical plan. + * merge consecutive projects */ -public interface PhysicalPlan extends Plan { - - PhysicalProperties getPhysicalProperties(); - - PhysicalPlan withPhysicalPropertiesAndStats(PhysicalProperties physicalProperties, - Statistics statistics); +public class RecomputeLogicalPropertiesProcessor extends PlanPostProcessor { + @Override + public Plan visit(Plan plan, CascadesContext ctx) { + PhysicalPlan physicalPlan = (PhysicalPlan) visitChildren(this, plan, ctx); + return physicalPlan.resetLogicalProperties(); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalExceptToPhysicalExcept.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalExceptToPhysicalExcept.java index be8a03a17c..c809390c20 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalExceptToPhysicalExcept.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalExceptToPhysicalExcept.java @@ -29,6 +29,7 @@ public class LogicalExceptToPhysicalExcept extends OneImplementationRuleFactory public Rule build() { return logicalExcept().then(except -> new PhysicalExcept(except.getQualifier(), + except.getOutputs(), except.getLogicalProperties(), except.children()) ).toRule(RuleType.LOGICAL_EXCEPT_TO_PHYSICAL_EXCEPT); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalIntersectToPhysicalIntersect.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalIntersectToPhysicalIntersect.java index e05ae9b310..7d29be2fd8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalIntersectToPhysicalIntersect.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalIntersectToPhysicalIntersect.java @@ -29,6 +29,7 @@ public class LogicalIntersectToPhysicalIntersect extends OneImplementationRuleFa public Rule build() { return logicalIntersect().then(intersect -> new PhysicalIntersect(intersect.getQualifier(), + intersect.getOutputs(), intersect.getLogicalProperties(), intersect.children()) ).toRule(RuleType.LOGICAL_INTERSECT_TO_PHYSICAL_INTERSECT); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalUnionToPhysicalUnion.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalUnionToPhysicalUnion.java index 1b9d8e00da..2bc2b64ecb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalUnionToPhysicalUnion.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalUnionToPhysicalUnion.java @@ -29,6 +29,7 @@ public class LogicalUnionToPhysicalUnion extends OneImplementationRuleFactory { public Rule build() { return logicalUnion().then(union -> new PhysicalUnion(union.getQualifier(), + union.getOutputs(), union.getConstantExprsList(), union.getLogicalProperties(), union.children()) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalWindowToPhysicalWindow.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalWindowToPhysicalWindow.java index 81acbce1ac..020fc6754d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalWindowToPhysicalWindow.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalWindowToPhysicalWindow.java @@ -161,6 +161,7 @@ public class LogicalWindowToPhysicalWindow extends OneImplementationRuleFactory PhysicalWindow<Plan> physicalWindow = new PhysicalWindow<>( windowFrameGroup, RequireProperties.followParent(), + tempLogicalWindow.getWindowExpressions(), tempLogicalWindow.getLogicalProperties(), root); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java index 6b97f615b1..cdea20c74a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java @@ -187,6 +187,18 @@ public abstract class AbstractPlan extends AbstractTreeNode<Plan> implements Pla return logicalPropertiesSupplier.get(); } + @Override + public LogicalProperties computeLogicalProperties() { + boolean hasUnboundChild = children.stream() + .map(Plan::getLogicalProperties) + .anyMatch(UnboundLogicalProperties.class::isInstance); + if (hasUnboundChild || hasUnboundExpression()) { + return UnboundLogicalProperties.INSTANCE; + } else { + return new LogicalProperties(this::computeOutput); + } + } + @Override public Optional<Object> getMutableState(String key) { return mutableState.get(key); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/AbstractLogicalPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/AbstractLogicalPlan.java index c5b2b4aeea..89ef68b561 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/AbstractLogicalPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/AbstractLogicalPlan.java @@ -19,7 +19,6 @@ package org.apache.doris.nereids.trees.plans.logical; import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.properties.LogicalProperties; -import org.apache.doris.nereids.properties.UnboundLogicalProperties; import org.apache.doris.nereids.trees.plans.AbstractPlan; import org.apache.doris.nereids.trees.plans.Explainable; import org.apache.doris.nereids.trees.plans.Plan; @@ -56,18 +55,6 @@ public abstract class AbstractLogicalPlan extends AbstractPlan implements Logica return hasUnboundExpressions.get(); } - @Override - public LogicalProperties computeLogicalProperties() { - boolean hasUnboundChild = children.stream() - .map(Plan::getLogicalProperties) - .anyMatch(UnboundLogicalProperties.class::isInstance); - if (hasUnboundChild || hasUnboundExpression()) { - return UnboundLogicalProperties.INSTANCE; - } else { - return new LogicalProperties(this::computeOutput); - } - } - @Override public Plan getExplainPlan(ConnectContext ctx) { return this; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalJoin.java index 84313a4535..f67123522c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalJoin.java @@ -22,12 +22,14 @@ 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.MarkJoinSlotReference; +import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.plans.JoinHint; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.algebra.Join; import org.apache.doris.nereids.util.ExpressionUtils; +import org.apache.doris.nereids.util.JoinUtils; import org.apache.doris.statistics.Statistics; import com.google.common.collect.ImmutableList; @@ -206,4 +208,13 @@ public abstract class AbstractPhysicalJoin< public List<RuntimeFilter> getRuntimeFilters() { return runtimeFilters; } + + @Override + public List<Slot> computeOutput() { + return ImmutableList.<Slot>builder() + .addAll(JoinUtils.getJoinOutput(joinType, left(), right())) + .addAll(isMarkJoin() + ? ImmutableList.of(markJoinSlotReference.get()) : ImmutableList.of()) + .build(); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalPlan.java index 14b989f414..53593eed64 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalPlan.java @@ -49,8 +49,11 @@ public abstract class AbstractPhysicalPlan extends AbstractPlan implements Physi public AbstractPhysicalPlan(PlanType type, Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, @Nullable PhysicalProperties physicalProperties, Statistics statistics, Plan... children) { - super(type, groupExpression, Optional.of(logicalProperties), statistics, children); - this.physicalProperties = physicalProperties == null ? PhysicalProperties.ANY : physicalProperties; + super(type, groupExpression, + logicalProperties == null ? Optional.empty() : Optional.of(logicalProperties), + statistics, children); + this.physicalProperties = + physicalProperties == null ? PhysicalProperties.ANY : physicalProperties; } public PhysicalProperties getPhysicalProperties() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java index cb1d175b39..88fb5394cb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java @@ -129,4 +129,10 @@ public class PhysicalAssertNumRows<CHILD_TYPE extends Plan> extends PhysicalUnar return new PhysicalAssertNumRows<>(assertNumRowsElement, groupExpression, getLogicalProperties(), physicalProperties, statistics, child()); } + + @Override + public PhysicalAssertNumRows<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalAssertNumRows<>(assertNumRowsElement, groupExpression, + null, physicalProperties, statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCTEAnchor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCTEAnchor.java index d85a73d1b2..7c6ee90585 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCTEAnchor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCTEAnchor.java @@ -22,6 +22,7 @@ import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.properties.PhysicalProperties; import org.apache.doris.nereids.trees.expressions.CTEId; import org.apache.doris.nereids.trees.expressions.Expression; +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.visitor.PlanVisitor; @@ -135,4 +136,15 @@ public class PhysicalCTEAnchor< public String shapeInfo() { return Utils.toSqlString("CteAnchor[cteId=", cteId, "]"); } + + @Override + public List<Slot> computeOutput() { + return right().getOutput(); + } + + @Override + public PhysicalCTEAnchor<Plan, Plan> resetLogicalProperties() { + return new PhysicalCTEAnchor<>(cteId, groupExpression, null, physicalProperties, + statistics, child(0), child(1)); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCTEProducer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCTEProducer.java index bf148b17ac..4a7879246f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCTEProducer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCTEProducer.java @@ -133,4 +133,15 @@ public class PhysicalCTEProducer<CHILD_TYPE extends Plan> extends PhysicalUnary< public String shapeInfo() { return Utils.toSqlString("CteProducer[cteId=", cteId, "]"); } + + @Override + public List<Slot> computeOutput() { + return child().getOutput(); + } + + @Override + public PhysicalCTEProducer<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalCTEProducer<>(cteId, projects, groupExpression, null, physicalProperties, + statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribute.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribute.java index 6fc7f0bd44..a0dd2401c0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribute.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribute.java @@ -22,6 +22,7 @@ import org.apache.doris.nereids.properties.DistributionSpec; 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.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; @@ -118,4 +119,15 @@ public class PhysicalDistribute<CHILD_TYPE extends Plan> extends PhysicalUnary<C return new PhysicalDistribute<>(distributionSpec, groupExpression, getLogicalProperties(), physicalProperties, statistics, child()); } + + @Override + public List<Slot> computeOutput() { + return child().getOutput(); + } + + @Override + public PhysicalDistribute<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalDistribute<>(distributionSpec, groupExpression, + null, physicalProperties, statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalExcept.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalExcept.java index 762d0d6d03..538968f813 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalExcept.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalExcept.java @@ -20,6 +20,7 @@ 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.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; @@ -35,23 +36,26 @@ import java.util.Optional; public class PhysicalExcept extends PhysicalSetOperation { public PhysicalExcept(Qualifier qualifier, - LogicalProperties logicalProperties, - List<Plan> inputs) { - super(PlanType.PHYSICAL_EXCEPT, qualifier, logicalProperties, inputs); + List<NamedExpression> outputs, + LogicalProperties logicalProperties, + List<Plan> inputs) { + super(PlanType.PHYSICAL_EXCEPT, qualifier, outputs, logicalProperties, inputs); } public PhysicalExcept(Qualifier qualifier, + List<NamedExpression> outputs, Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, List<Plan> inputs) { - super(PlanType.PHYSICAL_EXCEPT, qualifier, groupExpression, logicalProperties, inputs); + super(PlanType.PHYSICAL_EXCEPT, qualifier, outputs, groupExpression, logicalProperties, inputs); } - public PhysicalExcept(Qualifier qualifier, Optional<GroupExpression> groupExpression, + public PhysicalExcept(Qualifier qualifier, List<NamedExpression> outputs, + Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, PhysicalProperties physicalProperties, Statistics statistics, List<Plan> inputs) { - super(PlanType.PHYSICAL_EXCEPT, qualifier, + super(PlanType.PHYSICAL_EXCEPT, qualifier, outputs, groupExpression, logicalProperties, physicalProperties, statistics, inputs); } @@ -69,25 +73,31 @@ public class PhysicalExcept extends PhysicalSetOperation { @Override public PhysicalExcept withChildren(List<Plan> children) { - return new PhysicalExcept(qualifier, getLogicalProperties(), children); + return new PhysicalExcept(qualifier, outputs, getLogicalProperties(), children); } @Override public PhysicalExcept withGroupExpression( Optional<GroupExpression> groupExpression) { - return new PhysicalExcept(qualifier, groupExpression, getLogicalProperties(), children); + return new PhysicalExcept(qualifier, outputs, groupExpression, getLogicalProperties(), children); } @Override public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties, List<Plan> children) { - return new PhysicalExcept(qualifier, groupExpression, logicalProperties.get(), children); + return new PhysicalExcept(qualifier, outputs, groupExpression, logicalProperties.get(), children); } @Override public PhysicalExcept withPhysicalPropertiesAndStats( PhysicalProperties physicalProperties, Statistics statistics) { - return new PhysicalExcept(qualifier, Optional.empty(), + return new PhysicalExcept(qualifier, outputs, Optional.empty(), + getLogicalProperties(), physicalProperties, statistics, children); + } + + @Override + public PhysicalExcept resetLogicalProperties() { + return new PhysicalExcept(qualifier, outputs, Optional.empty(), getLogicalProperties(), physicalProperties, statistics, children); } } 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 142d07c69c..b2849efcf4 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,6 +21,7 @@ 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.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; @@ -129,4 +130,15 @@ public class PhysicalFileSink<CHILD_TYPE extends Plan> extends PhysicalUnary<CHI return new PhysicalFileSink<>(filePath, format, properties, groupExpression, getLogicalProperties(), physicalProperties, statistics, child()); } + + @Override + public List<Slot> computeOutput() { + return child().getOutput(); + } + + @Override + public PhysicalFileSink<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalFileSink<>(filePath, format, properties, groupExpression, null, + physicalProperties, statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java index c46adff343..9d14eed149 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java @@ -21,6 +21,7 @@ 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.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.algebra.Filter; @@ -140,4 +141,15 @@ public class PhysicalFilter<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD builder.append(")"); return builder.toString(); } + + @Override + public List<Slot> computeOutput() { + return child().getOutput(); + } + + @Override + public PhysicalFilter<Plan> resetLogicalProperties() { + return new PhysicalFilter<>(conjuncts, groupExpression, null, physicalProperties, + statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalGenerate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalGenerate.java index 2e7d09d3f9..d75402fb21 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalGenerate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalGenerate.java @@ -152,4 +152,19 @@ public class PhysicalGenerate<CHILD_TYPE extends Plan> extends PhysicalUnary<CHI Optional.empty(), getLogicalProperties(), physicalProperties, statistics, child()); } + + @Override + public List<Slot> computeOutput() { + return ImmutableList.<Slot>builder() + .addAll(child().getOutput()) + .addAll(generatorOutput) + .build(); + } + + @Override + public PhysicalGenerate<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalGenerate<>(generators, generatorOutput, + Optional.empty(), null, physicalProperties, + statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashAggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashAggregate.java index 01c9065ab3..620dd88716 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashAggregate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashAggregate.java @@ -24,6 +24,7 @@ import org.apache.doris.nereids.properties.RequireProperties; import org.apache.doris.nereids.properties.RequirePropertiesSupplier; 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.expressions.functions.agg.AggregateParam; import org.apache.doris.nereids.trees.plans.AggMode; import org.apache.doris.nereids.trees.plans.AggPhase; @@ -283,4 +284,19 @@ public class PhysicalHashAggregate<CHILD_TYPE extends Plan> extends PhysicalUnar builder.append(getAggPhase()).append("]"); return builder.toString(); } + + @Override + public List<Slot> computeOutput() { + return outputExpressions.stream() + .map(NamedExpression::toSlot) + .collect(ImmutableList.toImmutableList()); + } + + @Override + public PhysicalHashAggregate<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalHashAggregate<>(groupByExpressions, outputExpressions, partitionExpressions, + aggregateParam, maybeUsingStream, groupExpression, null, + requireProperties, physicalProperties, statistics, + child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java index c8ed9ec8ed..84dc09b2a3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java @@ -228,4 +228,10 @@ public class PhysicalHashJoin< }); return builder.toString(); } + + @Override + public PhysicalHashJoin<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> resetLogicalProperties() { + return new PhysicalHashJoin<>(joinType, hashJoinConjuncts, otherJoinConjuncts, hint, markJoinSlotReference, + groupExpression, null, physicalProperties, statistics, left(), right()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalIntersect.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalIntersect.java index 3df464e33f..cea2367c28 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalIntersect.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalIntersect.java @@ -20,6 +20,7 @@ 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.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; @@ -35,23 +36,25 @@ import java.util.Optional; public class PhysicalIntersect extends PhysicalSetOperation { public PhysicalIntersect(Qualifier qualifier, - LogicalProperties logicalProperties, - List<Plan> inputs) { - super(PlanType.PHYSICAL_INTERSECT, qualifier, logicalProperties, inputs); + List<NamedExpression> outputs, + LogicalProperties logicalProperties, + List<Plan> inputs) { + super(PlanType.PHYSICAL_INTERSECT, qualifier, outputs, logicalProperties, inputs); } public PhysicalIntersect(Qualifier qualifier, + List<NamedExpression> outputs, Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, List<Plan> inputs) { - super(PlanType.PHYSICAL_INTERSECT, qualifier, groupExpression, logicalProperties, inputs); + super(PlanType.PHYSICAL_INTERSECT, qualifier, outputs, groupExpression, logicalProperties, inputs); } - public PhysicalIntersect(Qualifier qualifier, + public PhysicalIntersect(Qualifier qualifier, List<NamedExpression> outputs, Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, PhysicalProperties physicalProperties, Statistics statistics, List<Plan> inputs) { - super(PlanType.PHYSICAL_INTERSECT, qualifier, + super(PlanType.PHYSICAL_INTERSECT, qualifier, outputs, groupExpression, logicalProperties, physicalProperties, statistics, inputs); } @@ -69,25 +72,31 @@ public class PhysicalIntersect extends PhysicalSetOperation { @Override public PhysicalIntersect withChildren(List<Plan> children) { - return new PhysicalIntersect(qualifier, getLogicalProperties(), children); + return new PhysicalIntersect(qualifier, outputs, getLogicalProperties(), children); } @Override public PhysicalIntersect withGroupExpression( Optional<GroupExpression> groupExpression) { - return new PhysicalIntersect(qualifier, groupExpression, getLogicalProperties(), children); + return new PhysicalIntersect(qualifier, outputs, groupExpression, getLogicalProperties(), children); } @Override public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties, List<Plan> children) { - return new PhysicalIntersect(qualifier, groupExpression, logicalProperties.get(), children); + return new PhysicalIntersect(qualifier, outputs, groupExpression, logicalProperties.get(), children); } @Override public PhysicalIntersect withPhysicalPropertiesAndStats( PhysicalProperties physicalProperties, Statistics statistics) { - return new PhysicalIntersect(qualifier, + return new PhysicalIntersect(qualifier, outputs, Optional.empty(), getLogicalProperties(), physicalProperties, statistics, children); } + + @Override + public PhysicalIntersect resetLogicalProperties() { + return new PhysicalIntersect(qualifier, outputs, + Optional.empty(), null, physicalProperties, statistics, children); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java index dd4e6388cf..e218d3b235 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java @@ -21,6 +21,7 @@ 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.plans.LimitPhase; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; @@ -162,4 +163,15 @@ public class PhysicalLimit<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD_ "stats", statistics ); } + + @Override + public List<Slot> computeOutput() { + return child().getOutput(); + } + + @Override + public PhysicalLimit<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalLimit<>(limit, offset, phase, groupExpression, null, physicalProperties, + statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalNestedLoopJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalNestedLoopJoin.java index 5ba9f60a86..3b92830b6a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalNestedLoopJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalNestedLoopJoin.java @@ -176,4 +176,11 @@ public class PhysicalNestedLoopJoin< otherJoinConjuncts.forEach(expr -> builder.append(expr.shapeInfo())); return builder.toString(); } + + @Override + public PhysicalNestedLoopJoin<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> resetLogicalProperties() { + return new PhysicalNestedLoopJoin<>(joinType, + hashJoinConjuncts, otherJoinConjuncts, markJoinSlotReference, groupExpression, + null, physicalProperties, statistics, left(), right()); + } } 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 c5dfb2d154..93bf78719d 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 @@ -227,4 +227,10 @@ public class PhysicalOlapTableSink<CHILD_TYPE extends Plan> extends PhysicalUnar return PhysicalProperties.GATHER; } } + + @Override + public PhysicalOlapTableSink<Plan> resetLogicalProperties() { + return new PhysicalOlapTableSink<>(database, targetTable, partitionIds, cols, singleReplicaLoad, + isPartialUpdate, groupExpression, null, physicalProperties, statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPartitionTopN.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPartitionTopN.java index a64528ea9f..888ca05544 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPartitionTopN.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPartitionTopN.java @@ -22,6 +22,7 @@ import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.properties.OrderKey; 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.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.WindowFuncType; @@ -185,4 +186,15 @@ public class PhysicalPartitionTopN<CHILD_TYPE extends Plan> extends PhysicalUnar "partitionLimit", partitionLimit ); } + + @Override + public List<Slot> computeOutput() { + return child().getOutput(); + } + + @Override + public PhysicalPartitionTopN<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalPartitionTopN<>(function, partitionKeys, orderKeys, hasGlobalLimit, partitionLimit, + groupExpression, null, physicalProperties, statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java index 5076abee22..eae95743c8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java @@ -30,4 +30,8 @@ public interface PhysicalPlan extends Plan { PhysicalPlan withPhysicalPropertiesAndStats(PhysicalProperties physicalProperties, Statistics statistics); + + default PhysicalPlan resetLogicalProperties() { + return this; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java index 6c36045df4..d0434f3ce8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java @@ -22,6 +22,7 @@ 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.Project; @@ -146,4 +147,17 @@ public class PhysicalProject<CHILD_TYPE extends Plan> extends PhysicalUnary<CHIL child ); } + + @Override + public List<Slot> computeOutput() { + return projects.stream() + .map(NamedExpression::toSlot) + .collect(ImmutableList.toImmutableList()); + } + + @Override + public PhysicalProject<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalProject<>(projects, groupExpression, null, physicalProperties, + statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalQuickSort.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalQuickSort.java index c2ca598ab6..58875ccdc0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalQuickSort.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalQuickSort.java @@ -21,6 +21,7 @@ import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.properties.OrderKey; import org.apache.doris.nereids.properties.PhysicalProperties; +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.SortPhase; @@ -105,4 +106,15 @@ public class PhysicalQuickSort<CHILD_TYPE extends Plan> extends AbstractPhysical "phase", phase.toString() ); } + + @Override + public List<Slot> computeOutput() { + return child().getOutput(); + } + + @Override + public PhysicalQuickSort<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalQuickSort<>(orderKeys, phase, groupExpression, null, physicalProperties, + statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java index 258b99e128..e9b9c4a02e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java @@ -177,4 +177,10 @@ public class PhysicalRepeat<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD return new PhysicalRepeat<>(groupingSets, newOutput, Optional.empty(), getLogicalProperties(), physicalProperties, statistics, child()); } + + @Override + public PhysicalRepeat<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalRepeat<>(groupingSets, outputExpressions, groupExpression, + null, physicalProperties, statistics, child()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSetOperation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSetOperation.java index 640a5c1115..e97cd2dc8b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSetOperation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSetOperation.java @@ -43,30 +43,38 @@ public abstract class PhysicalSetOperation extends AbstractPhysicalPlan implemen protected final Qualifier qualifier; + protected final List<NamedExpression> outputs; + public PhysicalSetOperation(PlanType planType, Qualifier qualifier, + List<NamedExpression> outputs, LogicalProperties logicalProperties, List<Plan> inputs) { super(planType, Optional.empty(), logicalProperties, inputs.toArray(new Plan[0])); this.qualifier = qualifier; + this.outputs = ImmutableList.copyOf(outputs); } public PhysicalSetOperation(PlanType planType, Qualifier qualifier, + List<NamedExpression> outputs, Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, List<Plan> inputs) { super(planType, groupExpression, logicalProperties, inputs.toArray(new Plan[0])); this.qualifier = qualifier; + this.outputs = ImmutableList.copyOf(outputs); } public PhysicalSetOperation(PlanType planType, Qualifier qualifier, + List<NamedExpression> outputs, Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, PhysicalProperties physicalProperties, Statistics statistics, List<Plan> inputs) { super(planType, groupExpression, logicalProperties, physicalProperties, statistics, inputs.toArray(new Plan[0])); this.qualifier = qualifier; + this.outputs = ImmutableList.copyOf(outputs); } @Override @@ -130,4 +138,10 @@ public abstract class PhysicalSetOperation extends AbstractPhysicalPlan implemen return children.size(); } + @Override + public List<Slot> computeOutput() { + return outputs.stream() + .map(NamedExpression::toSlot) + .collect(ImmutableList.toImmutableList()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java index 559f7f2d0c..af71f50e6b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java @@ -21,6 +21,7 @@ import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.properties.OrderKey; import org.apache.doris.nereids.properties.PhysicalProperties; +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.SortPhase; @@ -143,4 +144,16 @@ public class PhysicalTopN<CHILD_TYPE extends Plan> extends AbstractPhysicalSort< "phase", phase.toString() ); } + + @Override + public List<Slot> computeOutput() { + return child().getOutput(); + } + + @Override + public PhysicalTopN<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalTopN<>(orderKeys, limit, offset, phase, groupExpression, + null, physicalProperties, statistics, child()); + } + } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalUnion.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalUnion.java index c44dda6a3f..5ff387c3ba 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalUnion.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalUnion.java @@ -43,32 +43,34 @@ public class PhysicalUnion extends PhysicalSetOperation implements Union { private final List<List<NamedExpression>> constantExprsList; public PhysicalUnion(Qualifier qualifier, - List<List<NamedExpression>> constantExprsList, - LogicalProperties logicalProperties, - List<Plan> inputs) { - super(PlanType.PHYSICAL_UNION, qualifier, logicalProperties, inputs); + List<NamedExpression> outputs, + List<List<NamedExpression>> constantExprsList, + LogicalProperties logicalProperties, + List<Plan> inputs) { + super(PlanType.PHYSICAL_UNION, qualifier, outputs, logicalProperties, inputs); this.constantExprsList = ImmutableList.copyOf( Objects.requireNonNull(constantExprsList, "constantExprsList should not be null")); } public PhysicalUnion(Qualifier qualifier, - List<List<NamedExpression>> constantExprsList, - Optional<GroupExpression> groupExpression, - LogicalProperties logicalProperties, - List<Plan> inputs) { - super(PlanType.PHYSICAL_UNION, qualifier, groupExpression, logicalProperties, inputs); + List<NamedExpression> outputs, + List<List<NamedExpression>> constantExprsList, + Optional<GroupExpression> groupExpression, + LogicalProperties logicalProperties, + List<Plan> inputs) { + super(PlanType.PHYSICAL_UNION, qualifier, outputs, groupExpression, logicalProperties, inputs); this.constantExprsList = ImmutableList.copyOf( Objects.requireNonNull(constantExprsList, "constantExprsList should not be null")); } - public PhysicalUnion(Qualifier qualifier, List<List<NamedExpression>> constantExprsList, - Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, - PhysicalProperties physicalProperties, Statistics statistics, List<Plan> inputs) { - super(PlanType.PHYSICAL_UNION, qualifier, + public PhysicalUnion(Qualifier qualifier, List<NamedExpression> outputs, + List<List<NamedExpression>> constantExprsList, + Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, + PhysicalProperties physicalProperties, Statistics statistics, List<Plan> inputs) { + super(PlanType.PHYSICAL_UNION, qualifier, outputs, groupExpression, logicalProperties, physicalProperties, statistics, inputs); this.constantExprsList = ImmutableList.copyOf( Objects.requireNonNull(constantExprsList, "constantExprsList should not be null")); - } public List<List<NamedExpression>> getConstantExprsList() { @@ -90,25 +92,32 @@ public class PhysicalUnion extends PhysicalSetOperation implements Union { @Override public PhysicalUnion withChildren(List<Plan> children) { - return new PhysicalUnion(qualifier, constantExprsList, getLogicalProperties(), children); + return new PhysicalUnion(qualifier, outputs, constantExprsList, getLogicalProperties(), children); } @Override - public PhysicalUnion withGroupExpression( - Optional<GroupExpression> groupExpression) { - return new PhysicalUnion(qualifier, constantExprsList, groupExpression, getLogicalProperties(), children); + public PhysicalUnion withGroupExpression(Optional<GroupExpression> groupExpression) { + return new PhysicalUnion(qualifier, outputs, constantExprsList, groupExpression, + getLogicalProperties(), children); } @Override public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties, List<Plan> children) { - return new PhysicalUnion(qualifier, constantExprsList, groupExpression, logicalProperties.get(), children); + return new PhysicalUnion(qualifier, outputs, constantExprsList, groupExpression, + logicalProperties.get(), children); } @Override public PhysicalUnion withPhysicalPropertiesAndStats( PhysicalProperties physicalProperties, Statistics statistics) { - return new PhysicalUnion(qualifier, constantExprsList, Optional.empty(), + return new PhysicalUnion(qualifier, outputs, constantExprsList, Optional.empty(), getLogicalProperties(), physicalProperties, statistics, children); } + + @Override + public PhysicalUnion resetLogicalProperties() { + return new PhysicalUnion(qualifier, outputs, constantExprsList, Optional.empty(), + null, physicalProperties, statistics, children); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalWindow.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalWindow.java index fe5559940e..22a78ca887 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalWindow.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalWindow.java @@ -25,6 +25,7 @@ import org.apache.doris.nereids.properties.RequirePropertiesSupplier; import org.apache.doris.nereids.rules.implementation.LogicalWindowToPhysicalWindow.WindowFrameGroup; 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.Window; @@ -33,6 +34,7 @@ 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 java.util.List; import java.util.Objects; @@ -47,23 +49,29 @@ public class PhysicalWindow<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD private final WindowFrameGroup windowFrameGroup; private final RequireProperties requireProperties; + private final List<NamedExpression> windowExpressions; + public PhysicalWindow(WindowFrameGroup windowFrameGroup, RequireProperties requireProperties, + List<NamedExpression> windowExpressions, LogicalProperties logicalProperties, CHILD_TYPE child) { - this(windowFrameGroup, requireProperties, Optional.empty(), logicalProperties, child); + this(windowFrameGroup, requireProperties, windowExpressions, Optional.empty(), logicalProperties, child); } /** constructor for PhysicalWindow */ public PhysicalWindow(WindowFrameGroup windowFrameGroup, RequireProperties requireProperties, + List<NamedExpression> windowExpressions, Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, CHILD_TYPE child) { super(PlanType.PHYSICAL_WINDOW, groupExpression, logicalProperties, child); this.windowFrameGroup = Objects.requireNonNull(windowFrameGroup, "windowFrameGroup in PhysicalWindow" + "cannot be null"); this.requireProperties = requireProperties; + this.windowExpressions = ImmutableList.copyOf(windowExpressions); } /** constructor for PhysicalWindow */ public PhysicalWindow(WindowFrameGroup windowFrameGroup, RequireProperties requireProperties, + List<NamedExpression> windowExpressions, Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties, PhysicalProperties physicalProperties, Statistics statistics, CHILD_TYPE child) { @@ -72,6 +80,7 @@ public class PhysicalWindow<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD this.windowFrameGroup = Objects.requireNonNull(windowFrameGroup, "windowFrameGroup in PhysicalWindow" + "cannot be null"); this.requireProperties = requireProperties; + this.windowExpressions = ImmutableList.copyOf(windowExpressions); } @Override @@ -127,13 +136,13 @@ public class PhysicalWindow<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD @Override public Plan withChildren(List<Plan> children) { Preconditions.checkState(children.size() == 1); - return new PhysicalWindow<>(windowFrameGroup, requireProperties, groupExpression, + return new PhysicalWindow<>(windowFrameGroup, requireProperties, windowExpressions, groupExpression, getLogicalProperties(), physicalProperties, statistics, children.get(0)); } @Override public Plan withGroupExpression(Optional<GroupExpression> groupExpression) { - return new PhysicalWindow<>(windowFrameGroup, requireProperties, groupExpression, + return new PhysicalWindow<>(windowFrameGroup, requireProperties, windowExpressions, groupExpression, getLogicalProperties(), child()); } @@ -141,14 +150,14 @@ public class PhysicalWindow<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties, List<Plan> children) { Preconditions.checkState(children.size() == 1); - return new PhysicalWindow<>(windowFrameGroup, requireProperties, groupExpression, + return new PhysicalWindow<>(windowFrameGroup, requireProperties, windowExpressions, groupExpression, logicalProperties.get(), children.get(0)); } @Override public PhysicalPlan withPhysicalPropertiesAndStats(PhysicalProperties physicalProperties, Statistics statistics) { - return new PhysicalWindow<>(windowFrameGroup, requireProperties, groupExpression, + return new PhysicalWindow<>(windowFrameGroup, requireProperties, windowExpressions, groupExpression, getLogicalProperties(), physicalProperties, statistics, child()); } @@ -160,7 +169,23 @@ public class PhysicalWindow<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD public <C extends Plan> PhysicalWindow<C> withRequirePropertiesAndChild(RequireProperties requireProperties, C newChild) { - return new PhysicalWindow<>(windowFrameGroup, requireProperties, Optional.empty(), + return new PhysicalWindow<>(windowFrameGroup, requireProperties, windowExpressions, Optional.empty(), getLogicalProperties(), physicalProperties, statistics, newChild); } + + @Override + public List<Slot> computeOutput() { + return new ImmutableList.Builder<Slot>() + .addAll(child().getOutput()) + .addAll(windowExpressions.stream() + .map(NamedExpression::toSlot) + .collect(ImmutableList.toImmutableList())) + .build(); + } + + @Override + public PhysicalWindow<CHILD_TYPE> resetLogicalProperties() { + return new PhysicalWindow<>(windowFrameGroup, requireProperties, windowExpressions, groupExpression, + null, physicalProperties, statistics, child()); + } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanOutputTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanOutputTest.java index eb508f53c9..c0c8b155aa 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanOutputTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanOutputTest.java @@ -17,28 +17,20 @@ package org.apache.doris.nereids.trees.plans; -import org.apache.doris.catalog.Table; import org.apache.doris.nereids.analyzer.UnboundRelation; import org.apache.doris.nereids.exceptions.UnboundException; -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.Slot; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; -import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan; -import org.apache.doris.nereids.trees.plans.physical.PhysicalRelation; import org.apache.doris.nereids.types.IntegerType; import org.apache.doris.nereids.types.StringType; import org.apache.doris.nereids.util.PlanConstructor; import org.apache.doris.nereids.util.RelationUtil; -import org.apache.doris.statistics.Statistics; import com.google.common.collect.ImmutableList; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.List; -import java.util.Optional; public class PlanOutputTest { @Test @@ -68,34 +60,4 @@ public class PlanOutputTest { // correct exception } } - - @Test - public void testPhysicalPlanMustHaveLogicalProperties() { - Assertions.assertThrows(NullPointerException.class, () -> - new PhysicalRelation(RelationUtil.newRelationId(), - PlanType.PHYSICAL_OLAP_SCAN, ImmutableList.of("db"), Optional.empty(), null) { - @Override - public Plan withGroupExpression(Optional<GroupExpression> groupExpression) { - return null; - } - - @Override - public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> groupExpression, - Optional<LogicalProperties> logicalProperties, List<Plan> children) { - return null; - } - - @Override - public PhysicalPlan withPhysicalPropertiesAndStats(PhysicalProperties physicalProperties, - Statistics statsDeriveResult) { - return null; - } - - @Override - public Table getTable() { - return null; - } - } - ); - } } diff --git a/regression-test/data/nereids_syntax_p0/join_order.out b/regression-test/data/nereids_syntax_p0/join_order.out index 095c7b2035..b60a65aa0b 100644 --- a/regression-test/data/nereids_syntax_p0/join_order.out +++ b/regression-test/data/nereids_syntax_p0/join_order.out @@ -2,3 +2,6 @@ -- !sql -- 1 +-- !sql2 -- +1 1 + diff --git a/regression-test/suites/nereids_syntax_p0/join_order.groovy b/regression-test/suites/nereids_syntax_p0/join_order.groovy index 0aa0e72ba2..74f4d7c801 100644 --- a/regression-test/suites/nereids_syntax_p0/join_order.groovy +++ b/regression-test/suites/nereids_syntax_p0/join_order.groovy @@ -105,4 +105,14 @@ suite("join_order") { sql("select * from outerjoin_A_order, outerjoin_B_order, outerjoin_C_order where outerjoin_A_order.a1 = outerjoin_C_order.c and outerjoin_B_order.b = outerjoin_C_order.c;") notContains "CROSS JOIN" } + + qt_sql2 """SELECT + subq_0.`c1`, + subq_0.`c0` + FROM + (SELECT ref_1.b AS c0, + ref_7.a1 AS c1 + FROM outerjoin_B_order AS ref_1 + INNER JOIN outerjoin_A_order AS ref_7 + ON (true) order by ref_7.a2) AS subq_0 order by 1, 2;""" } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org