fix reviews, fix crash in fuzzer

This commit is contained in:
Yarik Briukhovetskyi 2024-08-12 16:57:47 +02:00 committed by GitHub
parent 384aedccae
commit 1cc8457268
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 106 additions and 107 deletions

View File

@ -251,7 +251,7 @@ DataTypePtr findSmallestIntervalSuperType(const DataTypes &types, TypeIndexSet &
}
if (is_higher_interval && min_interval <= IntervalKind::Kind::Week)
throw Exception(ErrorCodes::NO_COMMON_TYPE, "Cannot compare intervals {} and {} because the amount of days in month is not determined", types[0]->getName(), types[1]->getName());
throw Exception(ErrorCodes::NO_COMMON_TYPE, "Cannot compare intervals {} and {} because the number of days in a month is not fixed", types[0]->getName(), types[1]->getName());
if (smallest_type)
{

View File

@ -51,6 +51,6 @@ DataTypePtr getLeastSupertypeOrString(const TypeIndexSet & types);
DataTypePtr tryGetLeastSupertype(const TypeIndexSet & types);
/// A vector that shows the conversion rates to the next Interval type starting from NanoSecond
static std::vector<int> interval_conversions = {1000, 1000, 1000, 60, 60, 24, 7, 4, 3, 4, 1};
static std::vector<int> interval_conversions = {1, 1000, 1000, 1000, 60, 60, 24, 7, 4, 3, 4};
}

View File

@ -1586,17 +1586,17 @@ struct ConvertImpl
Int64 result_value;
int from_position = static_cast<int>(from.kind);
int to_position = static_cast<int>(to.kind); // Positions of each interval according to granurality map
int to_position = static_cast<int>(to.kind); /// Positions of each interval according to granularity map
if (from_position < to_position)
{
for (int i = from_position - 1; i <= to_position; ++i)
for (int i = from_position; i < to_position; ++i)
conversion_factor *= interval_conversions[i];
result_value = arguments[0].column->getInt(0) / conversion_factor;
}
else
{
for (int i = from_position - 1; i >= to_position; --i)
for (int i = from_position; i > to_position; --i)
conversion_factor *= interval_conversions[i];
result_value = arguments[0].column->getInt(0) * conversion_factor;
}
@ -2366,9 +2366,8 @@ private:
}
if constexpr (std::is_same_v<ToDataType, DataTypeInterval>)
{
done = callOnIndexAndDataType<ToDataType>(from_type->getTypeId(), call, BehaviourOnErrorFromString::ConvertDefaultBehaviorTag);
}
if (WhichDataType(from_type).isInterval())
done = callOnIndexAndDataType<ToDataType>(from_type->getTypeId(), call, BehaviourOnErrorFromString::ConvertDefaultBehaviorTag);
}
if (!done)

View File

@ -1,142 +1,142 @@
SELECT('Comparing nanoseconds');
SELECT toIntervalNanosecond(500) > toIntervalNanosecond(300);
SELECT toIntervalNanosecond(1000) < toIntervalNanosecond(1500);
SELECT toIntervalNanosecond(2000) = toIntervalNanosecond(2000);
SELECT toIntervalNanosecond(1000) >= toIntervalMicrosecond(1);
SELECT toIntervalNanosecond(1000001) > toIntervalMillisecond(1);
SELECT toIntervalNanosecond(2000000001) > toIntervalSecond(2);
SELECT toIntervalNanosecond(60000000000) = toIntervalMinute(1);
SELECT toIntervalNanosecond(7199999999999) < toIntervalHour(2);
SELECT toIntervalNanosecond(1) < toIntervalDay(2);
SELECT toIntervalNanosecond(5) < toIntervalWeek(1);
SELECT INTERVAL 500 NANOSECOND > INTERVAL 300 NANOSECOND;
SELECT INTERVAL 1000 NANOSECOND < INTERVAL 1500 NANOSECOND;
SELECT INTERVAL 2000 NANOSECOND = INTERVAL 2000 NANOSECOND;
SELECT INTERVAL 1000 NANOSECOND >= INTERVAL 1 MICROSECOND;
SELECT INTERVAL 1000001 NANOSECOND > INTERVAL 1 MILLISECOND;
SELECT INTERVAL 2000000001 NANOSECOND > INTERVAL 2 SECOND;
SELECT INTERVAL 60000000000 NANOSECOND = INTERVAL 1 MINUTE;
SELECT INTERVAL 7199999999999 NANOSECOND < INTERVAL 2 HOUR;
SELECT INTERVAL 1 NANOSECOND < INTERVAL 2 DAY;
SELECT INTERVAL 5 NANOSECOND < INTERVAL 1 WEEK;
SELECT toIntervalNanosecond(500) < toIntervalNanosecond(300);
SELECT toIntervalNanosecond(1000) > toIntervalNanosecond(1500);
SELECT toIntervalNanosecond(2000) != toIntervalNanosecond(2000);
SELECT toIntervalNanosecond(1000) < toIntervalMicrosecond(1);
SELECT toIntervalNanosecond(1000001) < toIntervalMillisecond(1);
SELECT toIntervalNanosecond(2000000001) < toIntervalSecond(2);
SELECT toIntervalNanosecond(60000000000) != toIntervalMinute(1);
SELECT toIntervalNanosecond(7199999999999) > toIntervalHour(2);
SELECT toIntervalNanosecond(1) > toIntervalDay(2);
SELECT toIntervalNanosecond(5) > toIntervalWeek(1);
SELECT INTERVAL 500 NANOSECOND < INTERVAL 300 NANOSECOND;
SELECT INTERVAL 1000 NANOSECOND > INTERVAL 1500 NANOSECOND;
SELECT INTERVAL 2000 NANOSECOND != INTERVAL 2000 NANOSECOND;
SELECT INTERVAL 1000 NANOSECOND < INTERVAL 1 MICROSECOND;
SELECT INTERVAL 1000001 NANOSECOND < INTERVAL 1 MILLISECOND;
SELECT INTERVAL 2000000001 NANOSECOND < INTERVAL 2 SECOND;
SELECT INTERVAL 60000000000 NANOSECOND != INTERVAL 1 MINUTE;
SELECT INTERVAL 7199999999999 NANOSECOND > INTERVAL 2 HOUR;
SELECT INTERVAL 1 NANOSECOND > INTERVAL 2 DAY;
SELECT INTERVAL 5 NANOSECOND > INTERVAL 1 WEEK;
SELECT toIntervalNanosecond(1) < toIntervalMonth(2); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 1 NANOSECOND < INTERVAL 2 MONTH; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing microseconds');
SELECT toIntervalMicrosecond(1) < toIntervalMicrosecond(999);
SELECT toIntervalMicrosecond(1001) > toIntervalMillisecond(1);
SELECT toIntervalMicrosecond(2000000) = toIntervalSecond(2);
SELECT toIntervalMicrosecond(179999999) < toIntervalMinute(3);
SELECT toIntervalMicrosecond(3600000000) = toIntervalHour(1);
SELECT toIntervalMicrosecond(36000000000000) > toIntervalDay(2);
SELECT toIntervalMicrosecond(1209600000000) = toIntervalWeek(2);
SELECT INTERVAL 1 MICROSECOND < INTERVAL 999 MICROSECOND;
SELECT INTERVAL 1001 MICROSECOND > INTERVAL 1 MILLISECOND;
SELECT INTERVAL 2000000 MICROSECOND = INTERVAL 2 SECOND;
SELECT INTERVAL 179999999 MICROSECOND < INTERVAL 3 MINUTE;
SELECT INTERVAL 3600000000 MICROSECOND = INTERVAL 1 HOUR;
SELECT INTERVAL 36000000000000 MICROSECOND > INTERVAL 2 DAY;
SELECT INTERVAL 1209600000000 MICROSECOND = INTERVAL 2 WEEK;
SELECT toIntervalMicrosecond(1) > toIntervalMicrosecond(999);
SELECT toIntervalMicrosecond(1001) < toIntervalMillisecond(1);
SELECT toIntervalMicrosecond(2000000) != toIntervalSecond(2);
SELECT toIntervalMicrosecond(179999999) > toIntervalMinute(3);
SELECT toIntervalMicrosecond(3600000000) != toIntervalHour(1);
SELECT toIntervalMicrosecond(36000000000000) < toIntervalDay(2);
SELECT toIntervalMicrosecond(1209600000000) != toIntervalWeek(2);
SELECT INTERVAL 1 MICROSECOND > INTERVAL 999 MICROSECOND;
SELECT INTERVAL 1001 MICROSECOND < INTERVAL 1 MILLISECOND;
SELECT INTERVAL 2000000 MICROSECOND != INTERVAL 2 SECOND;
SELECT INTERVAL 179999999 MICROSECOND > INTERVAL 3 MINUTE;
SELECT INTERVAL 3600000000 MICROSECOND != INTERVAL 1 HOUR;
SELECT INTERVAL 36000000000000 MICROSECOND < INTERVAL 2 DAY;
SELECT INTERVAL 1209600000000 MICROSECOND != INTERVAL 2 WEEK;
SELECT toIntervalMicrosecond(36000000000000) < toIntervalQuarter(1); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 36000000000000 MICROSECOND < INTERVAL 1 QUARTER; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing milliseconds');
SELECT toIntervalMillisecond(2000) > toIntervalMillisecond(2);
SELECT toIntervalMillisecond(2000) = toIntervalSecond(2);
SELECT toIntervalMillisecond(170000) < toIntervalMinute(3);
SELECT toIntervalMillisecond(144000001) > toIntervalHour(40);
SELECT toIntervalMillisecond(1728000000) = toIntervalDay(20);
SELECT toIntervalMillisecond(1198599999) < toIntervalWeek(2);
SELECT INTERVAL 2000 MILLISECOND > INTERVAL 2 MILLISECOND;
SELECT INTERVAL 2000 MILLISECOND = INTERVAL 2 SECOND;
SELECT INTERVAL 170000 MILLISECOND < INTERVAL 3 MINUTE;
SELECT INTERVAL 144000001 MILLISECOND > INTERVAL 40 HOUR;
SELECT INTERVAL 1728000000 MILLISECOND = INTERVAL 20 DAY;
SELECT INTERVAL 1198599999 MILLISECOND < INTERVAL 2 WEEK;
SELECT toIntervalMillisecond(2000) < toIntervalMillisecond(2);
SELECT toIntervalMillisecond(2000) != toIntervalSecond(2);
SELECT toIntervalMillisecond(170000) > toIntervalMinute(3);
SELECT toIntervalMillisecond(144000001) < toIntervalHour(40);
SELECT toIntervalMillisecond(1728000000) != toIntervalDay(20);
SELECT toIntervalMillisecond(1198599999) > toIntervalWeek(2);
SELECT INTERVAL 2000 MILLISECOND < INTERVAL 2 MILLISECOND;
SELECT INTERVAL 2000 MILLISECOND != INTERVAL 2 SECOND;
SELECT INTERVAL 170000 MILLISECOND > INTERVAL 3 MINUTE;
SELECT INTERVAL 144000001 MILLISECOND < INTERVAL 40 HOUR;
SELECT INTERVAL 1728000000 MILLISECOND != INTERVAL 20 DAY;
SELECT INTERVAL 1198599999 MILLISECOND > INTERVAL 2 WEEK;
SELECT toIntervalMillisecond(36000000000000) < toIntervalYear(1); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 36000000000000 MILLISECOND < INTERVAL 1 YEAR; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing seconds');
SELECT toIntervalSecond(120) > toIntervalSecond(2);
SELECT toIntervalSecond(120) = toIntervalMinute(2);
SELECT toIntervalSecond(1) < toIntervalHour(2);
SELECT toIntervalSecond(86401) >= toIntervalDay(1);
SELECT toIntervalSecond(1209600) = toIntervalWeek(2);
SELECT INTERVAL 120 SECOND > INTERVAL 2 SECOND;
SELECT INTERVAL 120 SECOND = INTERVAL 2 MINUTE;
SELECT INTERVAL 1 SECOND < INTERVAL 2 HOUR;
SELECT INTERVAL 86401 SECOND >= INTERVAL 1 DAY;
SELECT INTERVAL 1209600 SECOND = INTERVAL 2 WEEK;
SELECT toIntervalSecond(120) < toIntervalSecond(2);
SELECT toIntervalSecond(120) != toIntervalMinute(2);
SELECT toIntervalSecond(1) > toIntervalHour(2);
SELECT toIntervalSecond(86401) < toIntervalDay(1);
SELECT toIntervalSecond(1209600) != toIntervalWeek(2);
SELECT INTERVAL 120 SECOND < INTERVAL 2 SECOND;
SELECT INTERVAL 120 SECOND != INTERVAL 2 MINUTE;
SELECT INTERVAL 1 SECOND > INTERVAL 2 HOUR;
SELECT INTERVAL 86401 SECOND < INTERVAL 1 DAY;
SELECT INTERVAL 1209600 SECOND != INTERVAL 2 WEEK;
SELECT toIntervalSecond(36000000000000) < toIntervalMonth(1); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 36000000000000 SECOND < INTERVAL 1 MONTH; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing minutes');
SELECT toIntervalMinute(1) < toIntervalMinute(59);
SELECT toIntervalMinute(1) < toIntervalHour(59);
SELECT toIntervalMinute(1440) = toIntervalDay(1);
SELECT toIntervalMinute(30241) > toIntervalWeek(3);
SELECT INTERVAL 1 MINUTE < INTERVAL 59 MINUTE;
SELECT INTERVAL 1 MINUTE < INTERVAL 59 HOUR;
SELECT INTERVAL 1440 MINUTE = INTERVAL 1 DAY;
SELECT INTERVAL 30241 MINUTE > INTERVAL 3 WEEK;
SELECT toIntervalMinute(1) > toIntervalMinute(59);
SELECT toIntervalMinute(1) > toIntervalHour(59);
SELECT toIntervalMinute(1440) != toIntervalDay(1);
SELECT toIntervalMinute(30241) < toIntervalWeek(3);
SELECT INTERVAL 1 MINUTE > INTERVAL 59 MINUTE;
SELECT INTERVAL 1 MINUTE > INTERVAL 59 HOUR;
SELECT INTERVAL 1440 MINUTE != INTERVAL 1 DAY;
SELECT INTERVAL 30241 MINUTE < INTERVAL 3 WEEK;
SELECT toIntervalMinute(2) = toIntervalQuarter(120); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 2 MINUTE = INTERVAL 120 QUARTER; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing hours');
SELECT toIntervalHour(48) > toIntervalHour(2);
SELECT toIntervalHour(48) >= toIntervalDay(2);
SELECT toIntervalHour(672) = toIntervalWeek(4);
SELECT INTERVAL 48 HOUR > INTERVAL 2 HOUR;
SELECT INTERVAL 48 HOUR >= INTERVAL 2 DAY;
SELECT INTERVAL 672 HOUR = INTERVAL 4 WEEK;
SELECT toIntervalHour(48) < toIntervalHour(2);
SELECT toIntervalHour(48) < toIntervalDay(2);
SELECT toIntervalHour(672) != toIntervalWeek(4);
SELECT INTERVAL 48 HOUR < INTERVAL 2 HOUR;
SELECT INTERVAL 48 HOUR < INTERVAL 2 DAY;
SELECT INTERVAL 672 HOUR != INTERVAL 4 WEEK;
SELECT toIntervalHour(2) < toIntervalYear(1); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 2 HOUR < INTERVAL 1 YEAR; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing days');
SELECT toIntervalDay(1) < toIntervalDay(23);
SELECT toIntervalDay(25) > toIntervalWeek(3);
SELECT INTERVAL 1 DAY < INTERVAL 23 DAY;
SELECT INTERVAL 25 DAY > INTERVAL 3 WEEK;
SELECT toIntervalDay(1) > toIntervalDay(23);
SELECT toIntervalDay(25) < toIntervalWeek(3);
SELECT INTERVAL 1 DAY > INTERVAL 23 DAY;
SELECT INTERVAL 25 DAY < INTERVAL 3 WEEK;
SELECT toIntervalDay(2) = toIntervalMonth(48); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 2 DAY = INTERVAL 48 MONTH; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing weeks');
SELECT toIntervalWeek(1) < toIntervalWeek(6);
SELECT INTERVAL 1 WEEK < INTERVAL 6 WEEK;
SELECT toIntervalWeek(1) > toIntervalWeek(6);
SELECT INTERVAL 1 WEEK > INTERVAL 6 WEEK;
SELECT toIntervalWeek(124) > toIntervalQuarter(8); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 124 WEEK > INTERVAL 8 QUARTER; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing months');
SELECT toIntervalMonth(1) < toIntervalMonth(3);
SELECT toIntervalMonth(124) > toIntervalQuarter(5);
SELECT toIntervalMonth(36) = toIntervalYear(3);
SELECT INTERVAL 1 MONTH < INTERVAL 3 MONTH;
SELECT INTERVAL 124 MONTH > INTERVAL 5 QUARTER;
SELECT INTERVAL 36 MONTH = INTERVAL 3 YEAR;
SELECT toIntervalMonth(1) > toIntervalMonth(3);
SELECT toIntervalMonth(124) < toIntervalQuarter(5);
SELECT toIntervalMonth(36) != toIntervalYear(3);
SELECT INTERVAL 1 MONTH > INTERVAL 3 MONTH;
SELECT INTERVAL 124 MONTH < INTERVAL 5 QUARTER;
SELECT INTERVAL 36 MONTH != INTERVAL 3 YEAR;
SELECT toIntervalMonth(6) = toIntervalMicrosecond(26); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 6 MONTH = INTERVAL 26 MICROSECOND; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing quarters');
SELECT toIntervalQuarter(5) > toIntervalQuarter(4);
SELECT toIntervalQuarter(20) = toIntervalYear(5);
SELECT INTERVAL 5 QUARTER > INTERVAL 4 QUARTER;
SELECT INTERVAL 20 QUARTER = INTERVAL 5 YEAR;
SELECT toIntervalQuarter(5) < toIntervalQuarter(4);
SELECT toIntervalQuarter(20) != toIntervalYear(5);
SELECT INTERVAL 5 QUARTER < INTERVAL 4 QUARTER;
SELECT INTERVAL 20 QUARTER != INTERVAL 5 YEAR;
SELECT toIntervalQuarter(2) = toIntervalNanosecond(6); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 2 QUARTER = INTERVAL 6 NANOSECOND; -- { serverError NO_COMMON_TYPE }
SELECT('Comparing years');
SELECT toIntervalYear(1) < toIntervalYear(3);
SELECT INTERVAL 1 YEAR < INTERVAL 3 YEAR;
SELECT toIntervalYear(1) > toIntervalYear(3);
SELECT INTERVAL 1 YEAR > INTERVAL 3 YEAR;
SELECT toIntervalYear(2) = toIntervalSecond(8); -- { serverError NO_COMMON_TYPE }
SELECT INTERVAL 2 YEAR = INTERVAL 8 SECOND; -- { serverError NO_COMMON_TYPE }