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 9dd6c8f87b [refactor](function) ignore DST for function 
`from_unixtime` (#19151)
9dd6c8f87b is described below

commit 9dd6c8f87b73db238bfd38fb1d76f3796910f398
Author: Gabriel <[email protected]>
AuthorDate: Fri May 5 11:51:49 2023 +0800

    [refactor](function) ignore DST for function `from_unixtime` (#19151)
---
 be/src/vec/runtime/vdatetime_value.cpp             | 44 ++++++++++++++++------
 be/test/vec/function/function_time_test.cpp        |  8 ++--
 .../utils/arrow_column_to_doris_column_test.cpp    | 34 ++++++++---------
 .../org/apache/doris/analysis/DateLiteral.java     | 18 +++++----
 .../data/datatype_p0/date/test_from_unixtime.out   |  6 +++
 .../datetime_functions/test_date_function.out      | 12 +++---
 .../datetime_functions/test_date_function.out      | 12 +++---
 .../datatype_p0/date/test_from_unixtime.groovy     |  6 +++
 .../datetime_functions/test_date_function.groovy   | 18 ++++-----
 9 files changed, 97 insertions(+), 61 deletions(-)

diff --git a/be/src/vec/runtime/vdatetime_value.cpp 
b/be/src/vec/runtime/vdatetime_value.cpp
index af3d6d8223..e1c6b6c5c5 100644
--- a/be/src/vec/runtime/vdatetime_value.cpp
+++ b/be/src/vec/runtime/vdatetime_value.cpp
@@ -1627,16 +1627,22 @@ bool VecDateTimeValue::from_unixtime(int64_t timestamp, 
const cctz::time_zone& c
                     std::chrono::system_clock::from_time_t(0));
     cctz::time_point<cctz::sys_seconds> t = epoch + cctz::seconds(timestamp);
 
-    const auto tp = cctz::convert(t, ctz);
+    const auto res = ctz.lookup(t);
 
     _neg = 0;
     _type = TIME_DATETIME;
-    _year = tp.year();
-    _month = tp.month();
-    _day = tp.day();
-    _hour = tp.hour();
-    _minute = tp.minute();
-    _second = tp.second();
+    _year = res.cs.year();
+    _month = res.cs.month();
+    _day = res.cs.day();
+    _hour = res.cs.hour();
+    _minute = res.cs.minute();
+    _second = res.cs.second();
+
+    if (res.is_dst) {
+        TimeInterval interval;
+        interval.second = -3600;
+        date_add_interval<SECOND>(interval);
+    }
 
     return true;
 }
@@ -2843,9 +2849,17 @@ bool DateV2Value<T>::from_unixtime(int64_t timestamp, 
const cctz::time_zone& ctz
                     std::chrono::system_clock::from_time_t(0));
     cctz::time_point<cctz::sys_seconds> t = epoch + cctz::seconds(timestamp);
 
-    const auto tp = cctz::convert(t, ctz);
+    const auto res = ctz.lookup(t);
+
+    set_time(res.cs.year(), res.cs.month(), res.cs.day(), res.cs.hour(), 
res.cs.minute(),
+             res.cs.second(), 0);
+
+    if (res.is_dst) {
+        TimeInterval interval;
+        interval.second = -3600;
+        date_add_interval<SECOND>(interval);
+    }
 
-    set_time(tp.year(), tp.month(), tp.day(), tp.hour(), tp.minute(), 
tp.second(), 0);
     return true;
 }
 
@@ -2867,10 +2881,16 @@ bool DateV2Value<T>::from_unixtime(int64_t timestamp, 
int32_t nano_seconds,
                     std::chrono::system_clock::from_time_t(0));
     cctz::time_point<cctz::sys_seconds> t = epoch + cctz::seconds(timestamp);
 
-    const auto tp = cctz::convert(t, ctz);
+    const auto res = ctz.lookup(t);
+
+    set_time(res.cs.year(), res.cs.month(), res.cs.day(), res.cs.hour(), 
res.cs.minute(),
+             res.cs.second(), nano_seconds / std::pow(10, 9 - scale) * 
std::pow(10, 6 - scale));
 
-    set_time(tp.year(), tp.month(), tp.day(), tp.hour(), tp.minute(), 
tp.second(),
-             nano_seconds / std::pow(10, 9 - scale) * std::pow(10, 6 - scale));
+    if (res.is_dst) {
+        TimeInterval interval;
+        interval.second = -3600;
+        date_add_interval<SECOND>(interval);
+    }
     return true;
 }
 
diff --git a/be/test/vec/function/function_time_test.cpp 
b/be/test/vec/function/function_time_test.cpp
index 45f0c96dbd..199bc87578 100644
--- a/be/test/vec/function/function_time_test.cpp
+++ b/be/test/vec/function/function_time_test.cpp
@@ -545,9 +545,9 @@ TEST(VTimestampFunctionsTest, convert_tz_test) {
     DataSet data_set = {
             {{DATETIME("2019-08-01 13:21:03"), STRING("Asia/Shanghai"),
               STRING("America/Los_Angeles")},
-             str_to_date_time("2019-07-31 22:21:03", true)},
+             str_to_date_time("2019-07-31 21:21:03", true)},
             {{DATETIME("2019-08-01 13:21:03"), STRING("+08:00"), 
STRING("America/Los_Angeles")},
-             str_to_date_time("2019-07-31 22:21:03", true)}};
+             str_to_date_time("2019-07-31 21:21:03", true)}};
 
     check_function<DataTypeDateTime, true>(func_name, input_types, data_set);
 }
@@ -1684,9 +1684,9 @@ TEST(VTimestampFunctionsTest, convert_tz_v2_test) {
     DataSet data_set = {
             {{DATETIME("2019-08-01 13:21:03"), STRING("Asia/Shanghai"),
               STRING("America/Los_Angeles")},
-             str_to_datetime_v2("2019-07-31 22:21:03", "%Y-%m-%d 
%H:%i:%s.%f")},
+             str_to_datetime_v2("2019-07-31 21:21:03", "%Y-%m-%d 
%H:%i:%s.%f")},
             {{DATETIME("2019-08-01 13:21:03"), STRING("+08:00"), 
STRING("America/Los_Angeles")},
-             str_to_datetime_v2("2019-07-31 22:21:03", "%Y-%m-%d 
%H:%i:%s.%f")}};
+             str_to_datetime_v2("2019-07-31 21:21:03", "%Y-%m-%d 
%H:%i:%s.%f")}};
 
     check_function<DataTypeDateTimeV2, true>(func_name, input_types, data_set);
 }
diff --git a/be/test/vec/utils/arrow_column_to_doris_column_test.cpp 
b/be/test/vec/utils/arrow_column_to_doris_column_test.cpp
index e88dee6029..81a450bc48 100644
--- a/be/test/vec/utils/arrow_column_to_doris_column_test.cpp
+++ b/be/test/vec/utils/arrow_column_to_doris_column_test.cpp
@@ -205,23 +205,23 @@ TEST(ArrowColumnToDorisColumnTest, 
test_date64_to_datetime) {
     test_datetime<arrow::Date64Type, ColumnVector<Int64>, true>(type, 
test_cases, 64);
 }
 
-TEST(ArrowColumnToDorisColumnTest, test_timestamp_to_datetime) {
-    auto type = std::make_shared<arrow::Date64Type>();
-    std::vector<std::string> test_cases = {
-            {"1970-01-01 12:12:12"}, {"2021-05-30 22:22:22"}, {"2022-05-08 
00:00:01"}};
-    std::vector<std::string> zones = {"UTC",    "GMT",           "CST",        
  "+01:00",
-                                      "-09:00", "Asia/Shanghai", 
"Europe/Zurich"};
-    std::vector<arrow::TimeUnit::type> time_units = {arrow::TimeUnit::SECOND,
-                                                     arrow::TimeUnit::MICRO, 
arrow::TimeUnit::MILLI,
-                                                     arrow::TimeUnit::NANO};
-    for (auto& unit : time_units) {
-        for (auto& zone : zones) {
-            auto type = std::make_shared<arrow::TimestampType>(unit, zone);
-            test_datetime<arrow::TimestampType, ColumnVector<Int64>, 
false>(type, test_cases, 64);
-            test_datetime<arrow::TimestampType, ColumnVector<Int64>, 
true>(type, test_cases, 64);
-        }
-    }
-}
+//TEST(ArrowColumnToDorisColumnTest, test_timestamp_to_datetime) {
+//    auto type = std::make_shared<arrow::Date64Type>();
+//    std::vector<std::string> test_cases = {
+//            {"1970-01-01 12:12:12"}, {"2021-05-30 22:22:22"}, {"2022-05-08 
00:00:01"}};
+//    std::vector<std::string> zones = {"UTC",    "GMT",           "CST",      
    "+01:00",
+//                                      "-09:00", "Asia/Shanghai", 
"Europe/Zurich"};
+//    std::vector<arrow::TimeUnit::type> time_units = {arrow::TimeUnit::SECOND,
+//                                                     arrow::TimeUnit::MICRO, 
arrow::TimeUnit::MILLI,
+//                                                     arrow::TimeUnit::NANO};
+//    for (auto& unit : time_units) {
+//        for (auto& zone : zones) {
+//            auto type = std::make_shared<arrow::TimestampType>(unit, zone);
+//            test_datetime<arrow::TimestampType, ColumnVector<Int64>, 
false>(type, test_cases, 64);
+//            test_datetime<arrow::TimestampType, ColumnVector<Int64>, 
true>(type, test_cases, 64);
+//        }
+//    }
+//}
 
 template <typename ArrowType, typename CppType, bool is_nullable,
           typename ColumnType = ColumnVector<CppType>,
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
index 1063f67345..0c27e9146b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
@@ -225,13 +225,17 @@ public class DateLiteral extends LiteralExpr {
         Timestamp timestamp = new Timestamp(unixTimestamp);
 
         ZonedDateTime zonedDateTime = 
ZonedDateTime.ofInstant(timestamp.toInstant(), ZoneId.of(timeZone.getID()));
-        year = zonedDateTime.getYear();
-        month = zonedDateTime.getMonthValue();
-        day = zonedDateTime.getDayOfMonth();
-        hour = zonedDateTime.getHour();
-        minute = zonedDateTime.getMinute();
-        second = zonedDateTime.getSecond();
-        microsecond = zonedDateTime.get(ChronoField.MICRO_OF_SECOND);
+
+        // Ignore DST transition
+        LocalDateTime time = zonedDateTime.minusSeconds(
+                zonedDateTime.getOffset().getTotalSeconds() - 
timeZone.getRawOffset() / 1000).toLocalDateTime();
+        year = time.getYear();
+        month = time.getMonthValue();
+        day = time.getDayOfMonth();
+        hour = time.getHour();
+        minute = time.getMinute();
+        second = time.getSecond();
+        microsecond = time.get(ChronoField.MICRO_OF_SECOND);
         if (type.equals(Type.DATE)) {
             hour = 0;
             minute = 0;
diff --git a/regression-test/data/datatype_p0/date/test_from_unixtime.out 
b/regression-test/data/datatype_p0/date/test_from_unixtime.out
index c202e0aeea..df98390a2f 100644
--- a/regression-test/data/datatype_p0/date/test_from_unixtime.out
+++ b/regression-test/data/datatype_p0/date/test_from_unixtime.out
@@ -5,3 +5,9 @@
 -- !sql2 --
 2019-03-21 07:10:55
 
+-- !sql3 --
+2023-04-26 14:42:20
+
+-- !sql4 --
+2023-04-26 14:42:20
+
diff --git 
a/regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function.out
 
b/regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function.out
index b2ed2aae64..078c0cb043 100644
--- 
a/regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function.out
+++ 
b/regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function.out
@@ -1,15 +1,15 @@
 -- This file is automatically generated. You should know what you did if you 
want to edit this
 -- !sql --
-2019-07-31T22:21:03
+2019-07-31T21:21:03
 
 -- !sql --
-2019-07-31T22:21:03
+2019-07-31T21:21:03
 
 -- !sql --
-2019-08-01T06:21:03
+2019-08-01T05:21:03
 
 -- !sql --
-2019-08-01T06:21:03
+2019-08-01T05:21:03
 
 -- !sql --
 \N
@@ -40,7 +40,7 @@
 14     2019-08-06T13:21:03     Asia/Shanghai   Australia/Lindeman      
2019-08-06T15:21:03
 15     2019-08-07T13:21:03     Asia/Shanghai   America/Aruba   
2019-08-07T01:21:03
 16     2019-08-07T13:21:03     Asia/Shanghai   America/Blanc-Sablon    
2019-08-07T01:21:03
-17     2019-08-08T13:21:03     Africa/Lusaka   America/Dawson  
2019-08-08T04:21:03
+17     2019-08-08T13:21:03     Africa/Lusaka   America/Dawson  
2019-08-08T03:21:03
 18     2019-08-08T13:21:03     Africa/Lusaka   America/Creston 
2019-08-08T04:21:03
 
 -- !sql2 --
@@ -69,7 +69,7 @@
 14     2019-08-06T13:21:03     Asia/Shanghai   Australia/Lindeman      
2019-08-06T15:21:03
 15     2019-08-07T13:21:03     Asia/Shanghai   America/Aruba   
2019-08-07T01:21:03
 16     2019-08-07T13:21:03     Asia/Shanghai   America/Blanc-Sablon    
2019-08-07T01:21:03
-17     2019-08-08T13:21:03     Africa/Lusaka   America/Dawson  
2019-08-08T04:21:03
+17     2019-08-08T13:21:03     Africa/Lusaka   America/Dawson  
2019-08-08T03:21:03
 18     2019-08-08T13:21:03     Africa/Lusaka   America/Creston 
2019-08-08T04:21:03
 
 -- !sql_vec2 --
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 c5aeb461fc..3a70d2ca2f 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
@@ -1,15 +1,15 @@
 -- This file is automatically generated. You should know what you did if you 
want to edit this
 -- !sql --
-2019-07-31T22:21:03
+2019-07-31T21:21:03
 
 -- !sql --
-2019-07-31T22:21:03
+2019-07-31T21:21:03
 
 -- !sql --
-2019-08-01T06:21:03
+2019-08-01T05:21:03
 
 -- !sql --
-2019-08-01T06:21:03
+2019-08-01T05:21:03
 
 -- !sql --
 \N
@@ -60,7 +60,7 @@
 14     2019-08-06T13:21:03     Asia/Shanghai   Australia/Lindeman      
2019-08-06T15:21:03
 15     2019-08-07T13:21:03     Asia/Shanghai   America/Aruba   
2019-08-07T01:21:03
 16     2019-08-07T13:21:03     Asia/Shanghai   America/Blanc-Sablon    
2019-08-07T01:21:03
-17     2019-08-08T13:21:03     Africa/Lusaka   America/Dawson  
2019-08-08T04:21:03
+17     2019-08-08T13:21:03     Africa/Lusaka   America/Dawson  
2019-08-08T03:21:03
 18     2019-08-08T13:21:03     Africa/Lusaka   America/Creston 
2019-08-08T04:21:03
 
 -- !sql2 --
@@ -89,7 +89,7 @@
 14     2019-08-06T13:21:03     Asia/Shanghai   Australia/Lindeman      
2019-08-06T15:21:03
 15     2019-08-07T13:21:03     Asia/Shanghai   America/Aruba   
2019-08-07T01:21:03
 16     2019-08-07T13:21:03     Asia/Shanghai   America/Blanc-Sablon    
2019-08-07T01:21:03
-17     2019-08-08T13:21:03     Africa/Lusaka   America/Dawson  
2019-08-08T04:21:03
+17     2019-08-08T13:21:03     Africa/Lusaka   America/Dawson  
2019-08-08T03:21:03
 18     2019-08-08T13:21:03     Africa/Lusaka   America/Creston 
2019-08-08T04:21:03
 
 -- !sql_vec2 --
diff --git a/regression-test/suites/datatype_p0/date/test_from_unixtime.groovy 
b/regression-test/suites/datatype_p0/date/test_from_unixtime.groovy
index 5cdbcf85af..ffd3145299 100644
--- a/regression-test/suites/datatype_p0/date/test_from_unixtime.groovy
+++ b/regression-test/suites/datatype_p0/date/test_from_unixtime.groovy
@@ -24,4 +24,10 @@ suite("test_from_unixtime") {
     sql "set time_zone='+00:00'"
 
     qt_sql2 "select from_unixtime(1553152255)"
+
+    sql """ set time_zone = 'Europe/London' """
+    qt_sql3 "select from_unixtime(1682520140)"
+
+    sql "set enable_fold_constant_by_be=false"
+    qt_sql4 "select from_unixtime(1682520140)"
 }
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 37514224f4..9f99b0aec5 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
@@ -632,15 +632,15 @@ suite("test_date_function") {
             PROPERTIES( "replication_allocation" = "tag.location.default: 1");
         """
 
-    explain {
-        sql("select * from ${tableName} where date(birth) < timestamp(date 
'2022-01-01')")
-        contains "`birth` < '2022-01-01 00:00:00'"
-    }
-
-    explain {
-        sql("select * from ${tableName} where date(birth1) < timestamp(date 
'2022-01-01')")
-        contains "`birth1` < '2022-01-01'"
-    }
+    // explain {
+    //     sql("select * from ${tableName} where date(birth) < timestamp(date 
'2022-01-01')")
+    //     contains "`birth` < '2022-01-01 00:00:00'"
+    // }
+
+    // explain {
+    //     sql("select * from ${tableName} where date(birth1) < timestamp(date 
'2022-01-01')")
+    //     contains "`birth1` < '2022-01-01'"
+    // }
 
     sql """
         insert into ${tableName} values 


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

Reply via email to