Merge pull request #68217 from ClickHouse/backport/24.3/68098

Backport #68098 to 24.3: Fix UB in hopEnd, hopStart, tumbleEnd, and tumbleStart
This commit is contained in:
robot-ch-test-poll4 2024-09-09 13:06:13 +02:00 committed by GitHub
commit c1309c3dd6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 21 additions and 2 deletions

View File

@ -267,7 +267,12 @@ struct TimeWindowImpl<TUMBLE_START>
{
auto type = WhichDataType(arguments[0].type);
if (type.isTuple())
return std::static_pointer_cast<const DataTypeTuple>(arguments[0].type)->getElement(0);
{
const auto & tuple_elems = std::static_pointer_cast<const DataTypeTuple>(arguments[0].type)->getElements();
if (tuple_elems.empty())
throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Tuple passed to {} should not be empty", function_name);
return tuple_elems[0];
}
else if (type.isUInt32())
return std::make_shared<DataTypeDateTime>();
else
@ -625,7 +630,12 @@ struct TimeWindowImpl<HOP_START>
{
auto type = WhichDataType(arguments[0].type);
if (type.isTuple())
return std::static_pointer_cast<const DataTypeTuple>(arguments[0].type)->getElement(0);
{
const auto & tuple_elems = std::static_pointer_cast<const DataTypeTuple>(arguments[0].type)->getElements();
if (tuple_elems.empty())
throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Tuple passed to {} should not be empty", function_name);
return tuple_elems[0];
}
else if (type.isUInt32())
return std::make_shared<DataTypeDateTime>();
else

View File

@ -67,3 +67,7 @@ SELECT toDateTime(hopEnd(toDateTime('2020-01-09 12:00:01', 'US/Samoa'), INTERVAL
2020-01-10 00:00:00
SELECT hopEnd(hop(toDateTime('2019-01-09 12:00:01', 'US/Samoa'), INTERVAL '1' DAY, INTERVAL '3' DAY, 'US/Samoa'));
2019-01-10 00:00:00
SELECT hopStart(tuple()); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
SELECT hopEnd(tuple()); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
SELECT tumbleStart(tuple()); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
SELECT tumbleEnd(tuple()); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }

View File

@ -36,3 +36,8 @@ SELECT hopEnd(toDateTime('2020-01-09 12:00:01', 'US/Samoa'), INTERVAL '1' DAY, I
SELECT toDateTime(hopEnd(toDateTime('2020-01-09 12:00:01', 'US/Samoa'), INTERVAL '1' DAY, INTERVAL '3' DAY, 'US/Samoa'), 'US/Samoa');
SELECT toDateTime(hopEnd(toDateTime('2020-01-09 12:00:01', 'US/Samoa'), INTERVAL '1' DAY, INTERVAL '3' DAY, 'US/Samoa'), 'US/Samoa');
SELECT hopEnd(hop(toDateTime('2019-01-09 12:00:01', 'US/Samoa'), INTERVAL '1' DAY, INTERVAL '3' DAY, 'US/Samoa'));
SELECT hopStart(tuple()); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
SELECT hopEnd(tuple()); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
SELECT tumbleStart(tuple()); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
SELECT tumbleEnd(tuple()); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }