Merge pull request #15319 from bharatnc/ncb/fix-14509

Fix bug in queries like SELECT toStartOfDay(today())
This commit is contained in:
alexey-milovidov 2020-10-03 17:02:57 +03:00 committed by GitHub
commit 6f3aab8f09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 10 deletions

View File

@ -71,7 +71,9 @@ public:
if constexpr (std::is_same_v<ToDataType, DataTypeDateTime>) if constexpr (std::is_same_v<ToDataType, DataTypeDateTime>)
{ {
std::string time_zone = extractTimeZoneNameFromFunctionArguments(arguments, 1, 0); std::string time_zone = extractTimeZoneNameFromFunctionArguments(arguments, 1, 0);
if (time_zone.empty()) /// only validate the time_zone part if the number of arguments is 2. This is mainly
/// to accommodate functions like toStartOfDay(today()), toStartOfDay(yesterday()) etc.
if (arguments.size() == 2 && time_zone.empty())
throw Exception( throw Exception(
"Function " + getName() + " supports a 2nd argument (optional) that must be non-empty and be a valid time zone", "Function " + getName() + " supports a 2nd argument (optional) that must be non-empty and be a valid time zone",
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);

View File

@ -88,38 +88,37 @@ SELECT toStartOfWeek(N)
"Date","2019-09-15" "Date","2019-09-15"
------------------------------------------ ------------------------------------------
SELECT toStartOfDay(N) SELECT toStartOfDay(N)
"DateTime","2019-09-16 00:00:00"
Code: 43: Function toStartOfDay supports a 2nd argument (optional) that must be non-empty and be a valid time zone.
"DateTime('Europe/Minsk')","2019-09-16 00:00:00" "DateTime('Europe/Minsk')","2019-09-16 00:00:00"
"DateTime('Europe/Minsk')","2019-09-16 00:00:00" "DateTime('Europe/Minsk')","2019-09-16 00:00:00"
------------------------------------------ ------------------------------------------
SELECT toStartOfHour(N) SELECT toStartOfHour(N)
Code: 43: Function toStartOfHour supports a 2nd argument (optional) that must be non-empty and be a valid time zone. Code: 43: Illegal type Date of argument for function toStartOfHour.
"DateTime('Europe/Minsk')","2019-09-16 19:00:00" "DateTime('Europe/Minsk')","2019-09-16 19:00:00"
"DateTime('Europe/Minsk')","2019-09-16 19:00:00" "DateTime('Europe/Minsk')","2019-09-16 19:00:00"
------------------------------------------ ------------------------------------------
SELECT toStartOfMinute(N) SELECT toStartOfMinute(N)
Code: 43: Function toStartOfMinute supports a 2nd argument (optional) that must be non-empty and be a valid time zone. Code: 43: Illegal type Date of argument for function toStartOfMinute.
"DateTime('Europe/Minsk')","2019-09-16 19:20:00" "DateTime('Europe/Minsk')","2019-09-16 19:20:00"
"DateTime('Europe/Minsk')","2019-09-16 19:20:00" "DateTime('Europe/Minsk')","2019-09-16 19:20:00"
------------------------------------------ ------------------------------------------
SELECT toStartOfFiveMinute(N) SELECT toStartOfFiveMinute(N)
Code: 43: Function toStartOfFiveMinute supports a 2nd argument (optional) that must be non-empty and be a valid time zone. Code: 43: Illegal type Date of argument for function toStartOfFiveMinute.
"DateTime('Europe/Minsk')","2019-09-16 19:20:00" "DateTime('Europe/Minsk')","2019-09-16 19:20:00"
"DateTime('Europe/Minsk')","2019-09-16 19:20:00" "DateTime('Europe/Minsk')","2019-09-16 19:20:00"
------------------------------------------ ------------------------------------------
SELECT toStartOfTenMinutes(N) SELECT toStartOfTenMinutes(N)
Code: 43: Function toStartOfTenMinutes supports a 2nd argument (optional) that must be non-empty and be a valid time zone. Code: 43: Illegal type Date of argument for function toStartOfTenMinutes.
"DateTime('Europe/Minsk')","2019-09-16 19:20:00" "DateTime('Europe/Minsk')","2019-09-16 19:20:00"
"DateTime('Europe/Minsk')","2019-09-16 19:20:00" "DateTime('Europe/Minsk')","2019-09-16 19:20:00"
------------------------------------------ ------------------------------------------
SELECT toStartOfFifteenMinutes(N) SELECT toStartOfFifteenMinutes(N)
Code: 43: Function toStartOfFifteenMinutes supports a 2nd argument (optional) that must be non-empty and be a valid time zone. Code: 43: Illegal type Date of argument for function toStartOfFifteenMinutes.
"DateTime('Europe/Minsk')","2019-09-16 19:15:00" "DateTime('Europe/Minsk')","2019-09-16 19:15:00"
"DateTime('Europe/Minsk')","2019-09-16 19:15:00" "DateTime('Europe/Minsk')","2019-09-16 19:15:00"
------------------------------------------ ------------------------------------------
@ -167,7 +166,7 @@ Code: 43: Illegal type Date of argument for function date_trunc.
------------------------------------------ ------------------------------------------
SELECT toTime(N) SELECT toTime(N)
Code: 43: Function toTime supports a 2nd argument (optional) that must be non-empty and be a valid time zone. Code: 43: Illegal type Date of argument for function toTime.
"DateTime('Europe/Minsk')","1970-01-02 19:20:11" "DateTime('Europe/Minsk')","1970-01-02 19:20:11"
"DateTime('Europe/Minsk')","1970-01-02 19:20:11" "DateTime('Europe/Minsk')","1970-01-02 19:20:11"
------------------------------------------ ------------------------------------------
@ -233,7 +232,7 @@ SELECT toYearWeek(N)
------------------------------------------ ------------------------------------------
SELECT timeSlot(N) SELECT timeSlot(N)
Code: 43: Function timeSlot supports a 2nd argument (optional) that must be non-empty and be a valid time zone. Code: 43: Illegal type Date of argument for function timeSlot.
"DateTime('Europe/Minsk')","2019-09-16 19:00:00" "DateTime('Europe/Minsk')","2019-09-16 19:00:00"
"DateTime('Europe/Minsk')","2019-09-16 19:00:00" "DateTime('Europe/Minsk')","2019-09-16 19:00:00"
------------------------------------------ ------------------------------------------

View File

@ -21,3 +21,7 @@ SELECT toStartOfHour(toDateTime('2017-12-31 01:59:00', 'UTC'), 'UTC'); -- succes
SELECT toStartOfMinute(toDateTime('2017-12-31 00:00:00', 'UTC'), ''); -- {serverError 43} SELECT toStartOfMinute(toDateTime('2017-12-31 00:00:00', 'UTC'), ''); -- {serverError 43}
SELECT toStartOfMinute(toDateTime('2017-12-31 00:01:30', 'UTC'), 'UTC'); -- success SELECT toStartOfMinute(toDateTime('2017-12-31 00:01:30', 'UTC'), 'UTC'); -- success
-- special case - allow empty time_zone when using functions like today(), yesterday() etc.
SELECT toStartOfDay(today()) FORMAT Null; -- success
SELECT toStartOfDay(yesterday()) FORMAT Null; -- success