diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/RangeInference.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/RangeInference.java index 3aaf592e42dac9..3a87149fa14dfb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/RangeInference.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/RangeInference.java @@ -32,6 +32,7 @@ import org.apache.doris.nereids.trees.expressions.literal.ComparableLiteral; import org.apache.doris.nereids.trees.expressions.literal.NullLiteral; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.DataType; import org.apache.doris.nereids.util.ExpressionUtils; import com.google.common.collect.BoundType; @@ -75,9 +76,11 @@ private ValueDesc buildRange(ExpressionRewriteContext context, ComparisonPredica if (right.isNullLiteral()) { return new UnknownValue(context, predicate); } - // only handle `NumericType` and `DateLikeType` + // only handle `NumericType` and `DateLikeType` and `StringLikeType` + DataType rightDataType = right.getDataType(); if (right instanceof ComparableLiteral - && (right.getDataType().isNumericType() || right.getDataType().isDateLikeType())) { + && (rightDataType.isNumericType() || rightDataType.isDateLikeType() + || rightDataType.isStringLikeType())) { return ValueDesc.range(context, predicate); } return new UnknownValue(context, predicate); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/SimplifyRangeTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/SimplifyRangeTest.java index c4ab68e0d8495c..3a1e34deded837 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/SimplifyRangeTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/SimplifyRangeTest.java @@ -236,6 +236,8 @@ public void testSimplify() { assertRewrite("(TA + TC > 3 and TA + TC < 1) or TB < 5", "((TA + TC) is null and null) OR TB < 5"); assertRewrite("(TA + TC > 3 OR TA < 1) AND TB = 2 AND IA =1", "(TA + TC > 3 OR TA < 1) AND TB = 2 AND IA =1"); + assertRewrite("SA = '20250101' and SA < '20200101'", "SA is null and null"); + assertRewrite("SA > '20250101' and SA > '20260110'", "SA > '20260110'"); // random is non-foldable, so the two random(1, 10) are distinct, cann't merge range for them. Expression expr = rewrite("TA + random(1, 10) > 10 AND TA + random(1, 10) < 1", Maps.newHashMap());