Skip to content

Commit 09c51f4

Browse files
authored
Merge pull request ClickHouse#89322 from ClickHouse/backport/25.8/89133
Backport ClickHouse#89133 to 25.8: Fix allocation size calculation for baseXXEncode/Decode functions
2 parents d687ab2 + 13db77b commit 09c51f4

File tree

4 files changed

+13
-9
lines changed

4 files changed

+13
-9
lines changed

src/Functions/FunctionBase32Conversion.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@ struct Base32EncodeTraits
1111
template <typename Col>
1212
static size_t getBufferSize(Col const & src_column)
1313
{
14-
auto const src_length = src_column.getChars().size();
15-
auto const string_count = src_column.size();
14+
auto const src_length = src_column.getChars().size() + src_column.size();
1615
/// Every 5 bytes becomes 8 bytes in base32
1716
/// Add padding for incomplete blocks and round up
18-
return (src_length + 4) / 5 * 8 * string_count;
17+
return (src_length + 4) / 5 * 8;
1918
}
2019

2120
static size_t perform(std::string_view src, UInt8 * dst)
@@ -29,10 +28,10 @@ struct Base32DecodeTraits
2928
template <typename Col>
3029
static size_t getBufferSize(Col const & src_column)
3130
{
32-
auto const string_length = src_column.byteSize();
33-
auto const string_count = src_column.size();
31+
/// This function can be used for FixedString columns so we need to take into account NULL terminator
32+
auto const string_length = src_column.getChars().size() + src_column.size();
3433
/// decoded size is at most length of encoded (every 8 bytes becomes at most 5 bytes)
35-
return (string_length * 5 + 7) / 8 * string_count;
34+
return (string_length * 5 + 7) / 8;
3635
}
3736

3837
static std::optional<size_t> perform(std::string_view src, UInt8 * dst)

src/Functions/FunctionBase58Conversion.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ struct Base58DecodeTraits
2929
template <typename Col>
3030
static size_t getBufferSize(Col const & src_column)
3131
{
32-
auto const string_length = src_column.byteSize();
33-
auto const string_count = src_column.size();
32+
/// This function can be used for FixedString columns so we need to take into account NULL terminator
33+
auto const string_length = src_column.getChars().size() + src_column.size();
3434
/// decoded size is at most length of encoded (every 8 bytes becomes at most 6 bytes)
35-
return (string_length * 6 + 7) / 8 * string_count;
35+
return (string_length * 6 + 7) / 8;
3636
}
3737

3838
static std::optional<size_t> perform(std::string_view src, UInt8 * dst)

tests/queries/0_stateless/03702_encode_decode_memory_usage.reference

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- Tags: no-fasttest
2+
3+
SELECT base32Decode(s) FROM (SELECT base32Encode(randomString(100)) AS s FROM numbers(100000)) FORMAT Null;
4+
SELECT base58Decode(s) FROM (SELECT base58Encode(randomString(100)) AS s FROM numbers(100000)) FORMAT Null;
5+
SELECT base64Decode(s) FROM (SELECT base64Encode(randomString(100)) AS s FROM numbers(100000)) FORMAT Null;

0 commit comments

Comments
 (0)