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

gabriellee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 632867c1c1 [Bug](datetimev2) Fix lost precision for datetimev2 (#12723)
632867c1c1 is described below

commit 632867c1c1b611ee9855bb65132b4a8db259a611
Author: Gabriel <gabrielleeb...@gmail.com>
AuthorDate: Wed Sep 21 11:15:02 2022 +0800

    [Bug](datetimev2) Fix lost precision for datetimev2 (#12723)
---
 .../apache/doris/analysis/FunctionCallExpr.java    | 42 ++++++----
 .../datetime_functions/test_date_function.out      | 84 +++++++++++++++++++
 .../window_functions/test_window_function.out      | 24 +++---
 .../datetime_functions/test_date_function.groovy   | 94 ++++++++++++++++++----
 4 files changed, 199 insertions(+), 45 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index 8518052a77..0c55205743 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -1031,23 +1031,7 @@ public class FunctionCallExpr extends Expr {
             throw new 
AnalysisException(getFunctionNotFoundError(collectChildReturnTypes()));
         }
 
-        if (fn.getArgs().length == children.size() && fn.getArgs().length == 
1) {
-            if (fn.getArgs()[0].isDatetimeV2() && 
children.get(0).getType().isDatetimeV2()) {
-                fn.setArgType(children.get(0).getType(), 0);
-                if (fn.getReturnType().isDatetimeV2()) {
-                    fn.setReturnType(children.get(0).getType());
-                }
-            }
-        }
-
-        if 
(TIME_FUNCTIONS_WITH_PRECISION.contains(fnName.getFunction().toLowerCase())
-                && fn != null && fn.getReturnType().isDatetimeV2()) {
-            if (children.size() == 1 && children.get(0) instanceof IntLiteral) 
{
-                fn.setReturnType(ScalarType.createDatetimeV2Type((int) 
((IntLiteral) children.get(0)).getLongValue()));
-            } else if (children.size() == 1) {
-                fn.setReturnType(ScalarType.createDatetimeV2Type(6));
-            }
-        }
+        applyAutoTypeConversionForDatetimeV2();
 
         if (fnName.getFunction().equalsIgnoreCase("from_unixtime")
                 || fnName.getFunction().equalsIgnoreCase("date_format")) {
@@ -1211,6 +1195,30 @@ public class FunctionCallExpr extends Expr {
         analyzeNestedFunction();
     }
 
+    private void applyAutoTypeConversionForDatetimeV2() {
+        // Rule1: Now we treat datetimev2 with different precisions as 
different types and we only register functions
+        // for datetimev2(0). So we must apply an automatic type conversion 
from datetimev2(0) to the real type.
+        if (fn.getArgs().length == children.size() && fn.getArgs().length > 0) 
{
+            if (fn.getArgs()[0].isDatetimeV2() && 
children.get(0).getType().isDatetimeV2()) {
+                fn.setArgType(children.get(0).getType(), 0);
+                if (fn.getReturnType().isDatetimeV2()) {
+                    fn.setReturnType(children.get(0).getType());
+                }
+            }
+        }
+
+        // Rule2: For functions in TIME_FUNCTIONS_WITH_PRECISION, we can't 
figure out which function should be use when
+        // searching in FunctionSet. So we adjust the return type by hand here.
+        if 
(TIME_FUNCTIONS_WITH_PRECISION.contains(fnName.getFunction().toLowerCase())
+                && fn != null && fn.getReturnType().isDatetimeV2()) {
+            if (children.size() == 1 && children.get(0) instanceof IntLiteral) 
{
+                fn.setReturnType(ScalarType.createDatetimeV2Type((int) 
((IntLiteral) children.get(0)).getLongValue()));
+            } else if (children.size() == 1) {
+                fn.setReturnType(ScalarType.createDatetimeV2Type(6));
+            }
+        }
+    }
+
     // if return type is nested type, need to be determined the sub-element 
type
     private void analyzeNestedFunction() {
         // array
diff --git 
a/regression-test/data/query_p0/sql_functions/datetime_functions/test_date_function.out
 
b/regression-test/data/query_p0/sql_functions/datetime_functions/test_date_function.out
index 7dd6e39d9e..3d6ec78ee2 100644
--- 
a/regression-test/data/query_p0/sql_functions/datetime_functions/test_date_function.out
+++ 
b/regression-test/data/query_p0/sql_functions/datetime_functions/test_date_function.out
@@ -437,3 +437,87 @@ true
 -- !sql --
 \N
 
+-- !sql --
+2020-08-01T13:21:03.111
+
+-- !sql --
+2019-09-01T13:21:03.111
+
+-- !sql --
+2019-08-08T13:21:03.111
+
+-- !sql --
+2019-08-02T13:21:03.111
+
+-- !sql --
+2019-08-01T14:21:03.111
+
+-- !sql --
+2019-08-01T13:22:03.111
+
+-- !sql --
+2019-08-01T13:21:04.111
+
+-- !sql --
+2018-08-01T13:21:03.111
+
+-- !sql --
+2019-07-01T13:21:03.111
+
+-- !sql --
+2019-07-25T13:21:03.111
+
+-- !sql --
+2019-07-31T13:21:03.111
+
+-- !sql --
+2019-08-01T12:21:03.111
+
+-- !sql --
+2019-08-01T13:20:03.111
+
+-- !sql --
+2019-08-01T13:21:02.111
+
+-- !sql --
+2020-08-01T13:21:03.111111
+
+-- !sql --
+2019-09-01T13:21:03.111111
+
+-- !sql --
+2019-08-08T13:21:03.111111
+
+-- !sql --
+2019-08-02T13:21:03.111111
+
+-- !sql --
+2019-08-01T14:21:03.111111
+
+-- !sql --
+2019-08-01T13:22:03.111111
+
+-- !sql --
+2019-08-01T13:21:04.111111
+
+-- !sql --
+2018-08-01T13:21:03.111111
+
+-- !sql --
+2019-07-01T13:21:03.111111
+
+-- !sql --
+2019-07-25T13:21:03.111111
+
+-- !sql --
+2019-07-31T13:21:03.111111
+
+-- !sql --
+2019-08-01T12:21:03.111111
+
+-- !sql --
+2019-08-01T13:20:03.111111
+
+-- !sql --
+2019-08-01T13:21:02.111111
+
diff --git 
a/regression-test/data/query_p0/sql_functions/window_functions/test_window_function.out
 
b/regression-test/data/query_p0/sql_functions/window_functions/test_window_function.out
index 792acddd34..06c65721b0 100644
--- 
a/regression-test/data/query_p0/sql_functions/window_functions/test_window_function.out
+++ 
b/regression-test/data/query_p0/sql_functions/window_functions/test_window_function.out
@@ -90,12 +90,12 @@ JDR 2014-10-07T00:00:00.111 14.75   flat or lower
 JDR    2014-10-08T00:00:00.111 13.98   flat or lower
 
 -- !sql --
-2014-10-07T00:00
-2014-10-06T00:00
-2014-10-05T00:00
-2014-10-04T00:00
-2014-10-03T00:00
-2014-10-02T00:00
+2014-10-07T00:00:00.111
+2014-10-06T00:00:00.111
+2014-10-05T00:00:00.111
+2014-10-04T00:00:00.111
+2014-10-03T00:00:00.111
+2014-10-02T00:00:00.111
 2014-10-02T00:00
 
 -- !sql --
@@ -126,12 +126,12 @@ JDR       2014-10-07T00:00:00.111111      14.75   flat or 
lower
 JDR    2014-10-08T00:00:00.111111      13.98   flat or lower
 
 -- !sql --
-2014-10-07T00:00
-2014-10-06T00:00
-2014-10-05T00:00
-2014-10-04T00:00
-2014-10-03T00:00
-2014-10-02T00:00
+2014-10-07T00:00:00.111111
+2014-10-06T00:00:00.111111
+2014-10-05T00:00:00.111111
+2014-10-04T00:00:00.111111
+2014-10-03T00:00:00.111111
+2014-10-02T00:00:00.111111
 2014-10-02T00:00
 
 -- !sql --
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 389b778e79..d319265b16 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
@@ -318,7 +318,9 @@ suite("test_date_function") {
     sql """ DROP TABLE IF EXISTS ${tableName} """
     sql """
             CREATE TABLE IF NOT EXISTS ${tableName} (
-                test_time datetime NULL COMMENT ""
+                test_time datetime NULL COMMENT "",
+                test_time1 datetimev2(3) NULL COMMENT "",
+                test_time2 datetimev2(6) NULL COMMENT ""
             ) ENGINE=OLAP
             DUPLICATE KEY(test_time)
             COMMENT "OLAP"
@@ -329,37 +331,97 @@ suite("test_date_function") {
                 "storage_format" = "V2"
             )
         """
-    sql """ insert into ${tableName} values ("2019-08-01 13:21:03") """
-    //years_add 
+    sql """ insert into ${tableName} values ("2019-08-01 13:21:03", 
"2019-08-01 13:21:03.111", "2019-08-01 13:21:03.111111") """
+    //years_add
     qt_sql """ select years_add(test_time,1) result from ${tableName}; """
-    //months_add 
+    //months_add
     qt_sql """ select months_add(test_time,1) result from ${tableName}; """
-    //weeks_add 
+    //weeks_add
     qt_sql """ select weeks_add(test_time,1) result from ${tableName}; """
-    //days_add 
+    //days_add
     qt_sql """ select days_add(test_time,1) result from ${tableName}; """
-    //hours_add 
+    //hours_add
     qt_sql """ select hours_add(test_time,1) result from ${tableName}; """
-    //minutes_add 
+    //minutes_add
     qt_sql """ select minutes_add(test_time,1) result from ${tableName}; """
-    //seconds_add 
+    //seconds_add
     qt_sql """ select seconds_add(test_time,1) result from ${tableName}; """
 
-    //years_sub 
+    //years_sub
     qt_sql """ select years_sub(test_time,1) result from ${tableName}; """
-    //months_sub 
+    //months_sub
     qt_sql """ select months_sub(test_time,1) result from ${tableName}; """
-    //weeks_sub 
+    //weeks_sub
     qt_sql """ select weeks_sub(test_time,1) result from ${tableName}; """
-    //days_sub 
+    //days_sub
     qt_sql """ select days_sub(test_time,1) result from ${tableName}; """
-    //hours_sub 
+    //hours_sub
     qt_sql """ select hours_sub(test_time,1) result from ${tableName}; """
-    //minutes_sub 
+    //minutes_sub
     qt_sql """ select minutes_sub(test_time,1) result from ${tableName}; """
-    //seconds_sub 
+    //seconds_sub
     qt_sql """ select seconds_sub(test_time,1) result from ${tableName}; """
 
     qt_sql """ select date_add(NULL, INTERVAL 1 month); """
     qt_sql """ select date_add(NULL, INTERVAL 1 day); """
+
+    //years_add
+    qt_sql """ select years_add(test_time1,1) result from ${tableName}; """
+    //months_add
+    qt_sql """ select months_add(test_time1,1) result from ${tableName}; """
+    //weeks_add
+    qt_sql """ select weeks_add(test_time1,1) result from ${tableName}; """
+    //days_add
+    qt_sql """ select days_add(test_time1,1) result from ${tableName}; """
+    //hours_add
+    qt_sql """ select hours_add(test_time1,1) result from ${tableName}; """
+    //minutes_add
+    qt_sql """ select minutes_add(test_time1,1) result from ${tableName}; """
+    //seconds_add
+    qt_sql """ select seconds_add(test_time1,1) result from ${tableName}; """
+
+    //years_sub
+    qt_sql """ select years_sub(test_time1,1) result from ${tableName}; """
+    //months_sub
+    qt_sql """ select months_sub(test_time1,1) result from ${tableName}; """
+    //weeks_sub
+    qt_sql """ select weeks_sub(test_time1,1) result from ${tableName}; """
+    //days_sub
+    qt_sql """ select days_sub(test_time1,1) result from ${tableName}; """
+    //hours_sub
+    qt_sql """ select hours_sub(test_time1,1) result from ${tableName}; """
+    //minutes_sub
+    qt_sql """ select minutes_sub(test_time1,1) result from ${tableName}; """
+    //seconds_sub
+    qt_sql """ select seconds_sub(test_time1,1) result from ${tableName}; """
+
+    //years_add
+    qt_sql """ select years_add(test_time2,1) result from ${tableName}; """
+    //months_add
+    qt_sql """ select months_add(test_time2,1) result from ${tableName}; """
+    //weeks_add
+    qt_sql """ select weeks_add(test_time2,1) result from ${tableName}; """
+    //days_add
+    qt_sql """ select days_add(test_time2,1) result from ${tableName}; """
+    //hours_add
+    qt_sql """ select hours_add(test_time2,1) result from ${tableName}; """
+    //minutes_add
+    qt_sql """ select minutes_add(test_time2,1) result from ${tableName}; """
+    //seconds_add
+    qt_sql """ select seconds_add(test_time2,1) result from ${tableName}; """
+
+    //years_sub
+    qt_sql """ select years_sub(test_time2,1) result from ${tableName}; """
+    //months_sub
+    qt_sql """ select months_sub(test_time2,1) result from ${tableName}; """
+    //weeks_sub
+    qt_sql """ select weeks_sub(test_time2,1) result from ${tableName}; """
+    //days_sub
+    qt_sql """ select days_sub(test_time2,1) result from ${tableName}; """
+    //hours_sub
+    qt_sql """ select hours_sub(test_time2,1) result from ${tableName}; """
+    //minutes_sub
+    qt_sql """ select minutes_sub(test_time2,1) result from ${tableName}; """
+    //seconds_sub
+    qt_sql """ select seconds_sub(test_time2,1) result from ${tableName}; """
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to