Skip to content

Commit c70980e

Browse files
morrySnowDoris-Extras
authored andcommitted
[fix](Nereids) could not do partition prunning when predicates is NULL (apache#27)
1 parent d037d58 commit c70980e

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java

+10
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.apache.doris.nereids.trees.expressions.functions.scalar.Date;
4545
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
4646
import org.apache.doris.nereids.trees.expressions.literal.Literal;
47+
import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
4748
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
4849
import org.apache.doris.nereids.types.BooleanType;
4950
import org.apache.doris.nereids.types.DataType;
@@ -227,6 +228,15 @@ public EvaluateRangeResult visit(Expression expr, EvaluateRangeInput context) {
227228
return result;
228229
}
229230

231+
@Override
232+
public EvaluateRangeResult visitNullLiteral(NullLiteral nullLiteral, EvaluateRangeInput context) {
233+
Map<Slot, ColumnRange> emptyRanges = Maps.newHashMap();
234+
for (Slot key : context.defaultColumnRanges.keySet()) {
235+
emptyRanges.put(key, new ColumnRange());
236+
}
237+
return new EvaluateRangeResult(nullLiteral, emptyRanges, ImmutableList.of());
238+
}
239+
230240
@Override
231241
public EvaluateRangeResult visitSlot(Slot slot, EvaluateRangeInput context) {
232242
// try to replace partition slot to literal

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
3333
import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
3434
import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
35+
import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
3536
import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter;
3637
import org.apache.doris.nereids.types.DateTimeType;
3738

@@ -239,7 +240,7 @@ private boolean canPrune(OnePartitionEvaluator evaluator) {
239240
List<Map<Slot, PartitionSlotInput>> onePartitionInputs = evaluator.getOnePartitionInputs();
240241
for (Map<Slot, PartitionSlotInput> currentInputs : onePartitionInputs) {
241242
Expression result = evaluator.evaluateWithDefaultPartition(partitionPredicate, currentInputs);
242-
if (!result.equals(BooleanLiteral.FALSE)) {
243+
if (!result.equals(BooleanLiteral.FALSE) && !(result instanceof NullLiteral)) {
243244
return false;
244245
}
245246
}

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TryEliminateUninterestedPredicates.java

+24
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.doris.nereids.CascadesContext;
2121
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
2222
import org.apache.doris.nereids.rules.expression.rules.TryEliminateUninterestedPredicates.Context;
23+
import org.apache.doris.nereids.trees.expressions.And;
2324
import org.apache.doris.nereids.trees.expressions.Expression;
2425
import org.apache.doris.nereids.trees.expressions.Slot;
2526
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
@@ -107,6 +108,29 @@ public Expression visit(Expression originExpr, Context parentContext) {
107108
return expr;
108109
}
109110

111+
@Override
112+
public Expression visitAnd(And and, Context parentContext) {
113+
Expression left = and.left();
114+
Context leftContext = new Context();
115+
// Expression newLeft = this.visit(left, leftContext);
116+
Expression newLeft = left.accept(this, leftContext);
117+
118+
if (leftContext.childrenContainsNonInterestedSlots) {
119+
newLeft = BooleanLiteral.TRUE;
120+
}
121+
122+
Expression right = and.right();
123+
Context rightContext = new Context();
124+
Expression newRight = this.visit(right, rightContext);
125+
if (rightContext.childrenContainsNonInterestedSlots) {
126+
newRight = BooleanLiteral.TRUE;
127+
}
128+
Expression expr = new And(newLeft, newRight).accept(FoldConstantRuleOnFE.INSTANCE, expressionRewriteContext);
129+
parentContext.childrenContainsInterestedSlots =
130+
rightContext.childrenContainsInterestedSlots || leftContext.childrenContainsInterestedSlots;
131+
return expr;
132+
}
133+
110134
@Override
111135
public Expression visitSlot(Slot slot, Context context) {
112136
boolean isInterestedSlot = interestedSlots.contains(slot);

0 commit comments

Comments
 (0)