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

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 79a6496bb6d [branch-2.1](function) fix wrong result when convert_tz is 
out of bound (#37358) (#38313)
79a6496bb6d is described below

commit 79a6496bb6d319abcd15d09a853a729175e9a56d
Author: zclllhhjj <[email protected]>
AuthorDate: Thu Jul 25 11:32:44 2024 +0800

    [branch-2.1](function) fix wrong result when convert_tz is out of bound 
(#37358) (#38313)
    
    ## Proposed changes
    
    pick https://github.com/apache/doris/pull/37358
    
    before:
    ```sql
    mysql> select CONVERT_TZ(cast('0000-01-01 00:00:00.00001'  as DATETIMEV1), 
cast('Asia/Shanghai' as VARCHAR(65533)), cast('America/Los_Angeles' as 
VARCHAR(65533)));
    
+---------------------------------------------------------------------------------------------------------------------------------------------------+
    | convert_tz(cast('0000-01-01 00:00:00.00001' as DATETIME), 
cast('Asia/Shanghai' as VARCHAR(65533)), cast('America/Los_Angeles' as 
VARCHAR(65533))) |
    
+---------------------------------------------------------------------------------------------------------------------------------------------------+
    | q535-12-31 08:01:19                                                       
                                                                        |
    
+---------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.12 sec)
    ```
    now:
    ```sql
    mysql> select CONVERT_TZ(cast('0000-01-01 00:00:00.00001'  as DATETIMEV1), 
cast('Asia/Shanghai' as VARCHAR(65533)), cast('America/Los_Angeles' as 
VARCHAR(65533)));
    
+---------------------------------------------------------------------------------------------------------------------------------------------------+
    | convert_tz(cast('0000-01-01 00:00:00.00001' as DATETIME), 
cast('Asia/Shanghai' as VARCHAR(65533)), cast('America/Los_Angeles' as 
VARCHAR(65533))) |
    
+---------------------------------------------------------------------------------------------------------------------------------------------------+
    | NULL                                                                      
                                                                        |
    
+---------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.09 sec)
    ```
---
 be/src/vec/functions/function_convert_tz.h         | 14 ++++-----
 be/test/vec/function/function_time_test.cpp        | 34 +++++-----------------
 .../datetime_functions/test_date_function.out      |  6 ++++
 .../datetime_functions/test_date_function.groovy   |  2 ++
 4 files changed, 23 insertions(+), 33 deletions(-)

diff --git a/be/src/vec/functions/function_convert_tz.h 
b/be/src/vec/functions/function_convert_tz.h
index bfd261640c1..bbcc09e911b 100644
--- a/be/src/vec/functions/function_convert_tz.h
+++ b/be/src/vec/functions/function_convert_tz.h
@@ -18,19 +18,15 @@
 #pragma once
 
 #include <cctz/time_zone.h>
-#include <stddef.h>
-#include <stdint.h>
 
+#include <cstddef>
 #include <cstdint>
-#include <map>
 #include <memory>
 #include <string>
 #include <type_traits>
 #include <utility>
 
 #include "common/status.h"
-#include "runtime/exec_env.h"
-#include "runtime/runtime_state.h"
 #include "udf/udf.h"
 #include "util/binary_cast.hpp"
 #include "util/datetype_cast.hpp"
@@ -54,7 +50,6 @@
 #include "vec/data_types/data_type_string.h"
 #include "vec/data_types/data_type_time_v2.h"
 #include "vec/functions/function.h"
-#include "vec/io/io_helper.h"
 #include "vec/runtime/vdatetime_value.h"
 namespace doris::vectorized {
 
@@ -187,7 +182,6 @@ private:
             result_column->insert_default();
             return;
         }
-
         if (!TimezoneUtils::find_cctz_time_zone(to_tz_name, to_tz)) {
             result_null_map[index_now] = true;
             result_column->insert_default();
@@ -213,6 +207,12 @@ private:
             ts_value2.from_unixtime(timestamp, to_tz);
         }
 
+        if (!ts_value2.is_valid_date()) [[unlikely]] {
+            result_null_map[index_now] = true;
+            result_column->insert_default();
+            return;
+        }
+
         result_column->insert(binary_cast<ReturnDateValueType, 
ReturnNativeType>(ts_value2));
     }
 };
diff --git a/be/test/vec/function/function_time_test.cpp 
b/be/test/vec/function/function_time_test.cpp
index 78bc0df6ea9..0ba7a3398a4 100644
--- a/be/test/vec/function/function_time_test.cpp
+++ b/be/test/vec/function/function_time_test.cpp
@@ -203,43 +203,26 @@ TEST(VTimestampFunctionsTest, timediff_test) {
 }
 
 TEST(VTimestampFunctionsTest, convert_tz_test) {
-    GTEST_SKIP() << "Skip temporarily. need fix";
     std::string func_name = "convert_tz";
 
     TimezoneUtils::clear_timezone_caches();
+    TimezoneUtils::load_timezones_to_cache();
 
     InputTypeSet input_types = {TypeIndex::DateTimeV2, TypeIndex::String, 
TypeIndex::String};
 
-    bool case_sensitive = true;
-    cctz::time_zone tz {};
-    if (TimezoneUtils::find_cctz_time_zone("Asia/SHANGHAI", tz)) {
-        case_sensitive = false;
-    }
-
-    if (case_sensitive) {
-        DataSet data_set = {{{std::string {"2019-08-01 02:18:27"}, std::string 
{"Asia/SHANGHAI"},
-                              std::string {"america/Los_angeles"}},
-                             Null()}};
-        static_cast<void>(
-                check_function<DataTypeDateTimeV2, true>(func_name, 
input_types, data_set, false));
-    }
-
     {
         DataSet data_set = {{{std::string {"2019-08-01 02:18:27"}, std::string 
{"Asia/Shanghai"},
                               std::string {"UTC"}},
                              str_to_datetime_v2("2019-07-31 18:18:27", 
"%Y-%m-%d %H:%i:%s.%f")},
                             {{std::string {"2019-08-01 02:18:27"}, std::string 
{"Asia/Shanghai"},
                               std::string {"UTC"}},
-                             str_to_datetime_v2("2019-07-31 18:18:27", 
"%Y-%m-%d %H:%i:%s.%f")}};
-        if (case_sensitive) {
-            data_set.push_back(Row {{std::string {"2019-08-01 02:18:27"},
-                                     std::string {"Asia/Shanghai"}, 
std::string {"Utc"}},
-                                    Null()});
-            data_set.push_back(
-                    Row {{std::string {"2019-08-01 02:18:27"}, std::string 
{"Asia/SHANGHAI"},
-                          std::string {"america/Los_angeles"}},
-                         Null()});
-        }
+                             str_to_datetime_v2("2019-07-31 18:18:27", 
"%Y-%m-%d %H:%i:%s.%f")},
+                            {{std::string {"0000-01-01 00:00:00"}, std::string 
{"+08:00"},
+                              std::string {"-02:00"}},
+                             Null()},
+                            {{std::string {"0000-01-01 00:00:00"}, std::string 
{"+08:00"},
+                              std::string {"+08:00"}},
+                             str_to_datetime_v2("0000-01-01 00:00:00", 
"%Y-%m-%d %H:%i:%s.%f")}};
         static_cast<void>(
                 check_function<DataTypeDateTimeV2, true>(func_name, 
input_types, data_set, false));
     }
@@ -257,7 +240,6 @@ TEST(VTimestampFunctionsTest, convert_tz_test) {
                             {{std::string {"2019-08-01 02:18:27"}, std::string 
{"Asia/SHANGHAI"},
                               std::string {"america/Los_angeles"}},
                              str_to_datetime_v2("2019-07-31 11:18:27", 
"%Y-%m-%d %H:%i:%s.%f")}};
-        TimezoneUtils::load_timezones_to_cache();
         static_cast<void>(
                 check_function<DataTypeDateTimeV2, true>(func_name, 
input_types, data_set, false));
     }
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 c05fb8ef53e..33f2148950e 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
@@ -38,6 +38,12 @@
 -- !sql --
 \N
 
+-- !lower_bound --
+\N
+
+-- !lower_bound --
+0000-01-01T00:00
+
 -- !sql_convert_tz_null --
 \N
 \N
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 b9c18955b8f..b189bec5a66 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
@@ -54,6 +54,8 @@ suite("test_date_function") {
     qt_sql """ SELECT convert_tz('2022-2-29 13:21:03', '+08:00', 
'America/London') result; """
     qt_sql """ SELECT convert_tz('2022-02-29 13:21:03', '+08:00', 
'America/London') result; """
     qt_sql """ SELECT convert_tz('1900-00-00 13:21:03', '+08:00', 
'America/London') result; """
+    qt_lower_bound """ select convert_tz('0000-01-01 00:00:00', '+08:00', 
'-02:00'); """
+    qt_lower_bound """ select convert_tz('0000-01-01 00:00:00', '+08:00', 
'+08:00'); """
 
     // bug fix
     sql """ insert into ${tableName} values 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to