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