From 5ddf50b82233437932ba05ce5ed92dc1a00ce9ac Mon Sep 17 00:00:00 2001 From: 924060929 Date: Thu, 28 Nov 2024 14:57:18 +0800 Subject: [PATCH 1/7] fix --- .../rules/SimplifyArithmeticComparisonRule.java | 11 +++-------- .../datetime_functions/test_date_function.groovy | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 8 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 6d18bc7b3807a6..0315fce8a1a160 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.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: YearsSub, MonthsSub 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('2024-02-29') .put(WeeksSub.class, WeeksAdd.class) .put(WeeksAdd.class, WeeksSub.class) .put(DaysSub.class, DaysAdd.class) 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 511f2bc35a67a7..5056c599f92866 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,19 @@ 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_varchar1 """ select dt, unix_timestamp(dt, "%Y-%m-%d") as k1 from date_varchar order by k1,dt,fmt; """ qt_sql_varchar1 """ select fmt, unix_timestamp("1990-12-12", fmt) as k1 from date_varchar order by k1,dt,fmt; """ + + + + def test_simplify = { + sql "drop table if exists test_int_date" + sql "create table test_int_date(dt int) distributed by hash(dt) properties('replication_num'='1');" + 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]]) + } + }() } From 57c10393d7bfe86ab0a35e3fa6c8385993b81b93 Mon Sep 17 00:00:00 2001 From: 924060929 Date: Thu, 28 Nov 2024 15:07:57 +0800 Subject: [PATCH 2/7] fix --- .../datetime_functions/test_date_function.groovy | 13 +++++++++++++ .../datetime_functions/test_date_function.groovy | 15 --------------- 2 files changed, 13 insertions(+), 15 deletions(-) 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 5bde4423253744..b7a3b7a4da7e77 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 @@ -720,4 +720,17 @@ 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 = { + sql "drop table if exists test_int_date" + sql "create table test_int_date(dt int) distributed by hash(dt) properties('replication_num'='1');" + 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 5056c599f92866..511f2bc35a67a7 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,19 +818,4 @@ 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_varchar1 """ select dt, unix_timestamp(dt, "%Y-%m-%d") as k1 from date_varchar order by k1,dt,fmt; """ qt_sql_varchar1 """ select fmt, unix_timestamp("1990-12-12", fmt) as k1 from date_varchar order by k1,dt,fmt; """ - - - - def test_simplify = { - sql "drop table if exists test_int_date" - sql "create table test_int_date(dt int) distributed by hash(dt) properties('replication_num'='1');" - 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]]) - } - }() } From 50687606098ea41b6320842301c5eea83a134b10 Mon Sep 17 00:00:00 2001 From: 924060929 Date: Thu, 28 Nov 2024 15:09:00 +0800 Subject: [PATCH 3/7] fix --- .../datetime_functions/test_date_function.groovy | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 511f2bc35a67a7..a5c87ab941b564 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,17 @@ 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_varchar1 """ select dt, unix_timestamp(dt, "%Y-%m-%d") as k1 from date_varchar order by k1,dt,fmt; """ qt_sql_varchar1 """ select fmt, unix_timestamp("1990-12-12", fmt) as k1 from date_varchar order by k1,dt,fmt; """ + + def test_simplify = { + sql "drop table if exists test_int_date" + sql "create table test_int_date(dt int) distributed by hash(dt) properties('replication_num'='1');" + 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]]) + } + }() } From be1c0c6b14f79461c3415d5322aa8d128312d382 Mon Sep 17 00:00:00 2001 From: 924060929 Date: Thu, 28 Nov 2024 15:12:54 +0800 Subject: [PATCH 4/7] fix --- .../expression/rules/SimplifyArithmeticComparisonRule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 0315fce8a1a160..772464f7ea756c 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 @@ -62,9 +62,9 @@ public class SimplifyArithmeticComparisonRule implements ExpressionPatternRuleFa .put(Add.class, Subtract.class) .put(Subtract.class, Add.class) .put(Divide.class, Multiply.class) - // ATTN: YearsSub, MonthsSub can not reverse + // 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('2024-02-29') + // date '2024-01-31' = months_sub('2024-02-29', 1) .put(WeeksSub.class, WeeksAdd.class) .put(WeeksAdd.class, WeeksSub.class) .put(DaysSub.class, DaysAdd.class) From a2d795dd7098e27209d42f31203d3b9255c1156b Mon Sep 17 00:00:00 2001 From: 924060929 Date: Thu, 28 Nov 2024 15:13:26 +0800 Subject: [PATCH 5/7] fix --- .../expression/rules/SimplifyArithmeticComparisonRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 772464f7ea756c..863bfd18f458fd 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 @@ -64,7 +64,7 @@ public class SimplifyArithmeticComparisonRule implements ExpressionPatternRuleFa .put(Divide.class, Multiply.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('2024-02-29', 1) + // 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) From 53f6021580182e9e90959de46cf89eb9084a0b2e Mon Sep 17 00:00:00 2001 From: 924060929 Date: Thu, 28 Nov 2024 15:14:55 +0800 Subject: [PATCH 6/7] fix --- .../sql_functions/datetime_functions/test_date_function.groovy | 2 -- .../sql_functions/datetime_functions/test_date_function.groovy | 2 -- 2 files changed, 4 deletions(-) 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 b7a3b7a4da7e77..bdd92166f7e686 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 @@ -722,8 +722,6 @@ 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 = { - sql "drop table if exists test_int_date" - sql "create table test_int_date(dt int) distributed by hash(dt) properties('replication_num'='1');" test { sql "select months_add(dt, 1) = date '2024-02-29' from (select date '2024-01-31' 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 a5c87ab941b564..8bd43dae685afc 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 @@ -820,8 +820,6 @@ suite("test_date_function") { qt_sql_varchar1 """ select fmt, unix_timestamp("1990-12-12", fmt) as k1 from date_varchar order by k1,dt,fmt; """ def test_simplify = { - sql "drop table if exists test_int_date" - sql "create table test_int_date(dt int) distributed by hash(dt) properties('replication_num'='1');" test { sql "select months_add(dt, 1) = date '2024-02-29' from (select date '2024-01-31' as dt)a" result([[true]]) From 9e82b4a85b5936cb1f4adacf6a30ecd0ee91a34f Mon Sep 17 00:00:00 2001 From: 924060929 Date: Thu, 28 Nov 2024 15:44:24 +0800 Subject: [PATCH 7/7] fix --- .../rules/expression/SimplifyArithmeticRuleTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 55ce93da63d5aa..f23aefe5267c1a 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 @@ void testSimplifyDateTimeComparison() { 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')");