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

morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 4e50b2791ac [fix](Nereids) pull up cte anchor should also pull up cte 
in apply (#28214)
4e50b2791ac is described below

commit 4e50b2791ac349c4572a9ee9d0b7cd76503444de
Author: morrySnow <101034200+morrys...@users.noreply.github.com>
AuthorDate: Tue Dec 12 16:56:04 2023 +0800

    [fix](Nereids) pull up cte anchor should also pull up cte in apply (#28214)
---
 .../nereids/rules/rewrite/PullUpCteAnchor.java     | 32 +++++++++++++++++++++-
 .../nereids/stats/ColumnStatsAdjustVisitor.java    |  2 +-
 .../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 ++++-
 8 files changed, 61 insertions(+), 3 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/stats/ColumnStatsAdjustVisitor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ColumnStatsAdjustVisitor.java
index ff4290557d1..eaf2ce37344 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ColumnStatsAdjustVisitor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ColumnStatsAdjustVisitor.java
@@ -71,7 +71,7 @@ public class ColumnStatsAdjustVisitor extends 
ExpressionVisitor<ColumnStatistic,
     public ColumnStatistic visitCast(Cast cast, Statistics context) {
         ColumnStatistic colStats = context.findColumnStatistics(cast);
 
-        if (colStats != null) {
+        if (colStats != null && colStats.minExpr != null && colStats.maxExpr 
!= null) {
             try {
                 DataType childNereidsType = cast.child().getDataType();
                 if (childNereidsType instanceof CharacterType) {
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 e9f68d45a80..3d3bd17c70e 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
@@ -102,4 +102,9 @@ public class Exists extends SubqueryExpr {
     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 e01302ff399..214525d2594 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
@@ -68,4 +68,9 @@ public class ListQuery extends SubqueryExpr {
                     ? 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 48cf9491bf0..88b354ae821 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
@@ -76,4 +76,9 @@ public class ScalarSubquery extends SubqueryExpr {
                     ? 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 451fcad677b..35d0e566476 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
@@ -137,4 +137,6 @@ public abstract class SubqueryExpr extends Expression 
implements LeafExpression
     }
 
     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 f6cf13dfc76..16e2e964ca8 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
@@ -198,8 +198,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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to