From b5143715248bb398cec0fdd2b98644c57ffb6ef1 Mon Sep 17 00:00:00 2001 From: minghong Date: Fri, 18 Oct 2024 22:05:33 +0800 Subject: [PATCH] [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 --- .../nereids/processor/post/PlanPostProcessor.java | 4 +++- .../nereids/processor/post/RuntimeFilterPruner.java | 3 +++ .../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 5090acedf4..f73d552ee8 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 { 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 92b2960fb2..3fbaf927ed 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 ff89572197..c3d29372a1 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 extends PlanVisitor { } 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; } }