This is an automated email from the ASF dual-hosted git repository. kxiao 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 f3efaaff251 [Fix](functions) Fix bug in makedate and str_to_date functions #34583 (#35400) f3efaaff251 is described below commit f3efaaff2510efdff6de9642c2eecaec46dbda32 Author: Kang <kxiao.ti...@gmail.com> AuthorDate: Sun May 26 20:23:41 2024 +0800 [Fix](functions) Fix bug in makedate and str_to_date functions #34583 (#35400) --- .../functions/executable/DateTimeExtractAndTransform.java | 6 ++++-- .../java/org/apache/doris/nereids/util/DateUtils.java | 15 ++++++++++++++- .../datetime_functions/test_date_function.out | 5 ++++- .../datetime_functions/test_date_function.groovy | 3 ++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java index e458b975475..0a282281cd5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java @@ -30,6 +30,7 @@ import org.apache.doris.nereids.trees.expressions.literal.NullLiteral; import org.apache.doris.nereids.trees.expressions.literal.SmallIntLiteral; import org.apache.doris.nereids.trees.expressions.literal.TinyIntLiteral; import org.apache.doris.nereids.trees.expressions.literal.VarcharLiteral; +import org.apache.doris.nereids.types.DateType; import org.apache.doris.nereids.types.VarcharType; import org.apache.doris.nereids.util.DateUtils; @@ -563,8 +564,9 @@ public class DateTimeExtractAndTransform { */ @ExecFunction(name = "makedate", argTypes = {"INT", "INT"}, returnType = "DATE") public static Expression makeDate(IntegerLiteral year, IntegerLiteral dayOfYear) { - return DateLiteral.fromJavaDateType(LocalDateTime.of(year.getValue(), 1, 1, 0, 0, 0) - .plusDays(dayOfYear.getValue() - 1)); + int day = dayOfYear.getValue(); + return day > 0 ? DateLiteral.fromJavaDateType(LocalDateTime.of(year.getValue(), 1, 1, 0, 0, 0) + .plusDays(day - 1)) : new NullLiteral(DateType.INSTANCE); } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java index 70f25b25fc5..354d78d0271 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java @@ -163,7 +163,7 @@ public class DateUtils { getOrDefault(accessor, ChronoField.YEAR), getOrDefault(accessor, ChronoField.MONTH_OF_YEAR), getOrDefault(accessor, ChronoField.DAY_OF_MONTH), - getOrDefault(accessor, ChronoField.HOUR_OF_DAY), + getHourOrDefault(accessor), getOrDefault(accessor, ChronoField.MINUTE_OF_HOUR), getOrDefault(accessor, ChronoField.SECOND_OF_MINUTE), getOrDefault(accessor, ChronoField.NANO_OF_SECOND)); @@ -173,6 +173,19 @@ public class DateUtils { return accessor.isSupported(field) ? accessor.get(field) : /* default value */ 0; } + /** + * get hour from accessor, if not support hour field, return 0 + */ + public static int getHourOrDefault(final TemporalAccessor accessor) { + if (accessor.isSupported(ChronoField.HOUR_OF_DAY)) { + return accessor.get(ChronoField.HOUR_OF_DAY); + } else if (accessor.isSupported(ChronoField.HOUR_OF_AMPM)) { + return accessor.get(ChronoField.HOUR_OF_AMPM); + } else { + return 0; + } + } + public static ZoneId getTimeZone() { if (ConnectContext.get() == null || ConnectContext.get().getSessionVariable() == null) { return ZoneId.systemDefault(); 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 ff0cde4324d..46931a3dd97 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 @@ -237,7 +237,7 @@ Saturday 0 -- !sql -- -2021-01-01 2021-04-10 2022-02-04 +\N 2021-01-01 2021-04-10 2022-02-04 -- !sql -- 59 @@ -275,6 +275,9 @@ February -- !sql -- 2014-12-21T12:34:56 +-- !sql -- +2011-11-09 11:09:30 + -- !sql -- 2014-12-21T12:34:56.789 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 b6f1fea75db..216f703c320 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 @@ -362,7 +362,7 @@ suite("test_date_function") { qt_sql """ select hour('2018-12-31') """ // MAKEDATE - qt_sql """ select makedate(2021,1), makedate(2021,100), makedate(2021,400) """ + qt_sql """ select makedate(2021,0), makedate(2021,1), makedate(2021,100), makedate(2021,400) """ // MINUTE qt_sql """ select minute('2018-12-31 23:59:59') """ @@ -393,6 +393,7 @@ suite("test_date_function") { qt_sql """ select str_to_date(test_datetime, '%Y-%m-%d %H:%i:%s') from ${tableName}; """ qt_sql """ select str_to_date("", "%Y-%m-%d %H:%i:%s"); """ qt_sql """ select str_to_date("2014-12-21 12:34%3A56", '%Y-%m-%d %H:%i%%3A%s'); """ + qt_sql """ select str_to_date('11.09.2011 11:09:30', '%m.%d.%Y %h:%i:%s'); """ qt_sql """ select str_to_date("2014-12-21 12:34:56.789 PM", '%Y-%m-%d %h:%i:%s.%f %p'); """ qt_sql """ select str_to_date('2023-07-05T02:09:55.880Z','%Y-%m-%dT%H:%i:%s.%fZ') """ qt_sql """ select str_to_date('200442 Monday', '%X%V %W') """ --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org