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