From 1a6b90c3b7973ed74837d7e533e381dc990db4b3 Mon Sep 17 00:00:00 2001 From: LiBinfeng <1204975323@qq.com> Date: Mon, 13 May 2024 15:37:22 +0800 Subject: [PATCH 1/2] [Fix](Planner) fix date_xxx functions without complete function signature --- .../org/apache/doris/rewrite/FEFunctions.java | 68 +++++++++++++++++++ .../test_date_function.groovy | 45 ++++++++++++ 2 files changed, 113 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 57ba8876803d27..f3c3f7498aaeff 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,6 +103,11 @@ public static DateLiteral dateAdd(LiteralExpr date, LiteralExpr day) throws Anal return daysAdd(date, day); } + @FEFunction(name = "date_add", argTypes = { "DATE", "INT" }, returnType = "DATE") + public static DateLiteral dateAddDate(LiteralExpr date, LiteralExpr day) throws AnalysisException { + 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); @@ -134,6 +139,12 @@ public static DateLiteral yearsAdd(LiteralExpr date, LiteralExpr year) throws An return dateLiteral.plusYears((int) year.getLongValue()); } + @FEFunction(name = "years_add", argTypes = { "DATE", "INT" }, returnType = "DATE") + public static DateLiteral yearsAddDate(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; @@ -152,6 +163,12 @@ public static DateLiteral monthsAdd(LiteralExpr date, LiteralExpr month) throws return dateLiteral.plusMonths((int) month.getLongValue()); } + @FEFunction(name = "months_add", argTypes = { "DATE", "INT" }, returnType = "DATE") + public static DateLiteral monthsAddDate(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; @@ -170,6 +187,12 @@ public static DateLiteral daysAdd(LiteralExpr date, LiteralExpr day) throws Anal return dateLiteral.plusDays((int) day.getLongValue()); } + @FEFunction(name = "days_add", argTypes = { "DATE", "INT" }, returnType = "DATE") + public static DateLiteral daysAddDate(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; @@ -223,26 +246,71 @@ public static DateLiteral dateSub(LiteralExpr date, LiteralExpr day) throws Anal return dateAdd(date, new IntLiteral(-(int) day.getLongValue())); } + @FEFunction(name = "date_sub", argTypes = { "DATE", "INT" }, returnType = "DATE") + public static DateLiteral dateSubDate(LiteralExpr date, LiteralExpr day) throws AnalysisException { + return daysAdd(date, new IntLiteral(-(int) day.getLongValue())); + } + @FEFunction(name = "date_sub", argTypes = { "DATEV2", "INT" }, returnType = "DATEV2") public static DateLiteral dateSubDateV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { return dateAdd(date, new IntLiteral(-(int) day.getLongValue())); } + @FEFunction(name = "date_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") + public static DateLiteral dateSubDateTimeV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { + return daysAdd(date, new IntLiteral(-(int) day.getLongValue())); + } + @FEFunction(name = "years_sub", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") public static DateLiteral yearsSub(LiteralExpr date, LiteralExpr year) throws AnalysisException { return yearsAdd(date, new IntLiteral(-(int) year.getLongValue())); } + @FEFunction(name = "years_sub", argTypes = { "DATE", "INT" }, returnType = "DATE") + public static DateLiteral yearsSubDate(LiteralExpr date, LiteralExpr year) throws AnalysisException { + return yearsAdd(date, new IntLiteral(-(int) year.getLongValue())); + } + + @FEFunction(name = "years_sub", argTypes = { "DATEV2", "INT" }, returnType = "DATEV2") + public static DateLiteral yearsSubDateV2(LiteralExpr date, LiteralExpr year) throws AnalysisException { + return yearsAdd(date, new IntLiteral(-(int) year.getLongValue())); + } + + @FEFunction(name = "years_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") + public static DateLiteral yearsSubDateTimeV2(LiteralExpr date, LiteralExpr year) throws AnalysisException { + return yearsAdd(date, new IntLiteral(-(int) year.getLongValue())); + } + @FEFunction(name = "months_sub", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") public static DateLiteral monthsSub(LiteralExpr date, LiteralExpr month) throws AnalysisException { return monthsAdd(date, new IntLiteral(-(int) month.getLongValue())); } + @FEFunction(name = "months_sub", argTypes = { "DATE", "INT" }, returnType = "DATE") + public static DateLiteral monthsSubDate(LiteralExpr date, LiteralExpr month) throws AnalysisException { + return yearsAdd(date, new IntLiteral(-(int) month.getLongValue())); + } + + @FEFunction(name = "months_sub", argTypes = { "DATEV2", "INT" }, returnType = "DATEV2") + public static DateLiteral monthsSubDateV2(LiteralExpr date, LiteralExpr month) throws AnalysisException { + return yearsAdd(date, new IntLiteral(-(int) month.getLongValue())); + } + + @FEFunction(name = "months_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") + public static DateLiteral monthsSubDateTimeV2(LiteralExpr date, LiteralExpr month) throws AnalysisException { + return yearsAdd(date, new IntLiteral(-(int) month.getLongValue())); + } + @FEFunction(name = "days_sub", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") public static DateLiteral daysSub(LiteralExpr date, LiteralExpr day) throws AnalysisException { return daysAdd(date, new IntLiteral(-(int) day.getLongValue())); } + @FEFunction(name = "days_sub", argTypes = { "DATE", "INT" }, returnType = "DATE") + public static DateLiteral daysSubDate(LiteralExpr date, LiteralExpr day) throws AnalysisException { + return daysAdd(date, new IntLiteral(-(int) day.getLongValue())); + } + @FEFunction(name = "days_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") public static DateLiteral daysSubDateTimeV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { return daysAdd(date, new IntLiteral(-(int) day.getLongValue())); 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 4fb29176b46bd5..b6f1fea75dbd97 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 @@ -239,6 +239,51 @@ suite("test_date_function") { contains "2025-01-16" } + explain { + sql """select * from ${tableName} where test_datetime >= date_sub('2024-01-16',INTERVAL 1 day);""" + contains "2024-01-15" + } + + explain { + sql """select * from ${tableName} where test_datetime >= months_sub('2024-02-16',1);""" + contains "2024-01-16" + } + explain { + sql """select * from ${tableName} where test_datetime >= years_sub('2024-01-16',1);""" + contains "2023-01-16" + } + + explain { + sql """select * from ${tableName} where test_datetime >= date_add(cast('2024-01-16' as DATE),INTERVAL 1 day);""" + contains "2024-01-17" + } + explain { + sql """select * from ${tableName} where test_datetime >= adddate(cast('2024-01-16' as DATE),INTERVAL 1 day);""" + contains "2024-01-17" + } + explain { + sql """select * from ${tableName} where test_datetime >= months_add(cast('2024-01-16' as DATE),1);""" + contains "2024-02-16" + } + explain { + sql """select * from ${tableName} where test_datetime >= years_add(cast('2024-01-16' as DATE),1);""" + contains "2025-01-16" + } + + explain { + sql """select * from ${tableName} where test_datetime >= date_sub(cast('2024-01-16' as DATE),INTERVAL 1 day);""" + contains "2024-01-15" + } + + explain { + sql """select * from ${tableName} where test_datetime >= months_sub(cast('2024-02-16' as DATE),1);""" + contains "2024-01-16" + } + explain { + sql """select * from ${tableName} where test_datetime >= years_sub(cast('2024-01-16' as DATE),1);""" + contains "2023-01-16" + } + // DATE_FORMAT sql """ truncate table ${tableName} """ sql """ insert into ${tableName} values ("2009-10-04 22:23:00") """ From 03e7ef98b43128dc6915e4e395fbb50b8ced5b23 Mon Sep 17 00:00:00 2001 From: LiBinfeng <1204975323@qq.com> Date: Tue, 14 May 2024 10:44:48 +0800 Subject: [PATCH 2/2] fix_comment --- .../src/main/java/org/apache/doris/rewrite/FEFunctions.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 f3c3f7498aaeff..e34bbe16a7b484 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 @@ -288,17 +288,17 @@ public static DateLiteral monthsSub(LiteralExpr date, LiteralExpr month) throws @FEFunction(name = "months_sub", argTypes = { "DATE", "INT" }, returnType = "DATE") public static DateLiteral monthsSubDate(LiteralExpr date, LiteralExpr month) throws AnalysisException { - return yearsAdd(date, new IntLiteral(-(int) month.getLongValue())); + return monthsAdd(date, new IntLiteral(-(int) month.getLongValue())); } @FEFunction(name = "months_sub", argTypes = { "DATEV2", "INT" }, returnType = "DATEV2") public static DateLiteral monthsSubDateV2(LiteralExpr date, LiteralExpr month) throws AnalysisException { - return yearsAdd(date, new IntLiteral(-(int) month.getLongValue())); + return monthsAdd(date, new IntLiteral(-(int) month.getLongValue())); } @FEFunction(name = "months_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIMEV2") public static DateLiteral monthsSubDateTimeV2(LiteralExpr date, LiteralExpr month) throws AnalysisException { - return yearsAdd(date, new IntLiteral(-(int) month.getLongValue())); + return monthsAdd(date, new IntLiteral(-(int) month.getLongValue())); } @FEFunction(name = "days_sub", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME")