dbms: development [#METR-10894].

This commit is contained in:
Alexey Milovidov 2014-06-05 23:52:13 +04:00
parent ac06ebccf6
commit 16f092d87b
4 changed files with 23 additions and 17 deletions

View File

@ -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"; }

View File

@ -50,6 +50,7 @@ namespace DB
* пары записей с разными значениями sign_column для одного значения первичного ключа. * пары записей с разными значениями sign_column для одного значения первичного ключа.
* (см. CollapsingSortedBlockInputStream.h) * (см. CollapsingSortedBlockInputStream.h)
* - Summing - при склейке кусков, при совпадении PK суммировать все числовые столбцы, не входящие в PK. * - Summing - при склейке кусков, при совпадении PK суммировать все числовые столбцы, не входящие в PK.
* - Aggregating - при склейке кусков, при совпадении PK, делается слияние состояний столбцов-агрегатных функций.
*/ */
/** Этот класс хранит список кусков и параметры структуры данных. /** Этот класс хранит список кусков и параметры структуры данных.

View File

@ -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);
} }
} }
} }

View File

@ -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)