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

starocean999 pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new ecdd44e1422 branch-3.0: [fix](nereids) fix compare with date like 
literal #45382 (#45596)
ecdd44e1422 is described below

commit ecdd44e1422551c6b9950d77b64797789db9ead8
Author: yujun <yu...@selectdb.com>
AuthorDate: Thu Dec 19 09:56:41 2024 +0800

    branch-3.0: [fix](nereids) fix compare with date like literal #45382 
(#45596)
    
    cherry pick from #45382
---
 .../rules/SimplifyComparisonPredicate.java         | 152 +++++++++------------
 .../apache/doris/nereids/util/ExpressionUtils.java |  16 +++
 .../rules/SimplifyComparisonPredicateTest.java     | 102 +++++++++++++-
 .../infer_predicate/pull_up_predicate_literal.out  |   2 +-
 .../pull_up_predicate_literal.groovy               |   2 +-
 5 files changed, 184 insertions(+), 90 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 55cd74c0839..215df7add75 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
@@ -21,14 +21,12 @@ import 
org.apache.doris.nereids.rules.expression.AbstractExpressionRewriteRule;
 import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
 import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
 import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
-import org.apache.doris.nereids.trees.expressions.And;
 import org.apache.doris.nereids.trees.expressions.Cast;
 import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
 import org.apache.doris.nereids.trees.expressions.EqualTo;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.GreaterThan;
 import org.apache.doris.nereids.trees.expressions.GreaterThanEqual;
-import org.apache.doris.nereids.trees.expressions.IsNull;
 import org.apache.doris.nereids.trees.expressions.LessThan;
 import org.apache.doris.nereids.trees.expressions.LessThanEqual;
 import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
@@ -44,16 +42,16 @@ import 
org.apache.doris.nereids.trees.expressions.literal.FloatLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.IntegerLikeLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
-import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.SmallIntLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.TinyIntLiteral;
-import org.apache.doris.nereids.types.BooleanType;
+import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.DateTimeType;
 import org.apache.doris.nereids.types.DateTimeV2Type;
 import org.apache.doris.nereids.types.DateType;
 import org.apache.doris.nereids.types.DateV2Type;
 import org.apache.doris.nereids.types.DecimalV3Type;
 import org.apache.doris.nereids.types.coercion.DateLikeType;
+import org.apache.doris.nereids.util.ExpressionUtils;
 import org.apache.doris.nereids.util.TypeCoercionUtils;
 
 import com.google.common.base.Preconditions;
@@ -71,12 +69,6 @@ import java.util.List;
 public class SimplifyComparisonPredicate extends AbstractExpressionRewriteRule 
implements ExpressionPatternRuleFactory {
     public static SimplifyComparisonPredicate INSTANCE = new 
SimplifyComparisonPredicate();
 
-    enum AdjustType {
-        LOWER,
-        UPPER,
-        NONE
-    }
-
     @Override
     public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
         return ImmutableList.of(
@@ -116,77 +108,83 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule i
         return cp;
     }
 
-    private static Expression processComparisonPredicateDateTimeV2Literal(
+    private static Expression 
processDateTimeLikeComparisonPredicateDateTimeV2Literal(
             ComparisonPredicate comparisonPredicate, Expression left, 
DateTimeV2Literal right) {
-        DateTimeV2Type leftType = (DateTimeV2Type) left.getDataType();
+        DataType leftType = left.getDataType();
+        int toScale = 0;
+        if (leftType instanceof DateTimeType) {
+            toScale = 0;
+        } else if (leftType instanceof DateTimeV2Type) {
+            toScale = ((DateTimeV2Type) leftType).getScale();
+        } else {
+            return comparisonPredicate;
+        }
         DateTimeV2Type rightType = right.getDataType();
-        if (leftType.getScale() < rightType.getScale()) {
-            int toScale = leftType.getScale();
+        if (toScale < rightType.getScale()) {
             if (comparisonPredicate instanceof EqualTo) {
                 long originValue = right.getMicroSecond();
                 right = right.roundCeiling(toScale);
-                if (right.getMicroSecond() == originValue) {
-                    return comparisonPredicate.withChildren(left, right);
-                } else {
-                    if (left.nullable()) {
-                        // TODO: the ideal way is to return an If expr like:
-                        // return new If(new IsNull(left), new 
NullLiteral(BooleanType.INSTANCE),
-                        // BooleanLiteral.of(false));
-                        // but current fold constant rule can't handle such 
complex expr with null literal
-                        // before supporting complex conjuncts with null 
literal folding rules,
-                        // we use a trick way like this:
-                        return new And(new IsNull(left), new 
NullLiteral(BooleanType.INSTANCE));
-                    } else {
-                        return BooleanLiteral.of(false);
-                    }
+                if (right.getMicroSecond() != originValue) {
+                    // TODO: the ideal way is to return an If expr like:
+                    // return new If(new IsNull(left), new 
NullLiteral(BooleanType.INSTANCE),
+                    // BooleanLiteral.of(false));
+                    // but current fold constant rule can't handle such 
complex expr with null literal
+                    // before supporting complex conjuncts with null literal 
folding rules,
+                    // we use a trick way like this:
+                    return ExpressionUtils.falseOrNull(left);
                 }
             } else if (comparisonPredicate instanceof NullSafeEqual) {
                 long originValue = right.getMicroSecond();
                 right = right.roundCeiling(toScale);
-                if (right.getMicroSecond() == originValue) {
-                    return comparisonPredicate.withChildren(left, right);
-                } else {
+                if (right.getMicroSecond() != originValue) {
                     return BooleanLiteral.of(false);
                 }
             } else if (comparisonPredicate instanceof GreaterThan
                     || comparisonPredicate instanceof LessThanEqual) {
-                return comparisonPredicate.withChildren(left, 
right.roundFloor(toScale));
+                right = right.roundFloor(toScale);
             } else if (comparisonPredicate instanceof LessThan
                     || comparisonPredicate instanceof GreaterThanEqual) {
-                return comparisonPredicate.withChildren(left, 
right.roundCeiling(toScale));
+                right = right.roundCeiling(toScale);
+            } else {
+                return comparisonPredicate;
+            }
+            Expression newRight = leftType instanceof DateTimeType ? 
migrateToDateTime(right) : right;
+            return comparisonPredicate.withChildren(left, newRight);
+        } else {
+            if (leftType instanceof DateTimeType) {
+                return comparisonPredicate.withChildren(left, 
migrateToDateTime(right));
+            } else {
+                return comparisonPredicate;
             }
         }
-        return comparisonPredicate;
     }
 
     private static Expression processDateLikeTypeCoercion(ComparisonPredicate 
cp, Expression left, Expression right) {
         if (left instanceof Cast && right instanceof DateLiteral) {
             Cast cast = (Cast) left;
-            if (cast.child().getDataType() instanceof DateTimeType) {
+            if (cast.child().getDataType() instanceof DateTimeType
+                    || cast.child().getDataType() instanceof DateTimeV2Type) {
                 if (right instanceof DateTimeV2Literal) {
-                    left = cast.child();
-                    right = migrateToDateTime((DateTimeV2Literal) right);
-                }
-            }
-            if (cast.child().getDataType() instanceof DateTimeV2Type) {
-                if (right instanceof DateTimeV2Literal) {
-                    left = cast.child();
-                    return processComparisonPredicateDateTimeV2Literal(cp, 
left, (DateTimeV2Literal) right);
+                    return 
processDateTimeLikeComparisonPredicateDateTimeV2Literal(
+                            cp, cast.child(), (DateTimeV2Literal) right);
                 }
             }
+
             // datetime to datev2
             if (cast.child().getDataType() instanceof DateType || 
cast.child().getDataType() instanceof DateV2Type) {
                 if (right instanceof DateTimeLiteral) {
-                    if (cannotAdjust((DateTimeLiteral) right, cp)) {
-                        return cp;
-                    }
-                    AdjustType type = AdjustType.NONE;
-                    if (cp instanceof GreaterThanEqual || cp instanceof 
LessThan) {
-                        type = AdjustType.UPPER;
-                    } else if (cp instanceof GreaterThan || cp instanceof 
LessThanEqual) {
-                        type = AdjustType.LOWER;
+                    DateTimeLiteral dateTimeLiteral = (DateTimeLiteral) right;
+                    right = migrateToDateV2(dateTimeLiteral);
+                    if (dateTimeLiteral.getHour() != 0 || 
dateTimeLiteral.getMinute() != 0
+                            || dateTimeLiteral.getSecond() != 0) {
+                        if (cp instanceof EqualTo) {
+                            return ExpressionUtils.falseOrNull(cast.child());
+                        } else if (cp instanceof NullSafeEqual) {
+                            return BooleanLiteral.FALSE;
+                        } else if (cp instanceof GreaterThanEqual || cp 
instanceof LessThan) {
+                            right = ((DateV2Literal) right).plusDays(1);
+                        }
                     }
-                    right = migrateToDateV2((DateTimeLiteral) right, type);
                     if (cast.child().getDataType() instanceof DateV2Type) {
                         left = cast.child();
                     }
@@ -239,18 +237,13 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule i
                                     comparisonPredicate.withChildren(left, new 
DecimalV3Literal(
                                             
literal.getValue().setScale(toScale, RoundingMode.UNNECESSARY))));
                         } catch (ArithmeticException e) {
-                            if (left.nullable()) {
-                                // TODO: the ideal way is to return an If expr 
like:
-                                // return new If(new IsNull(left), new 
NullLiteral(BooleanType.INSTANCE),
-                                // BooleanLiteral.of(false));
-                                // but current fold constant rule can't handle 
such complex expr with null literal
-                                // before supporting complex conjuncts with 
null literal folding rules,
-                                // we use a trick way like this:
-                                return new And(new IsNull(left),
-                                        new NullLiteral(BooleanType.INSTANCE));
-                            } else {
-                                return BooleanLiteral.of(false);
-                            }
+                            // TODO: the ideal way is to return an If expr 
like:
+                            // return new If(new IsNull(left), new 
NullLiteral(BooleanType.INSTANCE),
+                            // BooleanLiteral.of(false));
+                            // but current fold constant rule can't handle 
such complex expr with null literal
+                            // before supporting complex conjuncts with null 
literal folding rules,
+                            // we use a trick way like this:
+                            return ExpressionUtils.falseOrNull(left);
                         }
                     } else if (comparisonPredicate instanceof NullSafeEqual) {
                         try {
@@ -286,17 +279,13 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule i
             literal = literal.stripTrailingZeros();
             if (literal.scale() > 0) {
                 if (comparisonPredicate instanceof EqualTo) {
-                    if (left.nullable()) {
-                        // TODO: the ideal way is to return an If expr like:
-                        // return new If(new IsNull(left), new 
NullLiteral(BooleanType.INSTANCE),
-                        // BooleanLiteral.of(false));
-                        // but current fold constant rule can't handle such 
complex expr with null literal
-                        // before supporting complex conjuncts with null 
literal folding rules,
-                        // we use a trick way like this:
-                        return new And(new IsNull(left), new 
NullLiteral(BooleanType.INSTANCE));
-                    } else {
-                        return BooleanLiteral.of(false);
-                    }
+                    // TODO: the ideal way is to return an If expr like:
+                    // return new If(new IsNull(left), new 
NullLiteral(BooleanType.INSTANCE),
+                    // BooleanLiteral.of(false));
+                    // but current fold constant rule can't handle such 
complex expr with null literal
+                    // before supporting complex conjuncts with null literal 
folding rules,
+                    // we use a trick way like this:
+                    return ExpressionUtils.falseOrNull(left);
                 } else if (comparisonPredicate instanceof NullSafeEqual) {
                     return BooleanLiteral.of(false);
                 } else if (comparisonPredicate instanceof GreaterThan
@@ -342,17 +331,8 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule i
         return new DateTimeLiteral(l.getYear(), l.getMonth(), l.getDay(), 
l.getHour(), l.getMinute(), l.getSecond());
     }
 
-    private static boolean cannotAdjust(DateTimeLiteral l, ComparisonPredicate 
cp) {
-        return cp instanceof EqualTo && (l.getHour() != 0 || l.getMinute() != 
0 || l.getSecond() != 0);
-    }
-
-    private static Expression migrateToDateV2(DateTimeLiteral l, AdjustType 
type) {
-        DateV2Literal d = new DateV2Literal(l.getYear(), l.getMonth(), 
l.getDay());
-        if (type == AdjustType.UPPER && (l.getHour() != 0 || l.getMinute() != 
0 || l.getSecond() != 0)) {
-            return d.plusDays(1);
-        } else {
-            return d;
-        }
+    private static Expression migrateToDateV2(DateTimeLiteral l) {
+        return new DateV2Literal(l.getYear(), l.getMonth(), l.getDay());
     }
 
     private static Expression migrateToDate(DateV2Literal l) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
index b303fd2a6b5..f5b96345810 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
@@ -198,6 +198,22 @@ public class ExpressionUtils {
         return combineAsLeftDeepTree(Or.class, expressions);
     }
 
+    public static Expression falseOrNull(Expression expression) {
+        if (expression.nullable()) {
+            return new And(new IsNull(expression), new 
NullLiteral(BooleanType.INSTANCE));
+        } else {
+            return BooleanLiteral.FALSE;
+        }
+    }
+
+    public static Expression trueOrNull(Expression expression) {
+        if (expression.nullable()) {
+            return new Or(new Not(new IsNull(expression)), new 
NullLiteral(BooleanType.INSTANCE));
+        } else {
+            return BooleanLiteral.TRUE;
+        }
+    }
+
     /**
      * Use AND/OR to combine expressions together.
      */
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 84ebd7c7250..db95b705b0d 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
@@ -40,9 +40,13 @@ import 
org.apache.doris.nereids.trees.expressions.literal.DecimalV3Literal;
 import org.apache.doris.nereids.trees.expressions.literal.DoubleLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
 import org.apache.doris.nereids.types.BooleanType;
+import org.apache.doris.nereids.types.DateTimeType;
 import org.apache.doris.nereids.types.DateTimeV2Type;
+import org.apache.doris.nereids.types.DateType;
+import org.apache.doris.nereids.types.DateV2Type;
 import org.apache.doris.nereids.types.DecimalV3Type;
 import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.collect.ImmutableList;
 import org.junit.jupiter.api.Assertions;
@@ -81,11 +85,11 @@ class SimplifyComparisonPredicateTest extends 
ExpressionRewriteTestHelper {
                 new LessThan(dv2, dv2PlusOne));
         assertRewrite(
                 new EqualTo(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), 
dtv2),
-                new EqualTo(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), 
dtv2));
+                BooleanLiteral.FALSE);
 
         assertRewrite(
                 new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2),
-                new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2));
+                BooleanLiteral.FALSE);
 
         // test hour, minute and second all zero
         Expression dtv2AtZeroClock = new DateTimeV2Literal(1, 1, 1, 0, 0, 0, 
0);
@@ -126,6 +130,100 @@ class SimplifyComparisonPredicateTest extends 
ExpressionRewriteTestHelper {
         expression = new GreaterThan(left, right);
         rewrittenExpression = executor.rewrite(typeCoercion(expression), 
context);
         Assertions.assertEquals(dt.getDataType(), 
rewrittenExpression.child(0).getDataType());
+
+        Expression date = new SlotReference("a", DateV2Type.INSTANCE);
+        Expression datev1 = new SlotReference("a", DateType.INSTANCE);
+        Expression datetime0 = new SlotReference("a", DateTimeV2Type.of(0));
+        Expression datetime2 = new SlotReference("a", DateTimeV2Type.of(2));
+        Expression datetimev1 = new SlotReference("a", DateTimeType.INSTANCE);
+
+        // date
+        // cast (date as datetimev1) cmp datetimev1
+        assertRewrite(new EqualTo(new Cast(date, DateTimeType.INSTANCE), new 
DateTimeLiteral("2020-01-01 00:00:00")),
+                new EqualTo(date, new DateV2Literal("2020-01-01")));
+        assertRewrite(new EqualTo(new Cast(date, DateTimeType.INSTANCE), new 
DateTimeLiteral("2020-01-01 00:00:01")),
+                ExpressionUtils.falseOrNull(date));
+        assertRewrite(new NullSafeEqual(new Cast(date, DateTimeType.INSTANCE), 
new DateTimeLiteral("2020-01-01 00:00:01")),
+                BooleanLiteral.FALSE);
+        assertRewrite(new GreaterThan(new Cast(date, DateTimeType.INSTANCE), 
new DateTimeLiteral("2020-01-01 00:00:01")),
+                new GreaterThan(date, new DateV2Literal("2020-01-01")));
+        assertRewrite(new GreaterThanEqual(new Cast(date, 
DateTimeType.INSTANCE), new DateTimeLiteral("2020-01-01 00:00:01")),
+                new GreaterThanEqual(date, new DateV2Literal("2020-01-02")));
+        assertRewrite(new LessThan(new Cast(date, DateTimeType.INSTANCE), new 
DateTimeLiteral("2020-01-01 00:00:01")),
+                new LessThan(date, new DateV2Literal("2020-01-02")));
+        assertRewrite(new LessThanEqual(new Cast(date, DateTimeType.INSTANCE), 
new DateTimeLiteral("2020-01-01 00:00:01")),
+                new LessThanEqual(date, new DateV2Literal("2020-01-01")));
+        // cast (date as datev1) = datev1-literal
+        // assertRewrite(new EqualTo(new Cast(date, DateType.INSTANCE), new 
DateLiteral("2020-01-01")),
+        //        new EqualTo(date, new DateV2Literal("2020-01-01")));
+        // assertRewrite(new GreaterThan(new Cast(date, DateType.INSTANCE), 
new DateLiteral("2020-01-01")),
+        //        new GreaterThan(date, new DateV2Literal("2020-01-01")));
+
+        // cast (datev1 as datetimev1) cmp datetimev1
+        assertRewrite(new EqualTo(new Cast(datev1, DateTimeType.INSTANCE), new 
DateTimeLiteral("2020-01-01 00:00:00")),
+                new EqualTo(datev1, new DateLiteral("2020-01-01")));
+        assertRewrite(new EqualTo(new Cast(datev1, DateTimeType.INSTANCE), new 
DateTimeLiteral("2020-01-01 00:00:01")),
+                ExpressionUtils.falseOrNull(datev1));
+        assertRewrite(new NullSafeEqual(new Cast(datev1, 
DateTimeType.INSTANCE), new DateTimeLiteral("2020-01-01 00:00:01")),
+                BooleanLiteral.FALSE);
+        assertRewrite(new GreaterThan(new Cast(datev1, DateTimeType.INSTANCE), 
new DateTimeLiteral("2020-01-01 00:00:01")),
+                new GreaterThan(datev1, new DateLiteral("2020-01-01")));
+        assertRewrite(new GreaterThanEqual(new Cast(datev1, 
DateTimeType.INSTANCE), new DateTimeLiteral("2020-01-01 00:00:01")),
+                new GreaterThanEqual(datev1, new DateLiteral("2020-01-02")));
+        assertRewrite(new LessThan(new Cast(datev1, DateTimeType.INSTANCE), 
new DateTimeLiteral("2020-01-01 00:00:01")),
+                new LessThan(datev1, new DateLiteral("2020-01-02")));
+        assertRewrite(new LessThanEqual(new Cast(datev1, 
DateTimeType.INSTANCE), new DateTimeLiteral("2020-01-01 00:00:01")),
+                new LessThanEqual(datev1, new DateLiteral("2020-01-01")));
+        assertRewrite(new EqualTo(new Cast(datev1, DateV2Type.INSTANCE), new 
DateV2Literal("2020-01-01")),
+                new EqualTo(datev1, new DateLiteral("2020-01-01")));
+        assertRewrite(new GreaterThan(new Cast(datev1, DateV2Type.INSTANCE), 
new DateV2Literal("2020-01-01")),
+                new GreaterThan(datev1, new DateLiteral("2020-01-01")));
+
+        // cast (datetimev1 as datetime) cmp datetime
+        assertRewrite(new EqualTo(new Cast(datetimev1, DateTimeV2Type.of(0)), 
new DateTimeV2Literal("2020-01-01 00:00:00")),
+                new EqualTo(datetimev1, new DateTimeLiteral("2020-01-01 
00:00:00")));
+        assertRewrite(new GreaterThan(new Cast(datetimev1, 
DateTimeV2Type.of(0)), new DateTimeV2Literal("2020-01-01 00:00:00")),
+                new GreaterThan(datetimev1, new DateTimeLiteral("2020-01-01 
00:00:00")));
+        assertRewrite(new EqualTo(new Cast(datetimev1, DateTimeV2Type.of(2)), 
new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                ExpressionUtils.falseOrNull(datetimev1));
+        assertRewrite(new NullSafeEqual(new Cast(datetimev1, 
DateTimeV2Type.of(2)), new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                BooleanLiteral.FALSE);
+        assertRewrite(new GreaterThan(new Cast(datetimev1, 
DateTimeV2Type.of(2)), new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                new GreaterThan(datetimev1, new DateTimeLiteral("2020-01-01 
00:00:00")));
+        assertRewrite(new GreaterThanEqual(new Cast(datetimev1, 
DateTimeV2Type.of(2)), new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                new GreaterThanEqual(datetimev1, new 
DateTimeLiteral("2020-01-01 00:00:01")));
+        assertRewrite(new LessThan(new Cast(datetimev1, DateTimeV2Type.of(2)), 
new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                new LessThan(datetimev1, new DateTimeLiteral("2020-01-01 
00:00:01")));
+        assertRewrite(new LessThanEqual(new Cast(datetimev1, 
DateTimeV2Type.of(2)), new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                new LessThanEqual(datetimev1, new DateTimeLiteral("2020-01-01 
00:00:00")));
+
+        // cast (datetime0 as datetime) cmp datetime
+        assertRewrite(new EqualTo(new Cast(datetime0, DateTimeV2Type.of(2)), 
new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                ExpressionUtils.falseOrNull(datetime0));
+        assertRewrite(new NullSafeEqual(new Cast(datetime0, 
DateTimeV2Type.of(2)), new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                BooleanLiteral.FALSE);
+        assertRewrite(new GreaterThan(new Cast(datetime0, 
DateTimeV2Type.of(2)), new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                new GreaterThan(datetime0, new DateTimeV2Literal("2020-01-01 
00:00:00")));
+        assertRewrite(new GreaterThanEqual(new Cast(datetime0, 
DateTimeV2Type.of(2)), new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                new GreaterThanEqual(datetime0, new 
DateTimeV2Literal("2020-01-01 00:00:01")));
+        assertRewrite(new LessThan(new Cast(datetime0, DateTimeV2Type.of(2)), 
new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                new LessThan(datetime0, new DateTimeV2Literal("2020-01-01 
00:00:01")));
+        assertRewrite(new LessThanEqual(new Cast(datetime0, 
DateTimeV2Type.of(2)), new DateTimeV2Literal("2020-01-01 00:00:00.12")),
+                new LessThanEqual(datetime0, new DateTimeV2Literal("2020-01-01 
00:00:00")));
+
+        // cast (datetime2 as datetime) cmp datetime
+        assertRewrite(new EqualTo(new Cast(datetime2, DateTimeV2Type.of(3)), 
new DateTimeV2Literal("2020-01-01 00:00:00.123")),
+                ExpressionUtils.falseOrNull(datetime2));
+        assertRewrite(new NullSafeEqual(new Cast(datetime2, 
DateTimeV2Type.of(3)), new DateTimeV2Literal("2020-01-01 00:00:00.123")),
+                BooleanLiteral.FALSE);
+        assertRewrite(new GreaterThan(new Cast(datetime2, 
DateTimeV2Type.of(3)), new DateTimeV2Literal("2020-01-01 00:00:00.123")),
+                new GreaterThan(datetime2, new DateTimeV2Literal("2020-01-01 
00:00:00.12")));
+        assertRewrite(new GreaterThanEqual(new Cast(datetime2, 
DateTimeV2Type.of(3)), new DateTimeV2Literal("2020-01-01 00:00:00.123")),
+                new GreaterThanEqual(datetime2, new 
DateTimeV2Literal("2020-01-01 00:00:00.13")));
+        assertRewrite(new LessThan(new Cast(datetime2, DateTimeV2Type.of(3)), 
new DateTimeV2Literal("2020-01-01 00:00:00.123")),
+                new LessThan(datetime2, new DateTimeV2Literal("2020-01-01 
00:00:00.13")));
+        assertRewrite(new LessThanEqual(new Cast(datetime2, 
DateTimeV2Type.of(3)), new DateTimeV2Literal("2020-01-01 00:00:00.123")),
+                new LessThanEqual(datetime2, new DateTimeV2Literal("2020-01-01 
00:00:00.12")));
     }
 
     @Test
diff --git 
a/regression-test/data/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.out
 
b/regression-test/data/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.out
index 524559cabeb..08dee815c3f 100644
--- 
a/regression-test/data/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.out
+++ 
b/regression-test/data/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.out
@@ -1616,7 +1616,7 @@ PhysicalResultSink
 ----------PhysicalProject
 ------------PhysicalStorageLayerAggregate[test_pull_up_predicate_literal]
 ------PhysicalProject
---------filter((cast(d_date as DATETIMEV2(0)) = '2024-08-02 10:10:00'))
+--------filter((t2.d_date = '2024-08-02'))
 ----------PhysicalOlapScan[test_types]
 
 -- !const_value_and_join_column_type170 --
diff --git 
a/regression-test/suites/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.groovy
 
b/regression-test/suites/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.groovy
index 06998e0e438..bf0d6e74420 100644
--- 
a/regression-test/suites/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.groovy
+++ 
b/regression-test/suites/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.groovy
@@ -997,7 +997,7 @@ select c1 from (select
     qt_const_value_and_join_column_type169 """
 explain shape plan
 select c1 from (select 
-'2024-08-02 10:10:00.123332' as c1 from test_pull_up_predicate_literal limit 
10) t inner join test_types t2 on d_date=t.c1"""
+'2024-08-02 00:00:00.000000' as c1 from test_pull_up_predicate_literal limit 
10) t inner join test_types t2 on d_date=t.c1"""
 
     qt_const_value_and_join_column_type170 """
 explain shape plan


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

Reply via email to