mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-03 13:02:00 +00:00
Fix UBSan report in mapOp
This commit is contained in:
parent
e2b25affe5
commit
a59c66c266
@ -120,6 +120,12 @@ private:
|
||||
return res;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static inline auto NO_SANITIZE_UNDEFINED negate(T x)
|
||||
{
|
||||
return -x;
|
||||
}
|
||||
|
||||
template <typename KeyType, bool is_str_key, typename ValType>
|
||||
ColumnPtr execute2(size_t row_count, TupleMaps & args, const DataTypeTuple & res_type) const
|
||||
{
|
||||
@ -159,14 +165,14 @@ private:
|
||||
if constexpr (is_str_key)
|
||||
{
|
||||
// have to use Field structs to get strings
|
||||
key = arg.key_column.operator[](offset + j).get<KeyType>();
|
||||
key = arg.key_column[offset + j].get<KeyType>();
|
||||
}
|
||||
else
|
||||
{
|
||||
key = assert_cast<const ColumnVector<KeyType> &>(arg.key_column).getData()[offset + j];
|
||||
}
|
||||
|
||||
auto value = arg.val_column.operator[](offset + j).get<ValType>();
|
||||
ValType value = arg.val_column[offset + j].get<ValType>();
|
||||
|
||||
if constexpr (op_type == OpTypes::ADD)
|
||||
{
|
||||
@ -177,7 +183,7 @@ private:
|
||||
else
|
||||
{
|
||||
static_assert(op_type == OpTypes::SUBTRACT);
|
||||
const auto [it, inserted] = summing_map.insert({key, first ? value : -value});
|
||||
const auto [it, inserted] = summing_map.insert({key, first ? value : negate(value)});
|
||||
if (!inserted)
|
||||
it->second -= value;
|
||||
}
|
||||
|
1
tests/queries/0_stateless/01781_map_op_ubsan.reference
Normal file
1
tests/queries/0_stateless/01781_map_op_ubsan.reference
Normal file
@ -0,0 +1 @@
|
||||
\N (([0,10,255],[-9223372036854775808,1025,0]),[255,NULL]) \N ([0,255],3,[-2]) [NULL]
|
1
tests/queries/0_stateless/01781_map_op_ubsan.sql
Normal file
1
tests/queries/0_stateless/01781_map_op_ubsan.sql
Normal file
@ -0,0 +1 @@
|
||||
SELECT toInt32([toUInt8(NULL)], NULL), (mapSubtract(([toUInt8(256), 10], [toInt32(-9223372036854775808), 1025]), ([toUInt8(65535), 0], [toInt16(0.), -9223372036854775808])), [toUInt8(-1), toInt32(([toUInt8(9223372036854775807), -1], [toInt32(255), 65536]), NULL)]), toUInt8(([2, 9223372036854775807], [toFloat32('0.0000065536'), 2]), 9223372036854775807, NULL), ([toUInt8(1024), 255], toUInt8(3), [toInt16(-2)]), [NULL];
|
Loading…
Reference in New Issue
Block a user