mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-29 02:52:13 +00:00
dbms: development [#METR-10894].
This commit is contained in:
parent
ac06ebccf6
commit
16f092d87b
@ -66,9 +66,11 @@ public:
|
||||
|
||||
~ColumnAggregateFunction()
|
||||
{
|
||||
if (!func->hasTrivialDestructor())
|
||||
IAggregateFunction * function = func;
|
||||
|
||||
if (!function->hasTrivialDestructor())
|
||||
for (size_t i = 0, s = data.size(); i < s; ++i)
|
||||
func->destroy(data[i]);
|
||||
function->destroy(data[i]);
|
||||
}
|
||||
|
||||
std::string getName() const { return "ColumnAggregateFunction"; }
|
||||
|
@ -50,6 +50,7 @@ namespace DB
|
||||
* пары записей с разными значениями sign_column для одного значения первичного ключа.
|
||||
* (см. CollapsingSortedBlockInputStream.h)
|
||||
* - Summing - при склейке кусков, при совпадении PK суммировать все числовые столбцы, не входящие в PK.
|
||||
* - Aggregating - при склейке кусков, при совпадении PK, делается слияние состояний столбцов-агрегатных функций.
|
||||
*/
|
||||
|
||||
/** Этот класс хранит список кусков и параметры структуры данных.
|
||||
|
@ -23,14 +23,14 @@ void Block::addDefaults(NamesAndTypesListPtr required_columns)
|
||||
{
|
||||
for (NamesAndTypesList::const_iterator it = required_columns->begin(); it != required_columns->end(); ++it)
|
||||
{
|
||||
if (!this->has(it->first))
|
||||
if (!has(it->first))
|
||||
{
|
||||
ColumnWithNameAndType col;
|
||||
col.name = it->first;
|
||||
col.type = it->second;
|
||||
col.column = dynamic_cast<IColumnConst &>(*it->second->createConstColumn(
|
||||
this->rows(), it->second->getDefault())).convertToFullColumn();
|
||||
this->insert(col);
|
||||
rows(), it->second->getDefault())).convertToFullColumn();
|
||||
insert(col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -340,8 +340,6 @@ void Aggregator::destroyImpl(
|
||||
Method & method) const
|
||||
{
|
||||
for (typename Method::const_iterator it = method.data.begin(); it != method.data.end(); ++it)
|
||||
{
|
||||
for (size_t i = 0; i < aggregates_size; ++i)
|
||||
{
|
||||
char * data = Method::getAggregateData(it->second);
|
||||
|
||||
@ -349,10 +347,13 @@ void Aggregator::destroyImpl(
|
||||
* после вставки ключа в хэш-таблицу, но до создания всех состояний агрегатных функций,
|
||||
* то data будет равен nullptr-у.
|
||||
*/
|
||||
if (nullptr != data && !aggregate_functions[i]->isState())
|
||||
if (nullptr == data)
|
||||
continue;
|
||||
|
||||
for (size_t i = 0; i < aggregates_size; ++i)
|
||||
if (!aggregate_functions[i]->isState())
|
||||
aggregate_functions[i]->destroy(data + offsets_of_aggregate_states[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -563,6 +564,7 @@ Block Aggregator::convertToBlock(AggregatedDataVariants & data_variants, bool fi
|
||||
{
|
||||
/// Столбец ColumnAggregateFunction захватывает разделяемое владение ареной с состояниями агрегатных функций.
|
||||
ColumnAggregateFunction & column_aggregate_func = static_cast<ColumnAggregateFunction &>(*column.column);
|
||||
|
||||
for (size_t j = 0; j < data_variants.aggregates_pools.size(); ++j)
|
||||
column_aggregate_func.addArena(data_variants.aggregates_pools[j]);
|
||||
}
|
||||
@ -810,6 +812,7 @@ void Aggregator::destroyAllAggregateStates(AggregatedDataVariants & result)
|
||||
{
|
||||
AggregatedDataWithoutKey & res_data = result.without_key;
|
||||
|
||||
if (nullptr != res_data)
|
||||
for (size_t i = 0; i < aggregates_size; ++i)
|
||||
if (!aggregate_functions[i]->isState())
|
||||
aggregate_functions[i]->destroy(res_data + offsets_of_aggregate_states[i]);
|
||||
|
Loading…
Reference in New Issue
Block a user