diff --git a/cpp-ch/local-engine/Storages/IO/NativeReader.cpp b/cpp-ch/local-engine/Storages/IO/NativeReader.cpp index 98fa4b7419b55..d22e720929164 100644 --- a/cpp-ch/local-engine/Storages/IO/NativeReader.cpp +++ b/cpp-ch/local-engine/Storages/IO/NativeReader.cpp @@ -58,6 +58,7 @@ void NativeReader::readData(const ISerialization & serialization, ColumnPtr & co "Cannot read all data in NativeReader. Rows read: {}. Rows expected: {}", column->size(), rows); } +template void NativeReader::readAggData(const DB::DataTypeAggregateFunction & data_type, DB::ColumnPtr & column, DB::ReadBuffer & istr, size_t rows) { ColumnAggregateFunction & real_column = typeid_cast(*column->assumeMutable()); @@ -72,9 +73,8 @@ void NativeReader::readAggData(const DB::DataTypeAggregateFunction & data_type, for (size_t i = 0; i < rows; ++i) { AggregateDataPtr place = arena.alignedAlloc(size_of_state, align_of_state); - agg_function->create(place); - if (isFixedSizeAggregateFunction(agg_function)) + if constexpr (FIXED) { auto n = istr.read(place, size_of_state); chassert(n == size_of_state); @@ -84,6 +84,7 @@ void NativeReader::readAggData(const DB::DataTypeAggregateFunction & data_type, agg_function->deserialize(place, istr, std::nullopt, &arena); istr.ignore(); } + vec.push_back(place); } } @@ -149,7 +150,15 @@ Block NativeReader::read() if (is_agg_state_type && agg_opt_column) { const DataTypeAggregateFunction * agg_type = checkAndGetDataType(column.type.get()); - readAggData(*agg_type, read_column, istr, rows); + bool fixed = isFixedSizeAggregateFunction(agg_type->getFunction()); + if (fixed) + { + readAggData(*agg_type, read_column, istr, rows); + } + else + { + readAggData(*agg_type, read_column, istr, rows); + } } else { diff --git a/cpp-ch/local-engine/Storages/IO/NativeReader.h b/cpp-ch/local-engine/Storages/IO/NativeReader.h index 3cd9375eed226..d065fce347d45 100644 --- a/cpp-ch/local-engine/Storages/IO/NativeReader.h +++ b/cpp-ch/local-engine/Storages/IO/NativeReader.h @@ -29,6 +29,7 @@ class NativeReader NativeReader(DB::ReadBuffer & istr_) : istr(istr_) {} static void readData(const DB::ISerialization & serialization, DB::ColumnPtr & column, DB::ReadBuffer & istr, size_t rows, double avg_value_size_hint); + template static void readAggData(const DB::DataTypeAggregateFunction & data_type, DB::ColumnPtr & column, DB::ReadBuffer & istr, size_t rows); DB::Block getHeader() const;