dbms: fixed leaks [#METR-15352].

This commit is contained in:
Alexey Milovidov 2015-03-05 08:42:42 +03:00
parent bd4b866dc8
commit 577a7d102d
5 changed files with 16 additions and 14 deletions

View File

@ -156,8 +156,9 @@ typedef ColumnConst<Array> ColumnConstArray;
template <typename T> ColumnPtr ColumnConst<T>::convertToFullColumn() const template <typename T> ColumnPtr ColumnConst<T>::convertToFullColumn() const
{ {
ColumnVector<T> * res = new ColumnVector<T>; ColumnVector<T> * res_ = new ColumnVector<T>;
res->getData().assign(s, data); ColumnPtr res = res_;
res_->getData().assign(s, data);
return res; return res;
} }

View File

@ -1324,7 +1324,6 @@ public:
if (col_fstr_in) if (col_fstr_in)
{ {
ColumnString * col_str = new ColumnString; ColumnString * col_str = new ColumnString;
col_res = col_str; col_res = col_str;
ColumnString::Chars_t & out_vec = col_str->getChars(); ColumnString::Chars_t & out_vec = col_str->getChars();

View File

@ -408,6 +408,7 @@ public:
if (const ColumnUInt32 * times = typeid_cast<const ColumnUInt32 *>(&*block.getByPosition(arguments[0]).column)) if (const ColumnUInt32 * times = typeid_cast<const ColumnUInt32 *>(&*block.getByPosition(arguments[0]).column))
{ {
ColumnUInt32 * res = new ColumnUInt32; ColumnUInt32 * res = new ColumnUInt32;
ColumnPtr res_holder = res;
ColumnUInt32::Container_t & res_vec = res->getData(); ColumnUInt32::Container_t & res_vec = res->getData();
const ColumnUInt32::Container_t & vec = times->getData(); const ColumnUInt32::Container_t & vec = times->getData();
@ -417,7 +418,7 @@ public:
for (size_t i = 0; i < size; ++i) for (size_t i = 0; i < size; ++i)
res_vec[i] = vec[i] / TIME_SLOT_SIZE * TIME_SLOT_SIZE; res_vec[i] = vec[i] / TIME_SLOT_SIZE * TIME_SLOT_SIZE;
block.getByPosition(result).column = res; block.getByPosition(result).column = res_holder;
} }
else if (const ColumnConstUInt32 * const_times = typeid_cast<const ColumnConstUInt32 *>(&*block.getByPosition(arguments[0]).column)) else if (const ColumnConstUInt32 * const_times = typeid_cast<const ColumnConstUInt32 *>(&*block.getByPosition(arguments[0]).column))
{ {
@ -551,22 +552,23 @@ public:
const ColumnConstUInt32 * const_durations = typeid_cast<const ColumnConstUInt32 *>(&*block.getByPosition(arguments[1]).column); const ColumnConstUInt32 * const_durations = typeid_cast<const ColumnConstUInt32 *>(&*block.getByPosition(arguments[1]).column);
ColumnArray * res = new ColumnArray(new ColumnUInt32); ColumnArray * res = new ColumnArray(new ColumnUInt32);
ColumnPtr res_holder = res;
ColumnUInt32::Container_t & res_values = typeid_cast<ColumnUInt32 &>(res->getData()).getData(); ColumnUInt32::Container_t & res_values = typeid_cast<ColumnUInt32 &>(res->getData()).getData();
if (starts && durations) if (starts && durations)
{ {
TimeSlotsImpl<UInt32>::vector_vector(starts->getData(), durations->getData(), res_values, res->getOffsets()); TimeSlotsImpl<UInt32>::vector_vector(starts->getData(), durations->getData(), res_values, res->getOffsets());
block.getByPosition(result).column = res; block.getByPosition(result).column = res_holder;
} }
else if (starts && const_durations) else if (starts && const_durations)
{ {
TimeSlotsImpl<UInt32>::vector_constant(starts->getData(), const_durations->getData(), res_values, res->getOffsets()); TimeSlotsImpl<UInt32>::vector_constant(starts->getData(), const_durations->getData(), res_values, res->getOffsets());
block.getByPosition(result).column = res; block.getByPosition(result).column = res_holder;
} }
else if (const_starts && durations) else if (const_starts && durations)
{ {
TimeSlotsImpl<UInt32>::constant_vector(const_starts->getData(), durations->getData(), res_values, res->getOffsets()); TimeSlotsImpl<UInt32>::constant_vector(const_starts->getData(), durations->getData(), res_values, res->getOffsets());
block.getByPosition(result).column = res; block.getByPosition(result).column = res_holder;
} }
else if (const_starts && const_durations) else if (const_starts && const_durations)
{ {

View File

@ -338,6 +338,7 @@ public:
typeid_cast<const ColumnConstString *>(&*block.getByPosition(arrayArgumentPosition).column); typeid_cast<const ColumnConstString *>(&*block.getByPosition(arrayArgumentPosition).column);
ColumnArray * col_res = new ColumnArray(new ColumnString); ColumnArray * col_res = new ColumnArray(new ColumnString);
ColumnPtr col_res_holder = col_res;
ColumnString & res_strings = typeid_cast<ColumnString &>(col_res->getData()); ColumnString & res_strings = typeid_cast<ColumnString &>(col_res->getData());
ColumnArray::Offsets_t & res_offsets = col_res->getOffsets(); ColumnArray::Offsets_t & res_offsets = col_res->getOffsets();
ColumnString::Chars_t & res_strings_chars = res_strings.getChars(); ColumnString::Chars_t & res_strings_chars = res_strings.getChars();
@ -385,7 +386,7 @@ public:
res_offsets.push_back(current_dst_offset); res_offsets.push_back(current_dst_offset);
} }
block.getByPosition(result).column = col_res; block.getByPosition(result).column = col_res_holder;
} }
else if (col_const_str) else if (col_const_str)
{ {

View File

@ -109,8 +109,8 @@ namespace VisibleWidth
if (const ColumnVector<T> * col = typeid_cast<const ColumnVector<T> *>(&*column)) if (const ColumnVector<T> * col = typeid_cast<const ColumnVector<T> *>(&*column))
{ {
ColumnUInt64 * res = new ColumnUInt64(column->size()); ColumnUInt64 * res = new ColumnUInt64(column->size());
numWidthVector(col->getData(), res->getData());
block.getByPosition(result).column = res; block.getByPosition(result).column = res;
numWidthVector(col->getData(), res->getData());
return true; return true;
} }
else else
@ -158,20 +158,20 @@ void FunctionVisibleWidth::execute(Block & block, const ColumnNumbers & argument
else if (const ColumnString * col = typeid_cast<const ColumnString *>(&*column)) else if (const ColumnString * col = typeid_cast<const ColumnString *>(&*column))
{ {
ColumnUInt64 * res = new ColumnUInt64(rows); ColumnUInt64 * res = new ColumnUInt64(rows);
stringWidthVector(col->getChars(), col->getOffsets(), res->getData());
block.getByPosition(result).column = res; block.getByPosition(result).column = res;
stringWidthVector(col->getChars(), col->getOffsets(), res->getData());
} }
else if (const ColumnFixedString * col = typeid_cast<const ColumnFixedString *>(&*column)) else if (const ColumnFixedString * col = typeid_cast<const ColumnFixedString *>(&*column))
{ {
ColumnUInt64 * res = new ColumnUInt64(rows); ColumnUInt64 * res = new ColumnUInt64(rows);
stringWidthFixedVector(col->getChars(), col->getN(), res->getData());
block.getByPosition(result).column = res; block.getByPosition(result).column = res;
stringWidthFixedVector(col->getChars(), col->getN(), res->getData());
} }
else if (const ColumnConstString * col = typeid_cast<const ColumnConstString *>(&*column)) else if (const ColumnConstString * col = typeid_cast<const ColumnConstString *>(&*column))
{ {
UInt64 res = 0; UInt64 res = 0;
stringWidthConstant(col->getData(), res);
block.getByPosition(result).column = new ColumnConstUInt64(rows, res); block.getByPosition(result).column = new ColumnConstUInt64(rows, res);
stringWidthConstant(col->getData(), res);
} }
else if (const ColumnArray * col = typeid_cast<const ColumnArray *>(&*column)) else if (const ColumnArray * col = typeid_cast<const ColumnArray *>(&*column))
{ {
@ -191,6 +191,7 @@ void FunctionVisibleWidth::execute(Block & block, const ColumnNumbers & argument
/// Теперь суммируем и кладём в результат. /// Теперь суммируем и кладём в результат.
ColumnUInt64 * res = new ColumnUInt64(rows); ColumnUInt64 * res = new ColumnUInt64(rows);
block.getByPosition(result).column = res;
ColumnUInt64::Container_t & vec = res->getData(); ColumnUInt64::Container_t & vec = res->getData();
size_t additional_symbols = 0; /// Кавычки. size_t additional_symbols = 0; /// Кавычки.
@ -223,8 +224,6 @@ void FunctionVisibleWidth::execute(Block & block, const ColumnNumbers & argument
vec[i] = 1 + std::max(static_cast<size_t>(1), vec[i] = 1 + std::max(static_cast<size_t>(1),
(i == 0 ? col->getOffsets()[0] : (col->getOffsets()[i] - col->getOffsets()[i - 1])) * nested_length); (i == 0 ? col->getOffsets()[0] : (col->getOffsets()[i] - col->getOffsets()[i - 1])) * nested_length);
} }
block.getByPosition(result).column = res;
} }
else if (const ColumnTuple * col = typeid_cast<const ColumnTuple *>(&*column)) else if (const ColumnTuple * col = typeid_cast<const ColumnTuple *>(&*column))
{ {