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

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


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new b5143715248 [fix] stats npe bug (#42092)
b5143715248 is described below

commit b5143715248bb398cec0fdd2b98644c57ffb6ef1
Author: minghong <[email protected]>
AuthorDate: Fri Oct 18 22:05:33 2024 +0800

    [fix] stats npe bug (#42092)
    
    ## Proposed changes
    
    Some processors have erased the stats information of the nodes, causing
    the runtime_filter_pruner to encounter a NullPointerException.
    
    Issue Number: close #xxx
    
    <!--Describe your changes.-->
---
 .../doris/nereids/processor/post/PlanPostProcessor.java       |  4 +++-
 .../doris/nereids/processor/post/RuntimeFilterPruner.java     |  3 +++
 .../nereids/trees/plans/visitor/DefaultPlanRewriter.java      | 11 ++++++++++-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessor.java
index 5090acedf43..f73d552ee82 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/PlanPostProcessor.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.processor.post;
 
 import org.apache.doris.nereids.CascadesContext;
 import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.physical.AbstractPhysicalPlan;
 import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanRewriter;
 
 /**
@@ -27,6 +28,7 @@ import 
org.apache.doris.nereids.trees.plans.visitor.DefaultPlanRewriter;
 public class PlanPostProcessor extends DefaultPlanRewriter<CascadesContext> {
 
     public Plan processRoot(Plan plan, CascadesContext ctx) {
-        return plan.accept(this, ctx);
+        AbstractPhysicalPlan newPlan = (AbstractPhysicalPlan) 
super.visit(plan, ctx);
+        return newPlan == plan ? plan : 
newPlan.copyStatsAndGroupIdFrom((AbstractPhysicalPlan) plan);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterPruner.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterPruner.java
index 92b2960fb25..3fbaf927ed1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterPruner.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterPruner.java
@@ -284,6 +284,9 @@ public class RuntimeFilterPruner extends PlanPostProcessor {
         }
         Slot leftSlot = leftSlots.iterator().next();
         Slot rightSlot = rightSlots.iterator().next();
+        if (leftStats == null || rightStats == null) {
+            return false;
+        }
         ColumnStatistic probeColumnStat = 
leftStats.findColumnStatistics(leftSlot);
         ColumnStatistic buildColumnStat = 
rightStats.findColumnStatistics(rightSlot);
         //TODO remove these code when we ensure left child if from probe side
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/DefaultPlanRewriter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/DefaultPlanRewriter.java
index ff89572197d..c3d29372a1e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/DefaultPlanRewriter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/DefaultPlanRewriter.java
@@ -18,6 +18,7 @@
 package org.apache.doris.nereids.trees.plans.visitor;
 
 import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.physical.AbstractPhysicalPlan;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalOlapScan;
 import 
org.apache.doris.nereids.trees.plans.physical.PhysicalStorageLayerAggregate;
 
@@ -56,6 +57,14 @@ public abstract class DefaultPlanRewriter<C> extends 
PlanVisitor<Plan, C> {
             }
             newChildren.add(newChild);
         }
-        return hasNewChildren ? (P) plan.withChildren(newChildren.build()) : 
plan;
+        if (hasNewChildren) {
+            plan = (P) plan.withChildren(newChildren.build());
+            if (plan instanceof AbstractPhysicalPlan) {
+                AbstractPhysicalPlan physicalPlan = (AbstractPhysicalPlan) 
plan;
+                plan = (P) ((AbstractPhysicalPlan) 
physicalPlan.withChildren(newChildren.build()))
+                        .copyStatsAndGroupIdFrom(physicalPlan);
+            }
+        }
+        return plan;
     }
 }


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

Reply via email to