This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new fd06d8623e3 [fix](nereids)SimplifyRange didn't process NULL value
correctly #32854 (#33030)
fd06d8623e3 is described below
commit fd06d8623e37ab468812564ccf110619bbbca57e
Author: starocean999 <[email protected]>
AuthorDate: Tue Apr 2 22:07:47 2024 +0800
[fix](nereids)SimplifyRange didn't process NULL value correctly #32854
(#33030)
---
.../nereids/rules/expression/rules/SimplifyRange.java | 10 ++++++++++
.../nereids/rules/expression/SimplifyRangeTest.java | 17 +++++++++++++++++
2 files changed, 27 insertions(+)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
index b5193e77375..2c673aabd23 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
@@ -98,6 +98,16 @@ public class SimplifyRange extends
AbstractExpressionRewriteRule {
private ValueDesc buildRange(ComparisonPredicate predicate) {
Expression rewrite = ExpressionRuleExecutor.normalize(predicate);
Expression right = rewrite.child(1);
+ if (right.isNullLiteral()) {
+ // it's safe to return empty value if >, >=, <, <= and = with
null
+ if ((predicate instanceof GreaterThan || predicate instanceof
GreaterThanEqual
+ || predicate instanceof LessThan || predicate
instanceof LessThanEqual
+ || predicate instanceof EqualTo)) {
+ return new EmptyValue(rewrite.child(0), rewrite);
+ } else {
+ return new UnknownValue(predicate);
+ }
+ }
// only handle `NumericType`
if (right.isLiteral() && right.getDataType().isNumericType()) {
return ValueDesc.range((ComparisonPredicate) rewrite);
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 175a300eb1d..74843a26b21 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
@@ -21,6 +21,7 @@ import org.apache.doris.nereids.CascadesContext;
import org.apache.doris.nereids.analyzer.UnboundRelation;
import org.apache.doris.nereids.analyzer.UnboundSlot;
import org.apache.doris.nereids.parser.NereidsParser;
+import org.apache.doris.nereids.rules.expression.rules.FunctionBinder;
import org.apache.doris.nereids.rules.expression.rules.SimplifyRange;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Slot;
@@ -60,6 +61,16 @@ public class SimplifyRangeTest {
public void testSimplify() {
executor = new
ExpressionRuleExecutor(ImmutableList.of(SimplifyRange.INSTANCE));
assertRewrite("TA", "TA");
+ assertRewrite("TA > 3 or TA > null", "TA > 3");
+ assertRewrite("TA > 3 or TA < null", "TA > 3");
+ assertRewrite("TA > 3 or TA = null", "TA > 3");
+ assertRewrite("TA > 3 or TA <> null", "TA > 3 or TA <> null");
+ assertRewrite("TA > 3 or TA <=> null", "TA > 3 or TA <=> null");
+ assertRewrite("TA > 3 and TA > null", "false");
+ assertRewrite("TA > 3 and TA < null", "false");
+ assertRewrite("TA > 3 and TA = null", "false");
+ assertRewrite("TA > 3 and TA <> null", "TA > 3 and TA <> null");
+ assertRewrite("TA > 3 and TA <=> null", "TA > 3 and TA <=> null");
assertRewrite("(TA >= 1 and TA <=3 ) or (TA > 5 and TA < 7)", "(TA >=
1 and TA <=3 ) or (TA > 5 and TA < 7)");
assertRewrite("(TA > 3 and TA < 1) or (TA > 7 and TA < 5)", "FALSE");
assertRewrite("TA > 3 and TA < 1", "FALSE");
@@ -112,7 +123,9 @@ public class SimplifyRangeTest {
private void assertRewrite(String expression, String expected) {
Map<String, Slot> mem = Maps.newHashMap();
Expression needRewriteExpression =
replaceUnboundSlot(PARSER.parseExpression(expression), mem);
+ needRewriteExpression = typeCoercion(needRewriteExpression);
Expression expectedExpression =
replaceUnboundSlot(PARSER.parseExpression(expected), mem);
+ expectedExpression = typeCoercion(expectedExpression);
Expression rewrittenExpression =
executor.rewrite(needRewriteExpression, context);
Assertions.assertEquals(expectedExpression, rewrittenExpression);
}
@@ -161,6 +174,10 @@ public class SimplifyRangeTest {
return hasNewChildren ? expression.withChildren(children) : expression;
}
+ protected Expression typeCoercion(Expression expression) {
+ return FunctionBinder.INSTANCE.rewrite(expression, null);
+ }
+
private DataType getType(char t) {
switch (t) {
case 'T':
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]