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

yiguolei pushed a commit to branch branch-4.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.1 by this push:
     new 27eda176737 branch-4.1: [fix](data traits) Fix data trait propagation 
for logical CTE anchors #64921 (#65010)
27eda176737 is described below

commit 27eda17673797a507474b04263d26681b4cd1f0a
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Mon Jul 6 10:53:38 2026 +0800

    branch-4.1: [fix](data traits) Fix data trait propagation for logical CTE 
anchors #64921 (#65010)
    
    Cherry-picked from #64921
    
    Co-authored-by: feiniaofeiafei <[email protected]>
---
 .../trees/plans/logical/LogicalCTEAnchor.java      | 34 ++++++++++++++++++--
 .../trees/plans/physical/PhysicalCTEAnchor.java    | 34 ++++++++++++++++++--
 .../doris/nereids/properties/DataTraitTest.java    | 37 ++++++++++++++++------
 3 files changed, 90 insertions(+), 15 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTEAnchor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTEAnchor.java
index 37989a6bc2a..bfa287d34b8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTEAnchor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTEAnchor.java
@@ -18,13 +18,13 @@
 package org.apache.doris.nereids.trees.plans.logical;
 
 import org.apache.doris.nereids.memo.GroupExpression;
+import org.apache.doris.nereids.properties.DataTrait;
 import org.apache.doris.nereids.properties.LogicalProperties;
 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.PropagateFuncDeps;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
@@ -38,8 +38,7 @@ import java.util.Optional;
  * LogicalCTEAnchor
  */
 public class LogicalCTEAnchor<LEFT_CHILD_TYPE extends Plan,
-        RIGHT_CHILD_TYPE extends Plan> extends LogicalBinary<LEFT_CHILD_TYPE, 
RIGHT_CHILD_TYPE> implements
-        PropagateFuncDeps {
+        RIGHT_CHILD_TYPE extends Plan> extends LogicalBinary<LEFT_CHILD_TYPE, 
RIGHT_CHILD_TYPE> {
 
     private final CTEId cteId;
 
@@ -110,4 +109,33 @@ public class LogicalCTEAnchor<LEFT_CHILD_TYPE extends Plan,
     public int hashCode() {
         return Objects.hash(cteId);
     }
+
+    @Override
+    public DataTrait computeDataTrait() {
+        return right().getLogicalProperties().getTrait();
+    }
+
+    // This function is useless, actually.
+    @Override
+    public void computeUnique(DataTrait.Builder builder) {
+        builder.addUniqueSlot(right().getLogicalProperties().getTrait());
+    }
+
+    // This function is useless, actually.
+    @Override
+    public void computeUniform(DataTrait.Builder builder) {
+        builder.addUniformSlot(right().getLogicalProperties().getTrait());
+    }
+
+    // This function is useless, actually.
+    @Override
+    public void computeEqualSet(DataTrait.Builder builder) {
+        builder.addEqualSet(right().getLogicalProperties().getTrait());
+    }
+
+    // This function is useless, actually.
+    @Override
+    public void computeFd(DataTrait.Builder builder) {
+        builder.addFuncDepsDG(right().getLogicalProperties().getTrait());
+    }
 }
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 21a77d66597..6b43edae365 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
@@ -18,6 +18,7 @@
 package org.apache.doris.nereids.trees.plans.physical;
 
 import org.apache.doris.nereids.memo.GroupExpression;
+import org.apache.doris.nereids.properties.DataTrait;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.PhysicalProperties;
 import org.apache.doris.nereids.trees.expressions.CTEId;
@@ -25,7 +26,6 @@ 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.PropagateFuncDeps;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 import org.apache.doris.statistics.Statistics;
@@ -43,8 +43,7 @@ import java.util.Optional;
 public class PhysicalCTEAnchor<
         LEFT_CHILD_TYPE extends Plan,
         RIGHT_CHILD_TYPE extends Plan>
-        extends PhysicalBinary<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> implements
-        PropagateFuncDeps {
+        extends PhysicalBinary<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> {
     private final CTEId cteId;
 
     public PhysicalCTEAnchor(CTEId cteId, LogicalProperties logicalProperties,
@@ -144,4 +143,33 @@ public class PhysicalCTEAnchor<
         return new PhysicalCTEAnchor<>(cteId, groupExpression, null, 
physicalProperties,
                 statistics, child(0), child(1));
     }
+
+    @Override
+    public DataTrait computeDataTrait() {
+        return right().getLogicalProperties().getTrait();
+    }
+
+    // This function is useless, actually.
+    @Override
+    public void computeUnique(DataTrait.Builder builder) {
+        builder.addUniqueSlot(right().getLogicalProperties().getTrait());
+    }
+
+    // This function is useless, actually.
+    @Override
+    public void computeUniform(DataTrait.Builder builder) {
+        builder.addUniformSlot(right().getLogicalProperties().getTrait());
+    }
+
+    // This function is useless, actually.
+    @Override
+    public void computeEqualSet(DataTrait.Builder builder) {
+        builder.addEqualSet(right().getLogicalProperties().getTrait());
+    }
+
+    // This function is useless, actually.
+    @Override
+    public void computeFd(DataTrait.Builder builder) {
+        builder.addFuncDepsDG(right().getLogicalProperties().getTrait());
+    }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/DataTraitTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/DataTraitTest.java
index 5ca6450d883..6647522c269 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/DataTraitTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/properties/DataTraitTest.java
@@ -21,14 +21,15 @@ import 
org.apache.doris.nereids.properties.DataTrait.Builder;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalCTEAnchor;
 import org.apache.doris.nereids.trees.plans.logical.LogicalPartitionTopN;
+import org.apache.doris.nereids.trees.plans.physical.PhysicalCTEAnchor;
 import org.apache.doris.nereids.types.IntegerType;
 import org.apache.doris.nereids.util.PlanChecker;
 import org.apache.doris.utframe.TestWithFeService;
 
 import com.google.common.collect.ImmutableSet;
 import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 class DataTraitTest extends TestWithFeService {
@@ -333,16 +334,34 @@ class DataTraitTest extends TestWithFeService {
                 .getTrait().isUniqueAndNotNull(plan.getOutput().get(0)));
     }
 
-    @Disabled
     @Test
     void testCTE() {
-        Plan plan = PlanChecker.from(connectContext)
-                .analyze("with t as (select * from agg) select id from t where 
id = 1")
-                .getPlan();
-        System.out.println(plan.treeString());
-        System.out.println(plan.getLogicalProperties().getTrait());
-        Assertions.assertTrue(plan.getLogicalProperties()
-                .getTrait().isUniqueAndNotNull(plan.getOutput().get(0)));
+        int oldInlineCTEReferencedThreshold = 
connectContext.getSessionVariable().inlineCTEReferencedThreshold;
+        connectContext.getSessionVariable().inlineCTEReferencedThreshold = 0;
+        try {
+            Plan plan = PlanChecker.from(connectContext)
+                    .analyze("with t as (select * from agg) select id from t 
where id = 1")
+                    .rewrite()
+                    .getPlan();
+            Assertions.assertInstanceOf(LogicalCTEAnchor.class, plan);
+            Assertions.assertTrue(plan.getLogicalProperties()
+                    .getTrait().isUniformAndNotNull(plan.getOutput().get(0)));
+            Assertions.assertEquals(plan.getLogicalProperties().getTrait(),
+                    plan.child(1).getLogicalProperties().getTrait());
+
+            Plan physicalPlan = PlanChecker.from(connectContext)
+                    .analyze("with t as (select * from agg) select id from t 
where id = 1")
+                    .rewrite()
+                    .optimize()
+                    .getBestPlanTree();
+            Assertions.assertInstanceOf(PhysicalCTEAnchor.class, physicalPlan);
+            Assertions.assertTrue(physicalPlan.getLogicalProperties()
+                    
.getTrait().isUniformAndNotNull(physicalPlan.getOutput().get(0)));
+            
Assertions.assertEquals(physicalPlan.getLogicalProperties().getTrait(),
+                    physicalPlan.child(1).getLogicalProperties().getTrait());
+        } finally {
+            connectContext.getSessionVariable().inlineCTEReferencedThreshold = 
oldInlineCTEReferencedThreshold;
+        }
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to