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

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


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 6b74db7cdc5 [fix](nereids) fix months_add/ months_sub/ 
years_add/years_sub compute wrong result because 
SimplifyArithmeticComparisonRule (#44725) (#44812)
6b74db7cdc5 is described below

commit 6b74db7cdc5f97b019b50e8d14f23e7e18d21dc1
Author: 924060929 <[email protected]>
AuthorDate: Mon Dec 2 11:28:18 2024 +0800

    [fix](nereids) fix months_add/ months_sub/ years_add/years_sub compute 
wrong result because SimplifyArithmeticComparisonRule (#44725) (#44812)
    
    cherry pick from #44725
---
 .../expression/rules/SimplifyArithmeticComparisonRule.java    | 11 +++--------
 .../nereids/rules/expression/SimplifyArithmeticRuleTest.java  |  8 ++++----
 .../datetime_functions/test_date_function.groovy              | 11 +++++++++++
 .../datetime_functions/test_date_function.groovy              | 11 +++++++++++
 4 files changed, 29 insertions(+), 12 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java
index 6d18bc7b380..863bfd18f45 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java
@@ -32,14 +32,10 @@ import 
org.apache.doris.nereids.trees.expressions.functions.scalar.HoursAdd;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursSub;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.MinutesAdd;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.MinutesSub;
-import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthsAdd;
-import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthsSub;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondsAdd;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondsSub;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.WeeksAdd;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.WeeksSub;
-import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsAdd;
-import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsSub;
 import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.util.TypeCoercionUtils;
@@ -66,10 +62,9 @@ public class SimplifyArithmeticComparisonRule implements 
ExpressionPatternRuleFa
             .put(Add.class, Subtract.class)
             .put(Subtract.class, Add.class)
             .put(Divide.class, Multiply.class)
-            .put(YearsSub.class, YearsAdd.class)
-            .put(YearsAdd.class, YearsSub.class)
-            .put(MonthsSub.class, MonthsAdd.class)
-            .put(MonthsAdd.class, MonthsSub.class)
+            // ATTN: YearsAdd, MonthsAdd can not reverse
+            //       for example, months_add(date '2024-01-31', 1) = date 
'2024-02-29' can not reverse to
+            //       date '2024-01-31' = months_sub(date '2024-02-29', 1)
             .put(WeeksSub.class, WeeksAdd.class)
             .put(WeeksAdd.class, WeeksSub.class)
             .put(DaysSub.class, DaysAdd.class)
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/SimplifyArithmeticRuleTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/SimplifyArithmeticRuleTest.java
index 55ce93da63d..f23aefe5267 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/SimplifyArithmeticRuleTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/SimplifyArithmeticRuleTest.java
@@ -151,10 +151,10 @@ class SimplifyArithmeticRuleTest extends 
ExpressionRewriteTestHelper {
                     FoldConstantRule.INSTANCE
                 )
         ));
-        assertRewriteAfterTypeCoercion("years_add(IA, 1) > '2021-01-01 
00:00:00'", "(cast(IA as DATETIMEV2(0)) > '2020-01-01 00:00:00')");
-        assertRewriteAfterTypeCoercion("years_sub(IA, 1) > '2021-01-01 
00:00:00'", "(cast(IA as DATETIMEV2(0)) > '2022-01-01 00:00:00')");
-        assertRewriteAfterTypeCoercion("months_add(IA, 1) > '2021-01-01 
00:00:00'", "(cast(IA as DATETIMEV2(0)) > '2020-12-01 00:00:00')");
-        assertRewriteAfterTypeCoercion("months_sub(IA, 1) > '2021-01-01 
00:00:00'", "(cast(IA as DATETIMEV2(0)) > '2021-02-01 00:00:00')");
+        assertRewriteAfterTypeCoercion("years_add(IA, 1) > '2021-01-01 
00:00:00'", "(years_add(cast(IA as DATETIMEV2(0)), 1) > '2021-01-01 
00:00:00')");
+        assertRewriteAfterTypeCoercion("years_sub(IA, 1) > '2021-01-01 
00:00:00'", "(years_sub(cast(IA as DATETIMEV2(0)), 1) > '2021-01-01 
00:00:00')");
+        assertRewriteAfterTypeCoercion("months_add(IA, 1) > '2021-01-01 
00:00:00'", "(months_add(cast(IA as DATETIMEV2(0)), 1) > '2021-01-01 
00:00:00')");
+        assertRewriteAfterTypeCoercion("months_sub(IA, 1) > '2021-01-01 
00:00:00'", "(months_sub(cast(IA as DATETIMEV2(0)), 1) > '2021-01-01 
00:00:00')");
         assertRewriteAfterTypeCoercion("weeks_add(IA, 1) > '2021-01-01 
00:00:00'", "(cast(IA as DATETIMEV2(0)) > '2020-12-25 00:00:00')");
         assertRewriteAfterTypeCoercion("weeks_sub(IA, 1) > '2021-01-01 
00:00:00'", "(cast(IA as DATETIMEV2(0)) > '2021-01-08 00:00:00')");
         assertRewriteAfterTypeCoercion("days_add(IA, 1) > '2021-01-01 
00:00:00'", "(cast(IA as DATETIMEV2(0)) > '2020-12-31 00:00:00')");
diff --git 
a/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_function.groovy
 
b/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_function.groovy
index b3d18af00f0..7e115693d27 100644
--- 
a/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_function.groovy
+++ 
b/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_function.groovy
@@ -713,4 +713,15 @@ suite("test_date_function") {
 
 
     qt_sql_time_value """ select  cast(4562632 as time),  hour(cast(4562632 as 
time)) ,  minute(cast(4562632 as time)) , second(cast(4562632 as time)); """
+
+    def test_simplify = {
+        test {
+            sql "select months_add(dt, 1) = date '2024-02-29' from (select 
date '2024-01-31' as dt)a"
+            result([[true]])
+        }
+        test {
+            sql "select years_add(dt, 1) = date '2025-02-28' from (select date 
'2024-02-29' as dt)a"
+            result([[true]])
+        }
+    }()
 }
diff --git 
a/regression-test/suites/query_p0/sql_functions/datetime_functions/test_date_function.groovy
 
b/regression-test/suites/query_p0/sql_functions/datetime_functions/test_date_function.groovy
index b7504611bdb..8650beb3783 100644
--- 
a/regression-test/suites/query_p0/sql_functions/datetime_functions/test_date_function.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/datetime_functions/test_date_function.groovy
@@ -818,4 +818,15 @@ suite("test_date_function") {
     qt_sql_varchar1 """ select dt, fmt, unix_timestamp(dt, fmt) as k1 from 
date_varchar order by k1, dt, fmt; """
     qt_sql_varchar2 """ select dt, unix_timestamp(dt, "%Y-%m-%d") as k1 from 
date_varchar order by k1, dt; """
     qt_sql_varchar3 """ select fmt, unix_timestamp("1990-12-12", fmt) as k1 
from date_varchar order by k1, fmt; """
+
+    def test_simplify = {
+        test {
+            sql "select months_add(dt, 1) = date '2024-02-29' from (select 
date '2024-01-31' as dt)a"
+            result([[true]])
+        }
+        test {
+            sql "select years_add(dt, 1) = date '2025-02-28' from (select date 
'2024-02-29' as dt)a"
+            result([[true]])
+        }
+    }()
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to