[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);
|
||||
|
||||
Reference in New Issue
Block a user