[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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,4 +74,14 @@ suite("test_date_function_prune") {
|
||||
sql "select * from dp where Date(date_time) in ('2020-01-01', '2020-01-03')"
|
||||
contains("partitions=2/3 (p1,p3)")
|
||||
}
|
||||
|
||||
explain {
|
||||
sql "select * from dp where (date(date_time) = null and node_name = 'no sense1') or (date(date_time) = '2020-01-01' and node_name = 'no sense2')"
|
||||
contains("partitions=1/3 (p1)")
|
||||
}
|
||||
|
||||
explain {
|
||||
sql "select * from dp where date(date_time) = null or date(date_time) = '2020-01-01'"
|
||||
contains("partitions=1/3 (p1)")
|
||||
}
|
||||
}
|
||||
@ -179,12 +179,12 @@ suite("test_multi_range_partition") {
|
||||
|
||||
explain {
|
||||
sql "select * from pt where k1=7 and k2 in (null);"
|
||||
contains "partitions=2/3 (p2,p3)"
|
||||
contains "VEMPTYSET"
|
||||
}
|
||||
|
||||
explain {
|
||||
sql "select * from pt where k1=7 and k2 not in (null);"
|
||||
contains "partitions=2/3 (p2,p3)"
|
||||
contains "VEMPTYSET"
|
||||
}
|
||||
|
||||
explain {
|
||||
@ -204,13 +204,13 @@ suite("test_multi_range_partition") {
|
||||
|
||||
explain {
|
||||
sql "select * from pt where k2 in (null);"
|
||||
contains "partitions=3/3 (p1,p2,p3)"
|
||||
contains "VEMPTYSET"
|
||||
}
|
||||
|
||||
// p1/p2/p3 NOT pruned
|
||||
explain {
|
||||
sql "select * from pt where k2 not in (null)"
|
||||
contains "partitions=3/3 (p1,p2,p3)"
|
||||
contains "VEMPTYSET"
|
||||
}
|
||||
|
||||
explain {
|
||||
|
||||
Reference in New Issue
Block a user