Skip to content

Commit 76f01dd

Browse files
authored
Merge pull request ClickHouse#89684 from ClickHouse/backport/25.8/89550
Backport ClickHouse#89550 to 25.8: Fix generic aggregation state for LowCardinality(String)
2 parents 98c4aaf + e74c4e8 commit 76f01dd

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

src/Columns/ColumnUnique.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ class ColumnUnique final : public COWHelper<IColumnUnique, ColumnUnique<ColumnTy
9292
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
9393
char * serializeValueIntoMemory(size_t n, char * memory) const override;
9494
const char * skipSerializedInArena(const char * pos) const override;
95+
StringRef serializeAggregationStateValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
9596
void updateHashWithValue(size_t n, SipHash & hash_func) const override;
9697

9798
#if !defined(DEBUG_OR_SANITIZER_BUILD)
@@ -495,6 +496,29 @@ char * ColumnUnique<ColumnType>::serializeValueIntoMemory(size_t n, char * memor
495496
return column_holder->serializeValueIntoMemory(n, memory);
496497
}
497498

499+
template <typename ColumnType>
500+
StringRef ColumnUnique<ColumnType>::serializeAggregationStateValueIntoArena(size_t n, Arena & arena, char const *& begin) const
501+
{
502+
if (is_nullable)
503+
{
504+
static constexpr auto s = sizeof(UInt8);
505+
506+
auto * pos = arena.allocContinue(s, begin);
507+
UInt8 flag = (n == getNullValueIndex() ? 1 : 0);
508+
unalignedStore<UInt8>(pos, flag);
509+
510+
if (n == getNullValueIndex())
511+
return StringRef(pos, s);
512+
513+
auto nested_ref = column_holder->serializeAggregationStateValueIntoArena(n, arena, begin);
514+
515+
/// serializeAggregationStateValueIntoArena may reallocate memory. Have to use ptr from nested_ref.data and move it back.
516+
return StringRef(nested_ref.data - s, nested_ref.size + s);
517+
}
518+
519+
return column_holder->serializeAggregationStateValueIntoArena(n, arena, begin);
520+
}
521+
498522
template <typename ColumnType>
499523
size_t ColumnUnique<ColumnType>::uniqueDeserializeAndInsertFromArena(const char * pos, const char *& new_pos)
500524
{
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
010D00040000000000000073747200
2+
010A00010000000000000000
3+
('str')
4+
('')
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
select hex(maxDistinctState(tuple('str'::Variant(LowCardinality(String)))));
2+
select hex(maxDistinctState(tuple(''::Variant(LowCardinality(String)))));
3+
select maxDistinctMerge(state) from (select maxDistinctState(tuple('str'::Variant(LowCardinality(String)))) as state);
4+
select maxDistinctMerge(state) from (select maxDistinctState(tuple(''::Variant(LowCardinality(String)))) as state);
5+

0 commit comments

Comments
 (0)