[fix](Nereids) could not do partition prunning when predicates is NULL (#28294)

This commit is contained in:
morrySnow
2023-12-13 19:36:42 +08:00
committed by GitHub
parent ec91dd1129
commit dbc2b081d7
4 changed files with 26 additions and 5 deletions

View File

@ -44,6 +44,7 @@ import org.apache.doris.nereids.trees.expressions.Slot;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Date;
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.BooleanType;
import org.apache.doris.nereids.types.DataType;
@ -231,6 +232,15 @@ public class OneRangePartitionEvaluator
return result;
}
@Override
public EvaluateRangeResult visitNullLiteral(NullLiteral nullLiteral, EvaluateRangeInput context) {
Map<Slot, ColumnRange> emptyRanges = Maps.newHashMap();
for (Slot key : context.defaultColumnRanges.keySet()) {
emptyRanges.put(key, new ColumnRange());
}
return new EvaluateRangeResult(nullLiteral, emptyRanges, ImmutableList.of());
}
@Override
public EvaluateRangeResult visitSlot(Slot slot, EvaluateRangeInput context) {
// try to replace partition slot to literal

View File

@ -29,6 +29,7 @@ import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter;
import org.apache.doris.nereids.types.DateTimeType;
@ -142,7 +143,7 @@ public class PartitionPruner extends DefaultExpressionRewriter<Void> {
List<Map<Slot, PartitionSlotInput>> onePartitionInputs = evaluator.getOnePartitionInputs();
for (Map<Slot, PartitionSlotInput> currentInputs : onePartitionInputs) {
Expression result = evaluator.evaluateWithDefaultPartition(partitionPredicate, currentInputs);
if (!result.equals(BooleanLiteral.FALSE)) {
if (!result.equals(BooleanLiteral.FALSE) && !(result instanceof NullLiteral)) {
return false;
}
}