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

Reply via email to