@@ -524,6 +524,35 @@ void ColumnAggregateFunction::insertDefault()
524524 pushBackAndCreateState (data, arena, func.get ());
525525}
526526
527+ void ColumnAggregateFunction::insertRangeSelective (
528+ const IColumn & from, const IColumn::Selector & selector, size_t selector_start, size_t length)
529+ {
530+ const ColumnAggregateFunction & from_concrete = static_cast <const ColumnAggregateFunction &>(from);
531+ const auto & from_data = from_concrete.data ;
532+ if (!empty () && src.get () != &from_concrete)
533+ {
534+ ensureOwnership ();
535+ Arena & arena = createOrGetArena ();
536+ Arena * arena_ptr = &arena;
537+ data.reserve (size () + length);
538+ for (size_t i = 0 ; i < length; ++i)
539+ {
540+ pushBackAndCreateState (data, arena, func.get ());
541+ func->merge (data.back (), from_data[selector[selector_start + i]], arena_ptr);
542+ }
543+ return ;
544+ }
545+ // / Keep shared ownership of aggregation states.
546+ src = from_concrete.getPtr ();
547+
548+ size_t old_size = data.size ();
549+ data.resize (old_size + length);
550+ auto * data_start = data.data ();
551+ size_t element_size = sizeof (data[0 ]);
552+ for (size_t i = 0 ; i < length; ++i)
553+ memcpy (data_start + old_size + i, &from_concrete.data [selector[selector_start + i]], element_size);
554+ }
555+
527556StringRef ColumnAggregateFunction::serializeValueIntoArena (size_t n, Arena & arena, const char *& begin, const UInt8 *) const
528557{
529558 WriteBufferFromArena out (arena, begin);
0 commit comments