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]