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

Reply via email to