This is an automated email from the ASF dual-hosted git repository. morrysnow 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 9ccacb40518 [Fix](Planner) add date/month/year add function fe constant fold with dateV2/dateTimeV2 (#34484) 9ccacb40518 is described below commit 9ccacb405184cc28081a7810447995732483869e Author: LiBinfeng <46676950+libinfeng...@users.noreply.github.com> AuthorDate: Fri May 10 10:58:03 2024 +0800 [Fix](Planner) add date/month/year add function fe constant fold with dateV2/dateTimeV2 (#34484) cherry-pick: #34483 Problem and Cause: In original planner, date_add function would choose different data type of datetime or datev2. Which when original planner choose datev2 as constant date type. Fe could not folding date_add function because missing of function signature of folding constant date_add(datev2, int) Solved: Add corresponding function signatures of date_add/months_add/years_add in original planner --- .../java/org/apache/doris/rewrite/FEFunctions.java | 56 ++++++++++++++++++++++ .../datetime_functions/test_date_function.groovy | 17 +++++++ 2 files changed, 73 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java index 00b15b9e0d9..57ba8876803 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java @@ -103,29 +103,85 @@ public class FEFunctions { return daysAdd(date, day); } + @FEFunction(name = "date_add", argTypes = { "DATEV2", "INT" }, returnType = "DATEV2") + public static DateLiteral dateAddDateV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { + return daysAdd(date, day); + } + + @FEFunction(name = "date_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") + public static DateLiteral dateAddDateTimeV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { + return daysAdd(date, day); + } + @FEFunction(name = "adddate", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") public static DateLiteral addDate(LiteralExpr date, LiteralExpr day) throws AnalysisException { return daysAdd(date, day); } + @FEFunction(name = "adddate", argTypes = { "DATEV2", "INT" }, returnType = "DATEV2") + public static DateLiteral addDateDateV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { + return daysAdd(date, day); + } + + @FEFunction(name = "adddate", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") + public static DateLiteral addDateDateTimeV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { + return daysAdd(date, day); + } + @FEFunction(name = "years_add", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") public static DateLiteral yearsAdd(LiteralExpr date, LiteralExpr year) throws AnalysisException { DateLiteral dateLiteral = (DateLiteral) date; return dateLiteral.plusYears((int) year.getLongValue()); } + @FEFunction(name = "years_add", argTypes = { "DATEV2", "INT" }, returnType = "DATEV2") + public static DateLiteral yearsAddDateV2(LiteralExpr date, LiteralExpr year) throws AnalysisException { + DateLiteral dateLiteral = (DateLiteral) date; + return dateLiteral.plusYears((int) year.getLongValue()); + } + + @FEFunction(name = "years_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") + public static DateLiteral yearsAddDateTimeV2(LiteralExpr date, LiteralExpr year) throws AnalysisException { + DateLiteral dateLiteral = (DateLiteral) date; + return dateLiteral.plusYears((int) year.getLongValue()); + } + @FEFunction(name = "months_add", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") public static DateLiteral monthsAdd(LiteralExpr date, LiteralExpr month) throws AnalysisException { DateLiteral dateLiteral = (DateLiteral) date; return dateLiteral.plusMonths((int) month.getLongValue()); } + @FEFunction(name = "months_add", argTypes = { "DATEV2", "INT" }, returnType = "DATEV2") + public static DateLiteral monthsAddDateV2(LiteralExpr date, LiteralExpr month) throws AnalysisException { + DateLiteral dateLiteral = (DateLiteral) date; + return dateLiteral.plusMonths((int) month.getLongValue()); + } + + @FEFunction(name = "months_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") + public static DateLiteral monthsAddDateTimeV2(LiteralExpr date, LiteralExpr month) throws AnalysisException { + DateLiteral dateLiteral = (DateLiteral) date; + return dateLiteral.plusMonths((int) month.getLongValue()); + } + @FEFunction(name = "days_add", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") public static DateLiteral daysAdd(LiteralExpr date, LiteralExpr day) throws AnalysisException { DateLiteral dateLiteral = (DateLiteral) date; return dateLiteral.plusDays((int) day.getLongValue()); } + @FEFunction(name = "days_add", argTypes = { "DATEV2", "INT" }, returnType = "DATEV2") + public static DateLiteral daysAddDateV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { + DateLiteral dateLiteral = (DateLiteral) date; + return dateLiteral.plusDays((int) day.getLongValue()); + } + + @FEFunction(name = "days_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") + public static DateLiteral daysAddDateTimeV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { + DateLiteral dateLiteral = (DateLiteral) date; + return dateLiteral.plusDays((int) day.getLongValue()); + } + @FEFunction(name = "hours_add", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") public static DateLiteral hoursAdd(LiteralExpr date, LiteralExpr hour) throws AnalysisException { DateLiteral dateLiteral = (DateLiteral) date; 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 75142d7d847..4fb29176b46 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 @@ -222,6 +222,23 @@ suite("test_date_function") { qt_sql """ select date_add(test_datetime, INTERVAL 2 MINUTE) result from ${tableName}; """ qt_sql """ select date_add(test_datetime, INTERVAL 2 SECOND) result from ${tableName}; """ + explain { + sql """select * from ${tableName} where test_datetime >= date_add('2024-01-16',INTERVAL 1 day);""" + contains "2024-01-17" + } + explain { + sql """select * from ${tableName} where test_datetime >= adddate('2024-01-16',INTERVAL 1 day);""" + contains "2024-01-17" + } + explain { + sql """select * from ${tableName} where test_datetime >= months_add('2024-01-16',1);""" + contains "2024-02-16" + } + explain { + sql """select * from ${tableName} where test_datetime >= years_add('2024-01-16',1);""" + contains "2025-01-16" + } + // DATE_FORMAT sql """ truncate table ${tableName} """ sql """ insert into ${tableName} values ("2009-10-04 22:23:00") """ --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org