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()
{
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"; }

View File

@ -50,6 +50,7 @@ namespace DB
* пары записей с разными значениями sign_column для одного значения первичного ключа.
* (см. CollapsingSortedBlockInputStream.h)
* - 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)
{
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);
}
}
}

View File

@ -341,17 +341,18 @@ void Aggregator::destroyImpl(
{
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-ом) возникло
* после вставки ключа в хэш-таблицу, но до создания всех состояний агрегатных функций,
* то data будет равен nullptr-у.
*/
if (nullptr != data && !aggregate_functions[i]->isState())
/** Если исключение (обычно нехватка памяти, кидается MemoryTracker-ом) возникло
* после вставки ключа в хэш-таблицу, но до создания всех состояний агрегатных функций,
* то data будет равен nullptr-у.
*/
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,9 +812,10 @@ void Aggregator::destroyAllAggregateStates(AggregatedDataVariants & result)
{
AggregatedDataWithoutKey & res_data = result.without_key;
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]);
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]);
}
if (result.type == AggregatedDataVariants::KEY_64)