mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
Fix checkOverflow in FunctionDateOrDateTimeAddInterval
This commit is contained in:
parent
a5c34fafd4
commit
65452ac089
@ -151,9 +151,9 @@ bool notEqualsOp(A a, B b)
|
||||
return !equalsOp(a, b);
|
||||
}
|
||||
|
||||
|
||||
/// Converts numeric to an equal numeric of other type.
|
||||
template <typename From, typename To>
|
||||
/// When `strict` is `true` check that result exactly same as input, otherwise just check overflow
|
||||
template <typename From, typename To, bool strict = true>
|
||||
inline bool NO_SANITIZE_UNDEFINED convertNumeric(From value, To & result)
|
||||
{
|
||||
/// If the type is actually the same it's not necessary to do any checks.
|
||||
@ -192,7 +192,9 @@ inline bool NO_SANITIZE_UNDEFINED convertNumeric(From value, To & result)
|
||||
}
|
||||
|
||||
result = static_cast<To>(value);
|
||||
return equalsOp(value, result);
|
||||
if constexpr (strict)
|
||||
return equalsOp(value, result);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -24,9 +24,10 @@ namespace DB
|
||||
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
|
||||
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
||||
extern const int DECIMAL_OVERFLOW;
|
||||
extern const int ILLEGAL_COLUMN;
|
||||
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
||||
extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
|
||||
}
|
||||
|
||||
/// Type of first argument of 'execute' function overload defines what INPUT DataType it is used for.
|
||||
@ -317,7 +318,7 @@ private:
|
||||
static Int64 checkOverflow(Value val)
|
||||
{
|
||||
Int64 result;
|
||||
if (accurate::convertNumeric(val, result))
|
||||
if (accurate::convertNumeric<Value, Int64, false>(val, result))
|
||||
return result;
|
||||
throw DB::Exception("Numeric overflow", ErrorCodes::DECIMAL_OVERFLOW);
|
||||
}
|
||||
|
@ -9,4 +9,4 @@ SET send_logs_level = 'fatal';
|
||||
SELECT ignore(addDays((CAST((96.338) AS DateTime)), -3));
|
||||
SELECT ignore(subtractDays((CAST((-5263074.47) AS DateTime)), -737895));
|
||||
SELECT quantileDeterministic([], identity(( SELECT subtractDays((CAST((566450.398706) AS DateTime)), 54) ) )), '\0', []; -- { serverError 43 }
|
||||
SELECT sequenceCount((CAST((( SELECT NULL ) AS rg, ( SELECT ( SELECT [], '<e', caseWithExpr([NULL], -588755.149, []), retention(addWeeks((CAST((-7644612.39732) AS DateTime)), -23578040.02833), (CAST(([]) AS DateTime)), (CAST(([010977.08]) AS String))), emptyArrayToSingle('') ) , '\0', toUInt64([], 't3hw@'), '\0', toStartOfQuarter(-4230.1872, []) ) ) AS Date))); -- { serverError 43 }
|
||||
SELECT sequenceCount((CAST((( SELECT NULL ) AS rg, ( SELECT ( SELECT [], '<e', caseWithExpr([NULL], -588755.149, []), retention(addWeeks((CAST((-7644612.39732) AS DateTime)), -23578040.02833), (CAST(([]) AS DateTime)), (CAST(([010977.08]) AS String))), emptyArrayToSingle('') ) , '\0', toUInt64([], 't3hw@'), '\0', toStartOfQuarter(-4230.1872, []) ) ) AS Date))); -- { serverError 407 }
|
||||
|
@ -1,2 +1,3 @@
|
||||
SELECT DISTINCT result FROM (SELECT toStartOfFifteenMinutes(toDateTime(toStartOfFifteenMinutes(toDateTime(1000.0001220703125) + (number * 65536))) + (number * 9223372036854775807)) AS result FROM system.numbers LIMIT 1048576) ORDER BY result DESC NULLS FIRST FORMAT Null;
|
||||
SELECT DISTINCT result FROM (SELECT toStartOfFifteenMinutes(toDateTime(toStartOfFifteenMinutes(toDateTime(1000.0001220703125) + (number * 65536))) + (number * 9223372036854775807)) AS result FROM system.numbers LIMIT 1048576) ORDER BY result DESC NULLS FIRST FORMAT Null; -- { serverError 407 }
|
||||
SELECT DISTINCT result FROM (SELECT toStartOfFifteenMinutes(toDateTime(toStartOfFifteenMinutes(toDateTime(1000.0001220703125) + (number * 65536))) + toInt64(number * 9223372036854775807)) AS result FROM system.numbers LIMIT 1048576) ORDER BY result DESC NULLS FIRST FORMAT Null;
|
||||
SELECT round(round(round(round(round(100)), round(round(round(round(NULL), round(65535)), toTypeName(now() + 9223372036854775807) LIKE 'DateTime%DateTime%DateTime%DateTime%', round(-2)), 255), round(NULL))));
|
||||
|
@ -1,2 +0,0 @@
|
||||
0
|
||||
0
|
@ -1,2 +1,2 @@
|
||||
-- The result is unspecified but UBSan should not argue.
|
||||
SELECT ignore(addHours(now64(3), inf)) FROM numbers(2);
|
||||
SELECT ignore(addHours(now64(3), inf)) FROM numbers(2); -- { serverError 407 }
|
||||
|
Loading…
Reference in New Issue
Block a user