This is an automated email from the ASF dual-hosted git repository.

jakevin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 983f948ec4 [fix](Nereids): fix SimplifyComparisonPredicate (#24899)
983f948ec4 is described below

commit 983f948ec4a74638555d449a92bc67ffa7884be7
Author: jakevin <jakevin...@gmail.com>
AuthorDate: Tue Sep 26 14:28:03 2023 +0800

    [fix](Nereids): fix SimplifyComparisonPredicate (#24899)
    
    #16061 exist BUG, it causes wrong cast
---
 .../rules/SimplifyComparisonPredicate.java         | 71 ++++------------------
 .../rules/SimplifyComparisonPredicateTest.java     |  7 ++-
 2 files changed, 17 insertions(+), 61 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
index 5c6025f060..74627eae9f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
@@ -17,7 +17,6 @@
 
 package org.apache.doris.nereids.rules.expression.rules;
 
-import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.rules.expression.AbstractExpressionRewriteRule;
 import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
 import org.apache.doris.nereids.trees.expressions.And;
@@ -76,8 +75,14 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule {
 
     @Override
     public Expression visitComparisonPredicate(ComparisonPredicate cp, 
ExpressionRewriteContext context) {
-        Expression left = rewrite(cp.left(), context);
-        Expression right = rewrite(cp.right(), context);
+        cp = (ComparisonPredicate) visit(cp, context);
+
+        if (cp.left() instanceof Literal && !(cp.right() instanceof Literal)) {
+            cp = cp.commute();
+        }
+
+        Expression left = cp.left();
+        Expression right = cp.right();
 
         // float like type: float, double
         if (left.getDataType().isFloatLikeType() && 
right.getDataType().isFloatLikeType()) {
@@ -94,11 +99,7 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule {
             return processDateLikeTypeCoercion(cp, left, right);
         }
 
-        if (left != cp.left() || right != cp.right()) {
-            return cp.withChildren(left, right);
-        } else {
-            return cp;
-        }
+        return cp;
     }
 
     private static Expression processComparisonPredicateDateTimeV2Literal(
@@ -145,14 +146,6 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule {
     }
 
     private Expression processDateLikeTypeCoercion(ComparisonPredicate cp, 
Expression left, Expression right) {
-        Expression originalRight = right;
-        if (left instanceof DateLiteral) {
-            cp = cp.commute();
-            Expression temp = left;
-            left = right;
-            right = temp;
-        }
-
         if (left instanceof Cast && right instanceof DateLiteral) {
             Cast cast = (Cast) left;
             if (cast.child().getDataType() instanceof DateTimeType) {
@@ -164,8 +157,7 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule {
             if (cast.child().getDataType() instanceof DateTimeV2Type) {
                 if (right instanceof DateTimeV2Literal) {
                     left = cast.child();
-                    return processComparisonPredicateDateTimeV2Literal(cp, 
left,
-                            (DateTimeV2Literal) right);
+                    return processComparisonPredicateDateTimeV2Literal(cp, 
left, (DateTimeV2Literal) right);
                 }
             }
             // datetime to datev2
@@ -200,9 +192,10 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule {
             // Date cp Date is not supported in BE storage engine. So cast to 
DateTime
             left = new Cast(left, DateTimeType.INSTANCE);
             if (right instanceof DateLiteral) {
-                right = migrateLiteralToDateTime((DateLiteral) originalRight);
+                DateLiteral l = (DateLiteral) right;
+                right = new DateTimeLiteral(l.getYear(), l.getMonth(), 
l.getDay(), 0, 0, 0);
             } else {
-                right = new Cast(originalRight, DateTimeType.INSTANCE);
+                right = new Cast(right, DateTimeType.INSTANCE);
             }
         }
         if (left != cp.left() || right != cp.right()) {
@@ -214,13 +207,6 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule {
 
     private Expression processFloatLikeTypeCoercion(ComparisonPredicate 
comparisonPredicate,
             Expression left, Expression right) {
-        if (left instanceof Literal) {
-            comparisonPredicate = comparisonPredicate.commute();
-            Expression temp = left;
-            left = right;
-            right = temp;
-        }
-
         if (left instanceof Cast && 
left.child(0).getDataType().isIntegerLikeType()
                 && (right instanceof DoubleLiteral || right instanceof 
FloatLiteral)) {
             Cast cast = (Cast) left;
@@ -234,13 +220,6 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule {
 
     private Expression processDecimalV3TypeCoercion(ComparisonPredicate 
comparisonPredicate,
             Expression left, Expression right) {
-        if (left instanceof DecimalV3Literal) {
-            comparisonPredicate = comparisonPredicate.commute();
-            Expression temp = left;
-            left = right;
-            right = temp;
-        }
-
         if (left instanceof Cast && right instanceof DecimalV3Literal) {
             Cast cast = (Cast) left;
             left = cast.child();
@@ -348,30 +327,6 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule {
         }
     }
 
-    /*
-    derive tree:
-    DateLiteral
-      |
-      +--->DateTimeLiteral
-      |        |
-      |        +----->DateTimeV2Literal
-      +--->DateV2Literal
-    */
-    private Expression migrateLiteralToDateTime(DateLiteral l) {
-        if (l instanceof DateV2Literal) {
-            return new DateTimeLiteral(l.getYear(), l.getMonth(), l.getDay(), 
0, 0, 0);
-        } else if (l instanceof DateTimeV2Literal) {
-            DateTimeV2Literal dtv2 = (DateTimeV2Literal) l;
-            return new DateTimeLiteral(dtv2.getYear(), dtv2.getMonth(), 
dtv2.getDay(),
-                    dtv2.getHour(), dtv2.getMinute(), dtv2.getSecond());
-        } else if (l instanceof DateTimeLiteral) {
-            return l;
-        } else if (l instanceof DateLiteral) {
-            return new DateTimeLiteral(l.getYear(), l.getMonth(), l.getDay(), 
0, 0, 0);
-        }
-        throw new AnalysisException("cannot convert" + l.toSql() + " to 
DateTime");
-    }
-
     private Expression migrateToDateTime(DateTimeV2Literal l) {
         return new DateTimeLiteral(l.getYear(), l.getMonth(), l.getDay(), 
l.getHour(), l.getMinute(), l.getSecond());
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java
index b06d914b65..898bc2b619 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java
@@ -39,7 +39,8 @@ class SimplifyComparisonPredicateTest extends 
ExpressionRewriteTestHelper {
 
     @Test
     void testSimplifyComparisonPredicateRule() {
-        executor = new 
ExpressionRuleExecutor(ImmutableList.of(SimplifyCastRule.INSTANCE, 
SimplifyComparisonPredicate.INSTANCE));
+        executor = new ExpressionRuleExecutor(
+                ImmutableList.of(SimplifyCastRule.INSTANCE, 
SimplifyComparisonPredicate.INSTANCE));
 
         Expression dtv2 = new DateTimeV2Literal(1, 1, 1, 1, 1, 1, 0);
         Expression dt = new DateTimeLiteral(1, 1, 1, 1, 1, 1);
@@ -67,10 +68,10 @@ class SimplifyComparisonPredicateTest extends 
ExpressionRewriteTestHelper {
         // DateTimeV2 -> Date
         assertRewrite(
                 new GreaterThan(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), 
dtv2),
-                new GreaterThan(new Cast(d, DateTimeType.INSTANCE), dt));
+                new GreaterThan(new Cast(d, DateTimeType.INSTANCE), new 
DateTimeLiteral(1, 1, 1, 0, 0, 0)));
         assertRewrite(
                 new LessThan(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2),
-                new LessThan(new Cast(d, DateTimeType.INSTANCE), dt));
+                new LessThan(new Cast(d, DateTimeType.INSTANCE), new 
DateTimeLiteral(1, 1, 2, 0, 0, 0)));
         assertRewrite(
                 new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2),
                 new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2));


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to