From 7f534716ff3f1523c81aa211c68ba38f994d4db1 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 23 Aug 2023 20:08:27 +0000 Subject: [PATCH] Fix fuzzer crash in parseDateTime() --- src/Functions/parseDateTime.cpp | 11 ++++++----- .../0_stateless/02668_parse_datetime.reference | 2 ++ tests/queries/0_stateless/02668_parse_datetime.sql | 3 +++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Functions/parseDateTime.cpp b/src/Functions/parseDateTime.cpp index 2381def91515..fdab85c4640e 100644 --- a/src/Functions/parseDateTime.cpp +++ b/src/Functions/parseDateTime.cpp @@ -485,15 +485,16 @@ namespace DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { - FunctionArgumentDescriptors args{ + FunctionArgumentDescriptors mandatory_args{ {"time", &isString, nullptr, "String"}, - {"format", &isString, nullptr, "String"}, + {"format", &isString, nullptr, "String"} }; - if (arguments.size() == 3) - args.emplace_back(FunctionArgumentDescriptor{"timezone", &isString, nullptr, "String"}); + FunctionArgumentDescriptors optional_args{ + {"timezone", &isString, &isColumnConst, "const String"} + }; - validateFunctionArgumentTypes(*this, arguments, args); + validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args); String time_zone_name = getTimeZone(arguments).getTimeZone(); DataTypePtr date_type = std::make_shared(time_zone_name); diff --git a/tests/queries/0_stateless/02668_parse_datetime.reference b/tests/queries/0_stateless/02668_parse_datetime.reference index b7215ac37188..f6c53ce1887e 100644 --- a/tests/queries/0_stateless/02668_parse_datetime.reference +++ b/tests/queries/0_stateless/02668_parse_datetime.reference @@ -241,3 +241,5 @@ select str_to_date('10:04:11 invalid 03-07-2019', '%s:%i:%H %d-%m-%Y', 'UTC') IS -- Error handling select parseDateTime('12 AM'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } select parseDateTime('12 AM', '%h %p', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } +-- Fuzzer crash bug #53715 +select parseDateTime('', '', toString(number)) from numbers(13); -- { serverError ILLEGAL_COLUMN } diff --git a/tests/queries/0_stateless/02668_parse_datetime.sql b/tests/queries/0_stateless/02668_parse_datetime.sql index 3fb4aacedbd4..d8f2a94e188d 100644 --- a/tests/queries/0_stateless/02668_parse_datetime.sql +++ b/tests/queries/0_stateless/02668_parse_datetime.sql @@ -165,4 +165,7 @@ select str_to_date('10:04:11 invalid 03-07-2019', '%s:%i:%H %d-%m-%Y', 'UTC') IS select parseDateTime('12 AM'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } select parseDateTime('12 AM', '%h %p', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } +-- Fuzzer crash bug #53715 +select parseDateTime('', '', toString(number)) from numbers(13); -- { serverError ILLEGAL_COLUMN } + -- { echoOff }