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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]