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

Reply via email to