[fix](nereids) prune partition bug in pattern ColA <> ColB #25769
in predicate rewrite phase, we eliminate some conjuncts which contains un-interested columns. for example: T (a, b) partition by (a) interest cols: a uninsterest cols: b for parition prune, filter "a=1 and a>b" is equivalent to "a=1", filter "a=1 or a>b" is equivalent to "TRUE"
This commit is contained in:
@ -20,6 +20,7 @@ package org.apache.doris.nereids.rules.expression.rules;
|
||||
import org.apache.doris.nereids.CascadesContext;
|
||||
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
|
||||
import org.apache.doris.nereids.rules.expression.rules.TryEliminateUninterestedPredicates.Context;
|
||||
import org.apache.doris.nereids.trees.expressions.And;
|
||||
import org.apache.doris.nereids.trees.expressions.Expression;
|
||||
import org.apache.doris.nereids.trees.expressions.Slot;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
|
||||
@ -104,6 +105,27 @@ public class TryEliminateUninterestedPredicates extends DefaultExpressionRewrite
|
||||
return expr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Expression visitAnd(And and, Context parentContext) {
|
||||
Expression left = and.left();
|
||||
Context leftContext = new Context();
|
||||
Expression newLeft = this.visit(left, leftContext);
|
||||
if (leftContext.childrenContainsNonInterestedSlots) {
|
||||
newLeft = BooleanLiteral.TRUE;
|
||||
}
|
||||
|
||||
Expression right = and.right();
|
||||
Context rightContext = new Context();
|
||||
Expression newRight = this.visit(right, rightContext);
|
||||
if (rightContext.childrenContainsNonInterestedSlots) {
|
||||
newRight = BooleanLiteral.TRUE;
|
||||
}
|
||||
Expression expr = new And(newLeft, newRight).accept(FoldConstantRuleOnFE.INSTANCE, expressionRewriteContext);
|
||||
parentContext.childrenContainsInterestedSlots =
|
||||
rightContext.childrenContainsInterestedSlots || leftContext.childrenContainsInterestedSlots;
|
||||
return expr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Expression visitSlot(Slot slot, Context context) {
|
||||
boolean isInterestedSlot = interestedSlots.contains(slot);
|
||||
|
||||
@ -228,6 +228,8 @@ class PruneOlapScanPartitionTest extends TestWithFeService implements MemoPatter
|
||||
public void canNotPruneComplexPredicate() {
|
||||
test("test_range_parts", "(part = 10) or (part + id = 1)", 4);
|
||||
test("test_range_parts", "(part + id = 1) and (part = 4)", 1);
|
||||
test("test_range_parts", "(part = 2) and (part <> id)", 1);
|
||||
test("test_range_parts", "(part = 2) or (part <> id)", 4);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user