[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.
This commit is contained in:
@ -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.
|
||||
*/
|
||||
|
||||
@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user