[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)
```
This commit is contained in:
zclllhhjj
2024-07-25 11:32:44 +08:00
committed by GitHub
parent 3ea26a8c95
commit 79a6496bb6
4 changed files with 23 additions and 33 deletions

View File

@ -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));
}