[fix](Nereids) could not do partition prunning when predicates is NULL (#28294)
This commit is contained in:
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user