Repository: impala Updated Branches: refs/heads/2.x b3ab27dc2 -> 9f31390c6
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/720a6541 Tree: http://git-wip-us.apache.org/repos/asf/impala/tree/720a6541 Diff: http://git-wip-us.apache.org/repos/asf/impala/diff/720a6541 Branch: refs/heads/2.x Commit: 720a6541aed3f76bc95008c9c3f524bf5fa685b7 Parents: b3ab27d 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:55:45 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/720a6541/be/src/exprs/expr-test.cc ---------------------------------------------------------------------- diff --git a/be/src/exprs/expr-test.cc b/be/src/exprs/expr-test.cc index 07f5eda..8b40f1e 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; @@ -5694,6 +5698,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/720a6541/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\
