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 a78a4ed8b17 [fix](Nereids) pull up cte anchor should also pull up cte
in apply (#28214) (#28571)
a78a4ed8b17 is described below
commit a78a4ed8b17d70d25522c3eae006fa2179f22279
Author: morrySnow <[email protected]>
AuthorDate: Tue Dec 19 14:23:17 2023 +0800
[fix](Nereids) pull up cte anchor should also pull up cte in apply (#28214)
(#28571)
---
.../nereids/rules/rewrite/PullUpCteAnchor.java | 32 +++++++++++++++++++++-
.../doris/nereids/trees/expressions/Exists.java | 5 ++++
.../nereids/trees/expressions/InSubquery.java | 6 ++++
.../doris/nereids/trees/expressions/ListQuery.java | 5 ++++
.../nereids/trees/expressions/ScalarSubquery.java | 5 ++++
.../nereids/trees/expressions/SubqueryExpr.java | 2 ++
.../nereids/trees/plans/logical/LogicalApply.java | 7 ++++-
7 files changed, 60 insertions(+), 2 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpCteAnchor.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpCteAnchor.java
index c6461be2718..4bfb36db813 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpCteAnchor.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpCteAnchor.java
@@ -18,12 +18,16 @@
package org.apache.doris.nereids.rules.rewrite;
import org.apache.doris.nereids.jobs.JobContext;
+import org.apache.doris.nereids.trees.expressions.SubqueryExpr;
import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalApply;
import org.apache.doris.nereids.trees.plans.logical.LogicalCTEAnchor;
import org.apache.doris.nereids.trees.plans.logical.LogicalCTEProducer;
+import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter;
import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanRewriter;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.util.List;
@@ -42,7 +46,7 @@ public class PullUpCteAnchor extends
DefaultPlanRewriter<List<LogicalCTEProducer
return rewriteRoot(plan, producers);
}
- private Plan rewriteRoot(Plan plan, List<LogicalCTEProducer<Plan>>
producers) {
+ public Plan rewriteRoot(Plan plan, List<LogicalCTEProducer<Plan>>
producers) {
Plan root = plan.accept(this, producers);
for (LogicalCTEProducer<Plan> producer : producers) {
root = new LogicalCTEAnchor<>(producer.getCteId(), producer, root);
@@ -71,4 +75,30 @@ public class PullUpCteAnchor extends
DefaultPlanRewriter<List<LogicalCTEProducer
producers.addAll(childProducers);
return newProducer;
}
+
+ @Override
+ public Plan visitLogicalApply(LogicalApply<? extends Plan, ? extends Plan>
apply,
+ List<LogicalCTEProducer<Plan>> producers) {
+ SubqueryExpr subqueryExpr = apply.getSubqueryExpr();
+ PullUpCteAnchor pullSubqueryExpr = new PullUpCteAnchor();
+ List<LogicalCTEProducer<Plan>> subqueryExprProducers =
Lists.newArrayList();
+ Plan newPlanInExpr =
pullSubqueryExpr.rewriteRoot(subqueryExpr.getQueryPlan(),
subqueryExprProducers);
+ while (newPlanInExpr instanceof LogicalCTEAnchor) {
+ newPlanInExpr = ((LogicalCTEAnchor<?, ?>) newPlanInExpr).right();
+ }
+ SubqueryExpr newSubqueryExpr = subqueryExpr.withSubquery((LogicalPlan)
newPlanInExpr);
+
+ Plan newApplyLeft = apply.left().accept(this, producers);
+
+ Plan applyRight = apply.right();
+ PullUpCteAnchor pullApplyRight = new PullUpCteAnchor();
+ List<LogicalCTEProducer<Plan>> childProducers = Lists.newArrayList();
+ Plan newApplyRight = pullApplyRight.rewriteRoot(applyRight,
childProducers);
+ while (newApplyRight instanceof LogicalCTEAnchor) {
+ newApplyRight = ((LogicalCTEAnchor<?, ?>) newApplyRight).right();
+ }
+ producers.addAll(childProducers);
+ return apply.withSubqueryExprAndChildren(newSubqueryExpr,
+ ImmutableList.of(newApplyLeft, newApplyRight));
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Exists.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Exists.java
index 5fba8c5687e..2d5dba2c074 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Exists.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Exists.java
@@ -103,4 +103,9 @@ public class Exists extends SubqueryExpr implements
LeafExpression {
public Expression withTypeCoercion(DataType dataType) {
return this;
}
+
+ @Override
+ public Exists withSubquery(LogicalPlan subquery) {
+ return new Exists(subquery, correlateSlots, typeCoercionExpr, isNot);
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/InSubquery.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/InSubquery.java
index e04d1b2017a..b04f9d3d78b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/InSubquery.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/InSubquery.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
import org.apache.doris.nereids.types.BooleanType;
import org.apache.doris.nereids.types.DataType;
@@ -138,4 +139,9 @@ public class InSubquery extends SubqueryExpr {
: Optional.of(new Cast(listQuery.queryPlan.getOutput().get(0),
dataType)),
isNot);
}
+
+ @Override
+ public InSubquery withSubquery(LogicalPlan subquery) {
+ return new InSubquery(compareExpr, listQuery.withSubquery(subquery),
correlateSlots, typeCoercionExpr, isNot);
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ListQuery.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ListQuery.java
index a617f7741e7..3b4f7ab9160 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ListQuery.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ListQuery.java
@@ -69,4 +69,9 @@ public class ListQuery extends SubqueryExpr implements
LeafExpression {
? Optional.of(queryPlan.getOutput().get(0))
: Optional.of(new Cast(queryPlan.getOutput().get(0),
dataType)));
}
+
+ @Override
+ public ListQuery withSubquery(LogicalPlan subquery) {
+ return new ListQuery(subquery, correlateSlots, typeCoercionExpr);
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ScalarSubquery.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ScalarSubquery.java
index 873a11c59f0..34728cd30e6 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ScalarSubquery.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ScalarSubquery.java
@@ -77,4 +77,9 @@ public class ScalarSubquery extends SubqueryExpr implements
LeafExpression {
? Optional.of(queryPlan.getOutput().get(0))
: Optional.of(new Cast(queryPlan.getOutput().get(0),
dataType)));
}
+
+ @Override
+ public ScalarSubquery withSubquery(LogicalPlan subquery) {
+ return new ScalarSubquery(subquery, correlateSlots, typeCoercionExpr);
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SubqueryExpr.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SubqueryExpr.java
index aa29c27f874..a4be7fb4610 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SubqueryExpr.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SubqueryExpr.java
@@ -126,4 +126,6 @@ public abstract class SubqueryExpr extends Expression {
}
public abstract Expression withTypeCoercion(DataType dataType);
+
+ public abstract SubqueryExpr withSubquery(LogicalPlan subquery);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java
index b4f25e9771f..70f8db04f15 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java
@@ -197,8 +197,13 @@ public class LogicalApply<LEFT_CHILD_TYPE extends Plan,
RIGHT_CHILD_TYPE extends
.build();
}
+ public LogicalApply<Plan, Plan> withSubqueryExprAndChildren(SubqueryExpr
subqueryExpr, List<Plan> children) {
+ return new LogicalApply<>(correlationSlot, subqueryExpr,
correlationFilter,
+ markJoinSlotReference, needAddSubOutputToProjects, inProject,
children.get(0), children.get(1));
+ }
+
@Override
- public LogicalBinary<Plan, Plan> withChildren(List<Plan> children) {
+ public LogicalApply<Plan, Plan> withChildren(List<Plan> children) {
Preconditions.checkArgument(children.size() == 2);
return new LogicalApply<>(correlationSlot, subqueryExpr,
correlationFilter,
markJoinSlotReference, needAddSubOutputToProjects, inProject,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]