mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 08:32:02 +00:00
Merge pull request #71646 from ClickHouse/backport/24.10/71580
Backport #71580 to 24.10: Return 0 or default char instead of throwing an error in bitShift functions in case of out of bounds
This commit is contained in:
commit
f0273cca89
@ -25,8 +25,10 @@ struct BitShiftLeftImpl
|
|||||||
{
|
{
|
||||||
if constexpr (is_big_int_v<B>)
|
if constexpr (is_big_int_v<B>)
|
||||||
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "BitShiftLeft is not implemented for big integers as second argument");
|
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "BitShiftLeft is not implemented for big integers as second argument");
|
||||||
else if (b < 0 || static_cast<UInt256>(b) > 8 * sizeof(A))
|
else if (b < 0)
|
||||||
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value and less or equal to the bit width of the value to shift");
|
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value");
|
||||||
|
else if (static_cast<UInt256>(b) > 8 * sizeof(A))
|
||||||
|
return static_cast<Result>(0);
|
||||||
else if constexpr (is_big_int_v<A>)
|
else if constexpr (is_big_int_v<A>)
|
||||||
return static_cast<Result>(a) << static_cast<UInt32>(b);
|
return static_cast<Result>(a) << static_cast<UInt32>(b);
|
||||||
else
|
else
|
||||||
@ -43,9 +45,10 @@ struct BitShiftLeftImpl
|
|||||||
const UInt8 word_size = 8 * sizeof(*pos);
|
const UInt8 word_size = 8 * sizeof(*pos);
|
||||||
size_t n = end - pos;
|
size_t n = end - pos;
|
||||||
const UInt128 bit_limit = static_cast<UInt128>(word_size) * n;
|
const UInt128 bit_limit = static_cast<UInt128>(word_size) * n;
|
||||||
if (b < 0 || static_cast<decltype(bit_limit)>(b) > bit_limit)
|
if (b < 0)
|
||||||
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value and less or equal to the bit width of the value to shift");
|
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value");
|
||||||
if (b == bit_limit)
|
|
||||||
|
if (b == bit_limit || static_cast<decltype(bit_limit)>(b) > bit_limit)
|
||||||
{
|
{
|
||||||
// insert default value
|
// insert default value
|
||||||
out_vec.push_back(0);
|
out_vec.push_back(0);
|
||||||
@ -111,9 +114,10 @@ struct BitShiftLeftImpl
|
|||||||
const UInt8 word_size = 8;
|
const UInt8 word_size = 8;
|
||||||
size_t n = end - pos;
|
size_t n = end - pos;
|
||||||
const UInt128 bit_limit = static_cast<UInt128>(word_size) * n;
|
const UInt128 bit_limit = static_cast<UInt128>(word_size) * n;
|
||||||
if (b < 0 || static_cast<decltype(bit_limit)>(b) > bit_limit)
|
if (b < 0)
|
||||||
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value and less or equal to the bit width of the value to shift");
|
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value");
|
||||||
if (b == bit_limit)
|
|
||||||
|
if (b == bit_limit || static_cast<decltype(bit_limit)>(b) > bit_limit)
|
||||||
{
|
{
|
||||||
// insert default value
|
// insert default value
|
||||||
out_vec.resize_fill(out_vec.size() + n);
|
out_vec.resize_fill(out_vec.size() + n);
|
||||||
|
@ -26,8 +26,10 @@ struct BitShiftRightImpl
|
|||||||
{
|
{
|
||||||
if constexpr (is_big_int_v<B>)
|
if constexpr (is_big_int_v<B>)
|
||||||
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "BitShiftRight is not implemented for big integers as second argument");
|
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "BitShiftRight is not implemented for big integers as second argument");
|
||||||
else if (b < 0 || static_cast<UInt256>(b) > 8 * sizeof(A))
|
else if (b < 0)
|
||||||
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value and less or equal to the bit width of the value to shift");
|
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value");
|
||||||
|
else if (static_cast<UInt256>(b) > 8 * sizeof(A))
|
||||||
|
return static_cast<Result>(0);
|
||||||
else if constexpr (is_big_int_v<A>)
|
else if constexpr (is_big_int_v<A>)
|
||||||
return static_cast<Result>(a) >> static_cast<UInt32>(b);
|
return static_cast<Result>(a) >> static_cast<UInt32>(b);
|
||||||
else
|
else
|
||||||
@ -59,9 +61,10 @@ struct BitShiftRightImpl
|
|||||||
const UInt8 word_size = 8;
|
const UInt8 word_size = 8;
|
||||||
size_t n = end - pos;
|
size_t n = end - pos;
|
||||||
const UInt128 bit_limit = static_cast<UInt128>(word_size) * n;
|
const UInt128 bit_limit = static_cast<UInt128>(word_size) * n;
|
||||||
if (b < 0 || static_cast<decltype(bit_limit)>(b) > bit_limit)
|
if (b < 0)
|
||||||
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value and less or equal to the bit width of the value to shift");
|
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value");
|
||||||
if (b == bit_limit)
|
|
||||||
|
if (b == bit_limit || static_cast<decltype(bit_limit)>(b) > bit_limit)
|
||||||
{
|
{
|
||||||
/// insert default value
|
/// insert default value
|
||||||
out_vec.push_back(0);
|
out_vec.push_back(0);
|
||||||
@ -99,9 +102,10 @@ struct BitShiftRightImpl
|
|||||||
const UInt8 word_size = 8;
|
const UInt8 word_size = 8;
|
||||||
size_t n = end - pos;
|
size_t n = end - pos;
|
||||||
const UInt128 bit_limit = static_cast<UInt128>(word_size) * n;
|
const UInt128 bit_limit = static_cast<UInt128>(word_size) * n;
|
||||||
if (b < 0 || static_cast<decltype(bit_limit)>(b) > bit_limit)
|
if (b < 0)
|
||||||
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value and less or equal to the bit width of the value to shift");
|
throw Exception(ErrorCodes::ARGUMENT_OUT_OF_BOUND, "The number of shift positions needs to be a non-negative value");
|
||||||
if (b == bit_limit)
|
|
||||||
|
if (b == bit_limit || static_cast<decltype(bit_limit)>(b) > bit_limit)
|
||||||
{
|
{
|
||||||
// insert default value
|
// insert default value
|
||||||
out_vec.resize_fill(out_vec.size() + n);
|
out_vec.resize_fill(out_vec.size() + n);
|
||||||
|
@ -10,7 +10,7 @@ DROP TABLE IF EXISTS t1;
|
|||||||
CREATE TABLE t0 (vkey UInt32, pkey UInt32, c0 UInt32) engine = TinyLog;
|
CREATE TABLE t0 (vkey UInt32, pkey UInt32, c0 UInt32) engine = TinyLog;
|
||||||
CREATE TABLE t1 (vkey UInt32) ENGINE = AggregatingMergeTree ORDER BY vkey;
|
CREATE TABLE t1 (vkey UInt32) ENGINE = AggregatingMergeTree ORDER BY vkey;
|
||||||
INSERT INTO t0 VALUES (15, 25000, 58);
|
INSERT INTO t0 VALUES (15, 25000, 58);
|
||||||
SELECT ref_5.pkey AS c_2_c2392_6 FROM t0 AS ref_5 WHERE 'J[' < multiIf(ref_5.pkey IN ( SELECT 1 ), bitShiftLeft(multiIf(ref_5.c0 > NULL, '1', ')'), 40), NULL); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT ref_5.pkey AS c_2_c2392_6 FROM t0 AS ref_5 WHERE 'J[' < multiIf(ref_5.pkey IN ( SELECT 1 ), bitShiftLeft(multiIf(ref_5.c0 > NULL, '1', ')'), 40), NULL);
|
||||||
DROP TABLE t0;
|
DROP TABLE t0;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
-- bitShiftRight
|
-- bitShiftRight
|
||||||
|
0
|
||||||
|
|
||||||
|
\0\0\0\0\0\0\0\0
|
||||||
-- bitShiftLeft
|
-- bitShiftLeft
|
||||||
|
0
|
||||||
|
|
||||||
|
\0\0\0\0\0\0\0\0
|
||||||
OK
|
OK
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
SELECT '-- bitShiftRight';
|
SELECT '-- bitShiftRight';
|
||||||
SELECT bitShiftRight(1, -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftRight(1, -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
||||||
SELECT bitShiftRight(toUInt8(1), 8 + 1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftRight(toUInt8(1), 8 + 1);
|
||||||
SELECT bitShiftRight('hola', -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftRight('hola', -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
||||||
SELECT bitShiftRight('hola', 4 * 8 + 1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftRight('hola', 4 * 8 + 1);
|
||||||
SELECT bitShiftRight(toFixedString('hola', 8), -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftRight(toFixedString('hola', 8), -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
||||||
SELECT bitShiftRight(toFixedString('hola', 8), 8 * 8 + 1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftRight(toFixedString('hola', 8), 8 * 8 + 1);
|
||||||
|
|
||||||
SELECT '-- bitShiftLeft';
|
SELECT '-- bitShiftLeft';
|
||||||
SELECT bitShiftLeft(1, -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftLeft(1, -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
||||||
SELECT bitShiftLeft(toUInt8(1), 8 + 1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftLeft(toUInt8(1), 8 + 1);
|
||||||
SELECT bitShiftLeft('hola', -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftLeft('hola', -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
||||||
SELECT bitShiftLeft('hola', 4 * 8 + 1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftLeft('hola', 4 * 8 + 1);
|
||||||
SELECT bitShiftLeft(toFixedString('hola', 8), -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftLeft(toFixedString('hola', 8), -1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
||||||
SELECT bitShiftLeft(toFixedString('hola', 8), 8 * 8 + 1); -- { serverError ARGUMENT_OUT_OF_BOUND }
|
SELECT bitShiftLeft(toFixedString('hola', 8), 8 * 8 + 1);
|
||||||
|
|
||||||
SELECT 'OK';
|
SELECT 'OK';
|
Loading…
Reference in New Issue
Block a user