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 3e08404d0b..e6c2d92c8e 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 @@ -396,11 +396,12 @@ public class OneRangePartitionEvaluator if (inPredicate.getCompareExpr() instanceof Slot && inPredicate.getOptions().stream().allMatch(Literal.class::isInstance)) { Slot slot = (Slot) inPredicate.getCompareExpr(); - ColumnRange unionLiteralRange = inPredicate.getOptions() - .stream() - .map(Literal.class::cast) - .map(ColumnRange::singleton) - .reduce(ColumnRange.empty(), ColumnRange::union); + ColumnRange unionLiteralRange = ColumnRange.empty(); + ColumnRange slotRange = result.childrenResult.get(0).columnRanges.get(slot); + for (Expression expr : inPredicate.getOptions()) { + unionLiteralRange = unionLiteralRange.union( + slotRange.intersect(ColumnRange.singleton((Literal) expr))); + } Map slotRanges = result.childrenResult.get(0).columnRanges; result = intersectSlotRange(result, slotRanges, slot, unionLiteralRange); } 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 cb4137ba5b..6089cf31a6 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 @@ -113,6 +113,7 @@ public class PartitionPruner extends DefaultExpressionRewriter { partitionTableType)) .collect(ImmutableList.toImmutableList()); + partitionPredicate = OrToIn.INSTANCE.rewrite(partitionPredicate, null); PartitionPruner partitionPruner = new PartitionPruner(evaluators, partitionPredicate); //TODO: we keep default partition because it's too hard to prune it, we return false in canPrune(). return partitionPruner.prune();