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

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


The following commit(s) were added to refs/heads/branch-4.2 by this push:
     new c4800e90530 branch-4.2: [fix](partition pruning) Preserve partition 
pruning state in plan copies #67113 (#70063)
c4800e90530 is described below

commit c4800e90530cc2a061b2421849b2f08723bf6d34
Author: morrySnow <[email protected]>
AuthorDate: Wed Nov 4 08:20:49 2026 +0800

    branch-4.2: [fix](partition pruning) Preserve partition pruning state in 
plan copies #67113 (#70063)
    
    picked from master #67113
    
    Co-authored-by: feiniaofeiafei <[email protected]>
---
 .../nereids/rules/exploration/mv/StructInfo.java   |  6 ++++-
 .../nereids/trees/copier/DeepCopierContext.java    | 10 +++++++
 .../trees/copier/LogicalPlanDeepCopier.java        |  3 +++
 .../trees/plans/logical/LogicalOlapScan.java       | 15 +++++++++--
 .../trees/copier/LogicalPlanDeepCopierTest.java    | 31 ++++++++++++++++++++++
 5 files changed, 62 insertions(+), 3 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/StructInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/StructInfo.java
index b53468c5725..41766a0cafc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/StructInfo.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/StructInfo.java
@@ -1016,8 +1016,12 @@ public class StructInfo {
         }
         // Deep copy the plan to avoid the plan output is the same with the 
later union output, this may cause
         // exec by mistake
+        DeepCopierContext deepCopierContext = new DeepCopierContext();
+        // The compensation filter changes the partition range. Invalidate 
pruning during the copy to avoid
+        // another traversal before the following whole-tree rewrite applies 
partition pruning again.
+        deepCopierContext.setInvalidatePartitionPruning(true);
         queryPlanWithUnionFilter = new LogicalPlanDeepCopier().deepCopy(
-                (LogicalPlan) queryPlanWithUnionFilter, new 
DeepCopierContext());
+                (LogicalPlan) queryPlanWithUnionFilter, deepCopierContext);
         // rbo rewrite after adding filter on origin plan
         return 
Pair.of(MaterializedViewUtils.rewriteByRules(parentCascadesContext, context -> {
             Rewriter.getWholeTreeRewriter(context).execute();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/DeepCopierContext.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/DeepCopierContext.java
index c4772fb7e81..b898a08f7f1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/DeepCopierContext.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/DeepCopierContext.java
@@ -39,6 +39,16 @@ public class DeepCopierContext {
      * to ensure they keep same after deep copy
      */
     private final Map<RelationId, LogicalRelation> relationReplaceMap = 
Maps.newHashMap();
+    /** Whether copied OLAP scans should be marked for partition pruning 
again. */
+    private boolean invalidatePartitionPruning = false;
+
+    public void setInvalidatePartitionPruning(boolean 
invalidatePartitionPruning) {
+        this.invalidatePartitionPruning = invalidatePartitionPruning;
+    }
+
+    public boolean shouldInvalidatePartitionPruning() {
+        return invalidatePartitionPruning;
+    }
 
     public void putRelation(RelationId relationId, LogicalRelation 
newRelation) {
         relationReplaceMap.put(relationId, newRelation);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
index 5cb069b5aab..8144847d3ff 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
@@ -107,6 +107,9 @@ public class LogicalPlanDeepCopier extends 
DefaultPlanRewriter<DeepCopierContext
         }
         LogicalCatalogRelation newRelation =
                 
catalogRelation.withRelationId(StatementScopeIdGenerator.newRelationId());
+        if (context.shouldInvalidatePartitionPruning() && newRelation 
instanceof LogicalOlapScan) {
+            newRelation = ((LogicalOlapScan) 
newRelation).withPartitionPruned(false);
+        }
         updateReplaceMapWithOutput(catalogRelation, newRelation, 
context.exprIdReplaceMap);
         if (!catalogRelation.getVirtualColumns().isEmpty()) {
             // A virtual column can refer to the others, so each one gets its 
new id before any is copied.
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
index d212e361c7e..76016847d84 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
@@ -535,12 +535,23 @@ public class LogicalOlapScan extends 
LogicalCatalogRelation implements OlapScan,
                 tableAlias);
     }
 
+    /** Return a scan with the specified partition pruning state. */
+    public LogicalOlapScan withPartitionPruned(boolean partitionPruned) {
+        return new LogicalOlapScan(relationId, (Table) table, qualifier,
+                Optional.empty(), Optional.of(getLogicalProperties()),
+                selectedPartitionIds, partitionPruned, hasPartitionPredicate, 
selectedTabletIds,
+                selectedIndexId, indexSelected, preAggStatus, 
manuallySpecifiedPartitions,
+                hints, cacheSlotWithSlotName, cachedOutput, tableSample, 
directMvScan,
+                colToSubPathsMap, manuallySpecifiedTabletIds, operativeSlots, 
virtualColumns,
+                scoreOrderKeys, scoreLimit, scoreRangeInfo, annOrderKeys, 
annLimit, partitionPrunablePredicates,
+                tableAlias);
+    }
+
     @Override
     public LogicalOlapScan withRelationId(RelationId relationId) {
-        // we have to set partitionPruned to false, so that mtmv rewrite can 
prevent deadlock when rewriting union
         return new LogicalOlapScan(relationId, (Table) table, qualifier,
                 Optional.empty(), Optional.empty(),
-                selectedPartitionIds, false, false, selectedTabletIds,
+                selectedPartitionIds, partitionPruned, hasPartitionPredicate, 
selectedTabletIds,
                 selectedIndexId, indexSelected, preAggStatus, 
manuallySpecifiedPartitions,
                 hints, Maps.newHashMap(), Optional.empty(), tableSample, 
directMvScan,
                 colToSubPathsMap, selectedTabletIds, operativeSlots, 
virtualColumns, scoreOrderKeys,
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopierTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopierTest.java
index b022d27ea5c..572258f4b45 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopierTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopierTest.java
@@ -172,4 +172,35 @@ public class LogicalPlanDeepCopierTest {
         Assertions.assertEquals(aggregate.getGroupByExpressions().size(),
                 copiedAggregate.getGroupByExpressions().size());
     }
+
+    @Test
+    public void testDeepCopyOlapScanPreservesPartitionPruningState() {
+        LogicalOlapScan relationPlan = PlanConstructor.newLogicalOlapScan(0, 
"a", 0);
+        relationPlan = 
relationPlan.withSelectedPartitionIds(relationPlan.getSelectedPartitionIds(), 
true);
+
+        LogicalOlapScan copiedPlan =
+                (LogicalOlapScan) 
relationPlan.accept(LogicalPlanDeepCopier.INSTANCE, new DeepCopierContext());
+
+        Assertions.assertTrue(relationPlan.isPartitionPruned());
+        Assertions.assertTrue(relationPlan.hasPartitionPredicate());
+        Assertions.assertTrue(copiedPlan.isPartitionPruned());
+        Assertions.assertTrue(copiedPlan.hasPartitionPredicate());
+    }
+
+    @Test
+    public void testDeepCopyOlapScanInvalidatesPartitionPruning() {
+        LogicalOlapScan relationPlan = PlanConstructor.newLogicalOlapScan(0, 
"a", 0);
+        relationPlan = 
relationPlan.withSelectedPartitionIds(relationPlan.getSelectedPartitionIds(), 
true);
+        DeepCopierContext context = new DeepCopierContext();
+        context.setInvalidatePartitionPruning(true);
+
+        LogicalOlapScan copiedPlan =
+                (LogicalOlapScan) 
relationPlan.accept(LogicalPlanDeepCopier.INSTANCE, context);
+
+        Assertions.assertTrue(relationPlan.isPartitionPruned());
+        Assertions.assertTrue(relationPlan.hasPartitionPredicate());
+        Assertions.assertFalse(copiedPlan.isPartitionPruned());
+        Assertions.assertTrue(copiedPlan.hasPartitionPredicate());
+    }
+
 }


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

Reply via email to