This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new dbc2b081d7a [fix](Nereids) could not do partition prunning when 
predicates is NULL (#28294)
dbc2b081d7a is described below

commit dbc2b081d7af06bbb512ed6a41d54c1cc8f2caaa
Author: morrySnow <101034200+morrys...@users.noreply.github.com>
AuthorDate: Wed Dec 13 19:36:42 2023 +0800

    [fix](Nereids) could not do partition prunning when predicates is NULL 
(#28294)
---
 .../rules/expression/rules/OneRangePartitionEvaluator.java     | 10 ++++++++++
 .../doris/nereids/rules/expression/rules/PartitionPruner.java  |  3 ++-
 .../partition_prune/test_date_function_prune.groovy            | 10 ++++++++++
 .../partition_prune/test_multi_range_partition.groovy          |  8 ++++----
 4 files changed, 26 insertions(+), 5 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
index b4fb931ec1e..3e08404d0be 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
@@ -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
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java
index 4c169658348..cb4137ba5b6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java
@@ -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;
             }
         }
diff --git 
a/regression-test/suites/nereids_rules_p0/partition_prune/test_date_function_prune.groovy
 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_date_function_prune.groovy
index 1523bbb662f..583bb48e837 100644
--- 
a/regression-test/suites/nereids_rules_p0/partition_prune/test_date_function_prune.groovy
+++ 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_date_function_prune.groovy
@@ -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)")
+    }
 }
\ No newline at end of file
diff --git 
a/regression-test/suites/nereids_rules_p0/partition_prune/test_multi_range_partition.groovy
 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_multi_range_partition.groovy
index afb10263814..b12853db8a5 100644
--- 
a/regression-test/suites/nereids_rules_p0/partition_prune/test_multi_range_partition.groovy
+++ 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_multi_range_partition.groovy
@@ -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 {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to