[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;
}
}

View File

@ -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)")
}
}

View File

@ -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 {