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

starocean999 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 f2cfc87aca1 [fix](nereids) temporary partition is selected only if 
user manually specified  (#27893)
f2cfc87aca1 is described below

commit f2cfc87aca19af0b3895b2d3f388ba2d4f8ec995
Author: minghong <engle...@gmail.com>
AuthorDate: Mon Dec 4 09:44:27 2023 +0800

    [fix](nereids) temporary partition is selected only if user manually 
specified  (#27893)
    
    q1: "select * from ut_p temporary partitions(tp1) where val > 0"
    in q1, temporary partition tp1 is scaned
    
    q2: "select * from ut_p where val > 0"
    in q2, temporary partition tp1 is not scaned.
---
 .../rules/expression/rules/PartitionPruner.java    | 10 -------
 .../rules/rewrite/PruneOlapScanPartition.java      | 18 ++++++++----
 .../data/nereids_syntax_p0/select_partition.out    |  2 +-
 .../nereids_syntax_p0/select_partition.groovy      | 34 +++++++++++++++++++---
 4 files changed, 43 insertions(+), 21 deletions(-)

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 a0336295476..ae3a5add083 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
@@ -18,7 +18,6 @@
 package org.apache.doris.nereids.rules.expression.rules;
 
 import org.apache.doris.catalog.ListPartitionItem;
-import org.apache.doris.catalog.PartitionInfo;
 import org.apache.doris.catalog.PartitionItem;
 import org.apache.doris.catalog.RangePartitionItem;
 import org.apache.doris.nereids.CascadesContext;
@@ -98,15 +97,6 @@ public class PartitionPruner extends 
DefaultExpressionRewriter<Void> {
                 .collect(ImmutableList.toImmutableList());
     }
 
-    /**
-     * prune partition with `partitionInfo` as parameter.
-     */
-    public static List<Long> prune(List<Slot> partitionSlots, Expression 
partitionPredicate,
-            PartitionInfo partitionInfo, CascadesContext cascadesContext, 
PartitionTableType partitionTableType) {
-        return prune(partitionSlots, partitionPredicate, 
partitionInfo.getAllPartitions(), cascadesContext,
-                partitionTableType);
-    }
-
     /**
      * prune partition with `idToPartitions` as parameter.
      */
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PruneOlapScanPartition.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PruneOlapScanPartition.java
index db183d66389..e9e59f1c113 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PruneOlapScanPartition.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PruneOlapScanPartition.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.rewrite;
 
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.PartitionInfo;
+import org.apache.doris.catalog.PartitionItem;
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.rules.expression.rules.PartitionPruner;
@@ -31,7 +32,6 @@ import org.apache.doris.nereids.util.Utils;
 import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.commons.collections.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -66,15 +66,21 @@ public class PruneOlapScanPartition extends 
OneRewriteRuleFactory {
                     .stream()
                     .map(column -> 
scanOutput.get(column.getName().toLowerCase()))
                     .collect(Collectors.toList());
+            List<Long> manuallySpecifiedPartitions = 
scan.getManuallySpecifiedPartitions();
 
+            Map<Long, PartitionItem> idToPartitions;
+            if (manuallySpecifiedPartitions.isEmpty()) {
+                idToPartitions = partitionInfo.getIdToItem(false);
+            } else {
+                Map<Long, PartitionItem> allPartitions = 
partitionInfo.getAllPartitions();
+                idToPartitions = allPartitions.keySet().stream()
+                        .filter(id -> manuallySpecifiedPartitions.contains(id))
+                        .collect(Collectors.toMap(Function.identity(), id -> 
allPartitions.get(id)));
+            }
             List<Long> prunedPartitions = new 
ArrayList<>(PartitionPruner.prune(
-                    partitionSlots, filter.getPredicate(), partitionInfo, 
ctx.cascadesContext,
+                    partitionSlots, filter.getPredicate(), idToPartitions, 
ctx.cascadesContext,
                     PartitionTableType.OLAP));
 
-            List<Long> manuallySpecifiedPartitions = 
scan.getManuallySpecifiedPartitions();
-            if (!CollectionUtils.isEmpty(manuallySpecifiedPartitions)) {
-                prunedPartitions.retainAll(manuallySpecifiedPartitions);
-            }
             if (prunedPartitions.isEmpty()) {
                 return new LogicalEmptyRelation(
                         
ConnectContext.get().getStatementContext().getNextRelationId(),
diff --git a/regression-test/data/nereids_syntax_p0/select_partition.out 
b/regression-test/data/nereids_syntax_p0/select_partition.out
index e49bb9ea3d9..6ca642b594a 100644
--- a/regression-test/data/nereids_syntax_p0/select_partition.out
+++ b/regression-test/data/nereids_syntax_p0/select_partition.out
@@ -25,5 +25,5 @@
 1      aaa     aaa
 
 -- !sql --
-16     1234    t
+6      1234    t
 
diff --git a/regression-test/suites/nereids_syntax_p0/select_partition.groovy 
b/regression-test/suites/nereids_syntax_p0/select_partition.groovy
index 8b438b228c2..f5697a6f3b4 100644
--- a/regression-test/suites/nereids_syntax_p0/select_partition.groovy
+++ b/regression-test/suites/nereids_syntax_p0/select_partition.groovy
@@ -89,6 +89,7 @@ suite("query_on_specific_partition") {
         SELECT * FROM test_iot PARTITION p1;
     """
 
+// temporary partition test
     sql """
             DROP TABLE IF EXISTS ut_p;
         """
@@ -110,14 +111,39 @@ suite("query_on_specific_partition") {
         );
     """
 
-    sql """ALTER TABLE ut_p ADD TEMPORARY PARTITION tp1 VALUES [("15"), 
("20"));"""
+    sql """ALTER TABLE ut_p ADD TEMPORARY PARTITION tp1 VALUES [("5"), 
("7"));"""
 
-    sql "INSERT INTO ut_p TEMPORARY PARTITION(tp1) values(16,1234, 't');"
+    sql "INSERT INTO ut_p TEMPORARY PARTITION(tp1) values(6,1234, 't');"
+    sql "INSERT INTO ut_p values(6,1234, 't');"
+    sql "INSERT INTO ut_p values(3,1234, 't');"
 
+    sql "set enable_nereids_planner=true"
     sql "SET enable_fallback_to_original_planner=false"
 
     qt_sql """select * from ut_p temporary partitions(tp1);"""
 
-
-    
+    explain {
+        sql "select * from ut_p temporary partitions(tp1);"
+        contains "partitions=1/2 (tp1)"
+    }
+
+    explain {
+        sql "select * from ut_p temporary partitions(tp1) where val > 0"
+        contains "partitions=1/2 (tp1)"
+    }
+
+    explain {
+        sql "select * from ut_p temporary partitions(tp1) where val > 0"
+        contains "partitions=1/2 (tp1)"
+    }
+
+    explain {
+        sql "select * from ut_p partitions(p2) where val > 0"
+        contains "partitions=1/2 (p2)"
+    }
+
+    explain {
+        sql "select * from ut_p temporary partitions(tp1) where id = 8"
+        contains "VEMPTYSET"
+    }    
 }


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

Reply via email to