Fix address sanitizer container-overflow

This commit is contained in:
JackyWoo 2024-07-09 17:46:44 +08:00
parent 943a8bce30
commit 64de996c03
3 changed files with 10 additions and 11 deletions

View File

@ -33,10 +33,9 @@ Float64 StatisticsCountMinSketch::estimateEqual(const Field & val) const
{
if (data_type->isValueRepresentedByNumber())
{
/// convertFieldToType will
/// 'val' maybe number or string, method 'convertFieldToType' will
/// 1. convert string to number, date, datetime, IPv4, Decimal etc
/// 2. do other conversion
/// 3. return null if val larger than the range of data_type
/// 2. return null if val larger than the range of data_type
auto val_converted = convertFieldToType(val, *data_type);
if (val_converted.isNull())
return 0;
@ -87,7 +86,7 @@ void StatisticsCountMinSketch::deserialize(ReadBuffer & buf)
readIntBinary(size, buf);
Sketch::vector_bytes bytes;
bytes.reserve(size);
bytes.resize(size); /// To avoid 'container-overflow' in AddressSanitizer checking
buf.readStrict(reinterpret_cast<char *>(bytes.data()), size);
sketch = Sketch::deserialize(bytes.data(), size);

View File

@ -17,7 +17,7 @@ Test statistics count_min:
Test statistics multi-types:
Prewhere info
Prewhere filter
Prewhere filter column: and(equals(a, \'0\'), less(c, -90), greater(b, 900_UInt16)) (removed)
Prewhere filter column: and(equals(a, \'0\'), less(c, -90), greater(b, 900)) (removed)
Prewhere info
Prewhere filter
Prewhere filter column: and(equals(a, \'10000\'), equals(b, 0), less(c, 0)) (removed)

View File

@ -26,11 +26,11 @@ SELECT 'Test statistics TDigest:';
ALTER TABLE tab ADD STATISTICS b, c TYPE tdigest;
ALTER TABLE tab MATERIALIZE STATISTICS b, c;
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_String', '')
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_UInt16|_String', '')
FROM (EXPLAIN actions=1 SELECT count(*) FROM tab WHERE b > 0/*9990*/ and c < -98/*100*/)
WHERE explain LIKE '%Prewhere%' OR explain LIKE '%Filter column%';
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_String', '')
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_UInt16|_String', '')
FROM (EXPLAIN actions=1 SELECT count(*) FROM tab WHERE b = 0/*1000*/ and c < -98/*100*/)
WHERE explain LIKE '%Prewhere%' OR explain LIKE '%Filter column%';
@ -41,7 +41,7 @@ SELECT 'Test statistics Uniq:';
ALTER TABLE tab ADD STATISTICS b TYPE uniq, tdigest;
ALTER TABLE tab MATERIALIZE STATISTICS b;
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_String', '')
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_UInt16|_String', '')
FROM (EXPLAIN actions=1 SELECT count(*) FROM tab WHERE c = 0/*1000*/ and b = 0/*10*/)
WHERE explain LIKE '%Prewhere%' OR explain LIKE '%Filter column%';
@ -55,7 +55,7 @@ ALTER TABLE tab ADD STATISTICS b TYPE count_min;
ALTER TABLE tab ADD STATISTICS c TYPE count_min;
ALTER TABLE tab MATERIALIZE STATISTICS a, b, c;
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_String', '')
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_UInt16|_String', '')
FROM (EXPLAIN actions=1 SELECT count(*) FROM tab WHERE c = 0/*100*/ and b = 0/*10*/ and a = '0'/*1*/) xx
WHERE explain LIKE '%Prewhere%' OR explain LIKE '%Filter column%';
@ -69,11 +69,11 @@ ALTER TABLE tab ADD STATISTICS b TYPE count_min, uniq, tdigest;
ALTER TABLE tab ADD STATISTICS c TYPE count_min, uniq, tdigest;
ALTER TABLE tab MATERIALIZE STATISTICS a, b, c;
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_String', '')
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_UInt16|_String', '')
FROM (EXPLAIN actions=1 SELECT count(*) FROM tab WHERE c < -90/*900*/ and b > 900/*990*/ and a = '0'/*1*/)
WHERE explain LIKE '%Prewhere%' OR explain LIKE '%Filter column%';
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_String', '')
SELECT replaceRegexpAll(explain, '__table1.|_UInt8|_Int8|_UInt16|_String', '')
FROM (EXPLAIN actions=1 SELECT count(*) FROM tab WHERE c < 0/*9900*/ and b = 0/*10*/ and a = '10000'/*0*/)
WHERE explain LIKE '%Prewhere%' OR explain LIKE '%Filter column%';