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()
|
~ColumnAggregateFunction()
|
||||||
{
|
{
|
||||||
if (!func->hasTrivialDestructor())
|
IAggregateFunction * function = func;
|
||||||
|
|
||||||
|
if (!function->hasTrivialDestructor())
|
||||||
for (size_t i = 0, s = data.size(); i < s; ++i)
|
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"; }
|
std::string getName() const { return "ColumnAggregateFunction"; }
|
||||||
|
@ -50,6 +50,7 @@ namespace DB
|
|||||||
* пары записей с разными значениями sign_column для одного значения первичного ключа.
|
* пары записей с разными значениями sign_column для одного значения первичного ключа.
|
||||||
* (см. CollapsingSortedBlockInputStream.h)
|
* (см. CollapsingSortedBlockInputStream.h)
|
||||||
* - Summing - при склейке кусков, при совпадении PK суммировать все числовые столбцы, не входящие в PK.
|
* - 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)
|
for (NamesAndTypesList::const_iterator it = required_columns->begin(); it != required_columns->end(); ++it)
|
||||||
{
|
{
|
||||||
if (!this->has(it->first))
|
if (!has(it->first))
|
||||||
{
|
{
|
||||||
ColumnWithNameAndType col;
|
ColumnWithNameAndType col;
|
||||||
col.name = it->first;
|
col.name = it->first;
|
||||||
col.type = it->second;
|
col.type = it->second;
|
||||||
col.column = dynamic_cast<IColumnConst &>(*it->second->createConstColumn(
|
col.column = dynamic_cast<IColumnConst &>(*it->second->createConstColumn(
|
||||||
this->rows(), it->second->getDefault())).convertToFullColumn();
|
rows(), it->second->getDefault())).convertToFullColumn();
|
||||||
this->insert(col);
|
insert(col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -341,17 +341,18 @@ void Aggregator::destroyImpl(
|
|||||||
{
|
{
|
||||||
for (typename Method::const_iterator it = method.data.begin(); it != method.data.end(); ++it)
|
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);
|
||||||
{
|
|
||||||
char * data = Method::getAggregateData(it->second);
|
|
||||||
|
|
||||||
/** Если исключение (обычно нехватка памяти, кидается MemoryTracker-ом) возникло
|
/** Если исключение (обычно нехватка памяти, кидается MemoryTracker-ом) возникло
|
||||||
* после вставки ключа в хэш-таблицу, но до создания всех состояний агрегатных функций,
|
* после вставки ключа в хэш-таблицу, но до создания всех состояний агрегатных функций,
|
||||||
* то data будет равен nullptr-у.
|
* то 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]);
|
aggregate_functions[i]->destroy(data + offsets_of_aggregate_states[i]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,6 +564,7 @@ Block Aggregator::convertToBlock(AggregatedDataVariants & data_variants, bool fi
|
|||||||
{
|
{
|
||||||
/// Столбец ColumnAggregateFunction захватывает разделяемое владение ареной с состояниями агрегатных функций.
|
/// Столбец ColumnAggregateFunction захватывает разделяемое владение ареной с состояниями агрегатных функций.
|
||||||
ColumnAggregateFunction & column_aggregate_func = static_cast<ColumnAggregateFunction &>(*column.column);
|
ColumnAggregateFunction & column_aggregate_func = static_cast<ColumnAggregateFunction &>(*column.column);
|
||||||
|
|
||||||
for (size_t j = 0; j < data_variants.aggregates_pools.size(); ++j)
|
for (size_t j = 0; j < data_variants.aggregates_pools.size(); ++j)
|
||||||
column_aggregate_func.addArena(data_variants.aggregates_pools[j]);
|
column_aggregate_func.addArena(data_variants.aggregates_pools[j]);
|
||||||
}
|
}
|
||||||
@ -810,9 +812,10 @@ void Aggregator::destroyAllAggregateStates(AggregatedDataVariants & result)
|
|||||||
{
|
{
|
||||||
AggregatedDataWithoutKey & res_data = result.without_key;
|
AggregatedDataWithoutKey & res_data = result.without_key;
|
||||||
|
|
||||||
for (size_t i = 0; i < aggregates_size; ++i)
|
if (nullptr != res_data)
|
||||||
if (!aggregate_functions[i]->isState())
|
for (size_t i = 0; i < aggregates_size; ++i)
|
||||||
aggregate_functions[i]->destroy(res_data + offsets_of_aggregate_states[i]);
|
if (!aggregate_functions[i]->isState())
|
||||||
|
aggregate_functions[i]->destroy(res_data + offsets_of_aggregate_states[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result.type == AggregatedDataVariants::KEY_64)
|
if (result.type == AggregatedDataVariants::KEY_64)
|
||||||
|
Loading…
Reference in New Issue
Block a user