@@ -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+
498522template <typename ColumnType>
499523size_t ColumnUnique<ColumnType>::uniqueDeserializeAndInsertFromArena(const char * pos, const char *& new_pos)
500524{
0 commit comments