diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/ListPartitionPruner.java b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/ListPartitionPruner.java index 3c9c86c4f8c46a..25a9fbd4f99994 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/ListPartitionPruner.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/ListPartitionPruner.java @@ -417,6 +417,13 @@ private Set evalInPredicate(InPredicateOperator inPredicate) { Set matches = Sets.newHashSet(); ConcurrentNavigableMap> partitionValueMap = columnToPartitionValuesMap.get(child); Set nullPartitions = columnToNullPartitions.get(child); + + if (inPredicate.getChild(0) instanceof CastOperator && partitionValueMap != null) { + // partitionValueMap need cast to target type + partitionValueMap = getCastPartitionValueMap((CastOperator) inPredicate.getChild(0), + partitionValueMap); + } + if (partitionValueMap == null || nullPartitions == null || partitionValueMap.isEmpty()) { return null; } diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rule/ListPartitionPrunerTest.java b/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rule/ListPartitionPrunerTest.java index 064a8a9096a995..401bc909af7fa2 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rule/ListPartitionPrunerTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rule/ListPartitionPrunerTest.java @@ -442,6 +442,36 @@ public void testExternalTableBinaryPredicateWithException() throws AnalysisExcep Assert.assertNull(pruner.prune()); } + @Test + public void testStringCastInPredicate() throws AnalysisException { + // string_col="1" 1 + // string_col="2" 2 + // string_col="3" 3 + + ColumnRefOperator stringColumn = new ColumnRefOperator(1, Type.STRING, "string_col", true); + + // column -> partition values + Map>> columnToPartitionValuesMap = + Maps.newConcurrentMap(); + ConcurrentNavigableMap> stringPartitionValuesMap = new ConcurrentSkipListMap<>(); + columnToPartitionValuesMap.put(stringColumn, stringPartitionValuesMap); + stringPartitionValuesMap.put(new StringLiteral("1"), Sets.newHashSet(1L)); + stringPartitionValuesMap.put(new StringLiteral("2"), Sets.newHashSet(2L)); + stringPartitionValuesMap.put(new StringLiteral("3"), Sets.newHashSet(3L)); + + Map> columnToNullPartitions = Maps.newHashMap(); + columnToNullPartitions.put(stringColumn, Sets.newHashSet(9L)); + + List conjuncts = Lists.newArrayList(); + ListPartitionPruner pruner = + new ListPartitionPruner(columnToPartitionValuesMap, columnToNullPartitions, conjuncts, null); + conjuncts.clear(); + conjuncts.add(new InPredicateOperator(new CastOperator(Type.INT, stringColumn), + ConstantOperator.createInt(2), + ConstantOperator.createInt(3))); + Assert.assertEquals(2, pruner.prune().size()); + } + @Test public void testSpecifyPartition() throws AnalysisException { // 2 partition columns