IMPALA-6699: Fix DST end time for Australian time zones

In Australian time zones where Daylight Saving Time is used (except
LHDT) DST should end at 3am on the first Sunday of April when the
clock is set back to 2am. However, the current time zone DB contains
wrong DST end time for them. This fix sets the DST end time to 3am
for the mentioned time zones.

Change-Id: I461cd4a9057dfebfe8dd85b568cba4f1e87ad215
Reviewed-on: http://gerrit.cloudera.org:8080/9724
Reviewed-by: Tim Armstrong <[email protected]>
Tested-by: Impala Public Jenkins


Project: http://git-wip-us.apache.org/repos/asf/impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/impala/commit/c8ad56f1
Tree: http://git-wip-us.apache.org/repos/asf/impala/tree/c8ad56f1
Diff: http://git-wip-us.apache.org/repos/asf/impala/diff/c8ad56f1

Branch: refs/heads/master
Commit: c8ad56f1d9886712b458b12e8ebb98777a99376c
Parents: 4851b03
Author: Gabor Kaszab <[email protected]>
Authored: Mon Mar 19 15:28:36 2018 +0100
Committer: Impala Public Jenkins <[email protected]>
Committed: Wed Mar 28 03:18:19 2018 +0000

----------------------------------------------------------------------
 be/src/exprs/expr-test.cc   | 47 ++++++++++++++++++++++++++++++++++++++++
 be/src/exprs/timezone_db.cc | 28 ++++++++++++------------
 2 files changed, 61 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/impala/blob/c8ad56f1/be/src/exprs/expr-test.cc
----------------------------------------------------------------------
diff --git a/be/src/exprs/expr-test.cc b/be/src/exprs/expr-test.cc
index 3bf4462..a381af9 100644
--- a/be/src/exprs/expr-test.cc
+++ b/be/src/exprs/expr-test.cc
@@ -265,6 +265,10 @@ class ExprTest : public testing::Test {
     EXPECT_EQ(expected_result, GetValue(expr, TYPE_STRING)) << expr;
   }
 
+  // Tests that DST of the given timezone ends at 3am
+  void TestAusDSTEndingForEastTimeZone(const string& time_zone);
+  void TestAusDSTEndingForCentralTimeZone(const string& time_zone);
+
   void TestCharValue(const string& expr, const string& expected_result,
                      const ColumnType& type) {
     EXPECT_EQ(expected_result, GetValue(expr, type)) << expr;
@@ -5704,6 +5708,49 @@ TEST_F(ExprTest, MoscowTimezoneConversion) {
 #pragma pop_macro("UTC_TO_MSC")
 }
 
+void ExprTest::TestAusDSTEndingForEastTimeZone(const string& time_zone) {
+  // Timestamps between 02:00:00 and 02:59:59 inclusive on the ending day of 
DST are
+  // ambiguous, hence excpecting NULL for timestamps in that range. Expect a 
UTC adjusted
+  // timestamp otherwise.
+  TestStringValue("cast(to_utc_timestamp('2018-04-01 01:59:59', '" + time_zone 
+ "') "
+      "as string)", "2018-03-31 14:59:59");
+  TestStringValue("cast(to_utc_timestamp('2018-04-01 02:00:00', '" + time_zone 
+ "') "
+      "as string)", "NULL");
+  TestStringValue("cast(to_utc_timestamp('2018-04-01 02:59:59', '" + time_zone 
+ "') "
+      "as string)", "NULL");
+  TestStringValue("cast(to_utc_timestamp('2018-04-01 03:00:00', '" + time_zone 
+ "') "
+      "as string)", "2018-03-31 17:00:00");
+}
+
+void ExprTest::TestAusDSTEndingForCentralTimeZone(const string& time_zone) {
+  TestStringValue("cast(to_utc_timestamp('2018-04-01 01:59:59', '" + time_zone 
+ "') "
+      "as string)", "2018-03-31 15:29:59");
+  TestStringValue("cast(to_utc_timestamp('2018-04-01 02:00:00', '" + time_zone 
+ "') "
+      "as string)", "NULL");
+  TestStringValue("cast(to_utc_timestamp('2018-04-01 02:59:59', '" + time_zone 
+ "') "
+      "as string)", "NULL");
+  TestStringValue("cast(to_utc_timestamp('2018-04-01 03:00:00', '" + time_zone 
+ "') "
+      "as string)", "2018-03-31 17:30:00");
+}
+
+// IMPALA-6699: Fix DST end time for Australian time-zones
+TEST_F(ExprTest, AusDSTEndingTests) {
+  TestAusDSTEndingForEastTimeZone("AET");
+  TestAusDSTEndingForEastTimeZone("Australia/ACT");
+  TestAusDSTEndingForCentralTimeZone("Australia/Adelaide");
+  TestAusDSTEndingForCentralTimeZone("Australia/Broken_Hill");
+  TestAusDSTEndingForEastTimeZone("Australia/Canberra");
+  TestAusDSTEndingForEastTimeZone("Australia/Currie");
+  TestAusDSTEndingForEastTimeZone("Australia/Hobart");
+  TestAusDSTEndingForEastTimeZone("Australia/Melbourne");
+  TestAusDSTEndingForEastTimeZone("Australia/NSW");
+  TestAusDSTEndingForCentralTimeZone("Australia/South");
+  TestAusDSTEndingForEastTimeZone("Australia/Sydney");
+  TestAusDSTEndingForEastTimeZone("Australia/Tasmania");
+  TestAusDSTEndingForEastTimeZone("Australia/Victoria");
+  TestAusDSTEndingForCentralTimeZone("Australia/Yancowinna");
+}
+
 TEST_F(ExprTest, TimestampFunctions) {
   // Regression for IMPALA-1105
   TestIsNull("cast(cast('NOTATIMESTAMP' as timestamp) as string)", 
TYPE_STRING);

http://git-wip-us.apache.org/repos/asf/impala/blob/c8ad56f1/be/src/exprs/timezone_db.cc
----------------------------------------------------------------------
diff --git a/be/src/exprs/timezone_db.cc b/be/src/exprs/timezone_db.cc
index 37c466a..bf6d56c 100644
--- a/be/src/exprs/timezone_db.cc
+++ b/be/src/exprs/timezone_db.cc
@@ -44,7 +44,7 @@ const time_zone_ptr 
TimezoneDatabase::TIMEZONE_MSK_PRE_2014(time_zone_ptr(
 
 const char* TimezoneDatabase::TIMEZONE_DATABASE_STR = "\"ID\",\"STD 
ABBR\",\"STD NAME\",\"DST ABBR\",\"DST NAME\",\"GMT offset\",\"DST 
adjustment\",\"DST Start Date rule\",\"Start time\",\"DST End date rule\",\"End 
time\"\n\
 \"ACT\",\"ACST\",\"Australian Central Standard Time (Northern 
Territory)\",\"\",\"\",\"+09:30:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
-\"AET\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
+\"AET\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
 \"AGT\",\"ART\",\"Argentine 
Time\",\"\",\"\",\"-03:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
 \"ART\",\"EET\",\"Eastern European Time\",\"EEST\",\"Eastern European Summer 
Time\",\"+02:00:00\",\"+01:00:00\",\"-1;4;4\",\"+00:00:00\",\"-1;4;9\",\"+24:00:00\"\n\
 \"AST\",\"AKST\",\"Alaska Standard Time\",\"AKDT\",\"Alaska Daylight 
Time\",\"-09:00:00\",\"+01:00:00\",\"2;0;3\",\"+02:00:00\",\"1;0;11\",\"+02:00:00\"\n\
@@ -387,29 +387,29 @@ const char* TimezoneDatabase::TIMEZONE_DATABASE_STR = 
"\"ID\",\"STD ABBR\",\"STD
 \"Atlantic/South_Georgia\",\"GST\",\"South Georgia Standard 
Time\",\"\",\"\",\"-02:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
 \"Atlantic/St_Helena\",\"GMT\",\"Greenwich Mean 
Time\",\"\",\"\",\"+00:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
 \"Atlantic/Stanley\",\"FKT\",\"Falkland Is. 
Time\",\"\",\"\",\"-03:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
-\"Australia/ACT\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
-\"Australia/Adelaide\",\"ACST\",\"Australian Central Standard Time (South 
Australia)\",\"ACDT\",\"Australian Central Daylight Time (South 
Australia)\",\"+09:30:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
+\"Australia/ACT\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
+\"Australia/Adelaide\",\"ACST\",\"Australian Central Standard Time (South 
Australia)\",\"ACDT\",\"Australian Central Daylight Time (South 
Australia)\",\"+09:30:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
 \"Australia/Brisbane\",\"AEST\",\"Australian Eastern Standard Time 
(Queensland)\",\"\",\"\",\"+10:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
-\"Australia/Broken_Hill\",\"ACST\",\"Australian Central Standard Time (South 
Australia/New South Wales)\",\"ACDT\",\"Australian Central Daylight Time (South 
Australia/New South 
Wales)\",\"+09:30:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
-\"Australia/Canberra\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
-\"Australia/Currie\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
+\"Australia/Broken_Hill\",\"ACST\",\"Australian Central Standard Time (South 
Australia/New South Wales)\",\"ACDT\",\"Australian Central Daylight Time (South 
Australia/New South 
Wales)\",\"+09:30:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
+\"Australia/Canberra\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
+\"Australia/Currie\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
 \"Australia/Darwin\",\"ACST\",\"Australian Central Standard Time (Northern 
Territory)\",\"\",\"\",\"+09:30:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
 \"Australia/Eucla\",\"ACWST\",\"Australian Central Western Standard 
Time\",\"\",\"\",\"+08:45:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
-\"Australia/Hobart\",\"AEST\",\"Australian Eastern Standard Time 
(Tasmania)\",\"AEDT\",\"Australian Eastern Daylight Time 
(Tasmania)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
+\"Australia/Hobart\",\"AEST\",\"Australian Eastern Standard Time 
(Tasmania)\",\"AEDT\",\"Australian Eastern Daylight Time 
(Tasmania)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
 \"Australia/LHI\",\"LHST\",\"Lord Howe Standard Time\",\"LHDT\",\"Lord Howe 
Daylight 
Time\",\"+10:30:00\",\"+00:30:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
 \"Australia/Lindeman\",\"AEST\",\"Australian Eastern Standard Time 
(Queensland)\",\"\",\"\",\"+10:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
 \"Australia/Lord_Howe\",\"LHST\",\"Lord Howe Standard Time\",\"LHDT\",\"Lord 
Howe Daylight 
Time\",\"+10:30:00\",\"+00:30:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
-\"Australia/Melbourne\",\"AEST\",\"Australian Eastern Standard Time 
(Victoria)\",\"AEDT\",\"Australian Eastern Daylight Time 
(Victoria)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
-\"Australia/NSW\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
+\"Australia/Melbourne\",\"AEST\",\"Australian Eastern Standard Time 
(Victoria)\",\"AEDT\",\"Australian Eastern Daylight Time 
(Victoria)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
+\"Australia/NSW\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
 \"Australia/North\",\"ACST\",\"Australian Central Standard Time (Northern 
Territory)\",\"\",\"\",\"+09:30:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
 \"Australia/Perth\",\"AWST\",\"Australian Western Standard 
Time\",\"\",\"\",\"+08:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
 \"Australia/Queensland\",\"AEST\",\"Australian Eastern Standard Time 
(Queensland)\",\"\",\"\",\"+10:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
-\"Australia/South\",\"ACST\",\"Australian Central Standard Time (South 
Australia)\",\"ACDT\",\"Australian Central Daylight Time (South 
Australia)\",\"+09:30:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
-\"Australia/Sydney\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
-\"Australia/Tasmania\",\"AEST\",\"Australian Eastern Standard Time 
(Tasmania)\",\"AEDT\",\"Australian Eastern Daylight Time 
(Tasmania)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
-\"Australia/Victoria\",\"AEST\",\"Australian Eastern Standard Time 
(Victoria)\",\"AEDT\",\"Australian Eastern Daylight Time 
(Victoria)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
+\"Australia/South\",\"ACST\",\"Australian Central Standard Time (South 
Australia)\",\"ACDT\",\"Australian Central Daylight Time (South 
Australia)\",\"+09:30:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
+\"Australia/Sydney\",\"AEST\",\"Australian Eastern Standard Time (New South 
Wales)\",\"AEDT\",\"Australian Eastern Daylight Time (New South 
Wales)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
+\"Australia/Tasmania\",\"AEST\",\"Australian Eastern Standard Time 
(Tasmania)\",\"AEDT\",\"Australian Eastern Daylight Time 
(Tasmania)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
+\"Australia/Victoria\",\"AEST\",\"Australian Eastern Standard Time 
(Victoria)\",\"AEDT\",\"Australian Eastern Daylight Time 
(Victoria)\",\"+10:00:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
 \"Australia/West\",\"AWST\",\"Australian Western Standard 
Time\",\"\",\"\",\"+08:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
-\"Australia/Yancowinna\",\"ACST\",\"Australian Central Standard Time (South 
Australia/New South Wales)\",\"ACDT\",\"Australian Central Daylight Time (South 
Australia/New South 
Wales)\",\"+09:30:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+02:00:00\"\n\
+\"Australia/Yancowinna\",\"ACST\",\"Australian Central Standard Time (South 
Australia/New South Wales)\",\"ACDT\",\"Australian Central Daylight Time (South 
Australia/New South 
Wales)\",\"+09:30:00\",\"+01:00:00\",\"1;0;10\",\"+02:00:00\",\"1;0;4\",\"+03:00:00\"\n\
 \"BET\",\"BRT\",\"Brasilia Time\",\"BRST\",\"Brasilia Summer 
Time\",\"-03:00:00\",\"+01:00:00\",\"3;0;10\",\"+00:00:00\",\"3;0;2\",\"+00:00:00\"\n\
 \"BST\",\"BDT\",\"Bangladesh 
Time\",\"\",\"\",\"+06:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\
 \"Brazil/Acre\",\"ACT\",\"Acre 
Time\",\"\",\"\",\"-05:00:00\",\"+00:00:00\",\"\",\"\",\"\",\"\"\n\

Reply via email to