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]