dbms: fixed error [#CONV-7444].

This commit is contained in:
Alexey Milovidov 2013-06-08 20:19:29 +00:00
parent 1469ea51b3
commit 9d1142b028
6 changed files with 24 additions and 11 deletions

View File

@ -68,10 +68,14 @@ public:
NamesAndTypesList getColumnsList() const;
/** Возвращает количество строк в блоке.
* Заодно проверяет, что все столбцы кроме констант (которые содержат единственное значение),
* содержат одинаковое число значений.
* Заодно проверяет, что все столбцы содержат одинаковое число значений.
*/
size_t rows() const;
/** То же самое, но без проверки - берёт количество строк из первого столбца, если он есть или возвращает 0.
*/
size_t rowsInFirstColumn() const;
size_t columns() const;
/// Приблизительное количество байт в оперативке - для профайлинга.

View File

@ -188,7 +188,7 @@ private:
Field value = col_array->getData().at(index);
block.getByPosition(result).column = block.getByPosition(result).type->createConstColumn(
block.getByPosition(0).column->size(),
block.rowsInFirstColumn(),
value);
return true;
@ -424,7 +424,7 @@ private:
}
block.getByPosition(result).column = block.getByPosition(result).type->createConstColumn(
block.getByPosition(0).column->size(),
block.rowsInFirstColumn(),
static_cast<typename NearestFieldType<typename IndexConv::ResultType>::Type>(current));
return true;

View File

@ -239,7 +239,7 @@ public:
void execute(Block & block, const ColumnNumbers & arguments, size_t result)
{
block.getByPosition(result).column = new ColumnConstUInt32(
block.getByPosition(0).column->size(),
block.rowsInFirstColumn(),
time(0));
}
};
@ -288,7 +288,7 @@ public:
}
else if (const ColumnConstUInt32 * const_times = dynamic_cast<const ColumnConstUInt32 *>(&*block.getByPosition(arguments[0]).column))
{
block.getByPosition(result).column = new ColumnConstUInt32(block.getByPosition(0).column->size(), const_times->getData() / TIME_SLOT_SIZE * TIME_SLOT_SIZE);
block.getByPosition(result).column = new ColumnConstUInt32(block.rowsInFirstColumn(), const_times->getData() / TIME_SLOT_SIZE * TIME_SLOT_SIZE);
}
else
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName()
@ -436,7 +436,7 @@ public:
{
Array const_res;
TimeSlotsImpl<UInt32>::constant_constant(const_starts->getData(), const_durations->getData(), const_res);
block.getByPosition(result).column = new ColumnConstArray(block.getByPosition(0).column->size(), const_res, new DataTypeArray(new DataTypeDateTime));
block.getByPosition(result).column = new ColumnConstArray(block.rowsInFirstColumn(), const_res, new DataTypeArray(new DataTypeDateTime));
}
else
throw Exception("Illegal columns " + block.getByPosition(arguments[0]).column->getName()

View File

@ -341,7 +341,7 @@ public:
/// Выполнить функцию над блоком.
void execute(Block & block, const ColumnNumbers & arguments, size_t result)
{
block.getByPosition(result).column = new ColumnConstString(block.getByPosition(0).column->size(), block.getByPosition(arguments[0]).type->getName());
block.getByPosition(result).column = new ColumnConstString(block.rowsInFirstColumn(), block.getByPosition(arguments[0]).type->getName());
}
};
@ -369,7 +369,7 @@ public:
/// Выполнить функцию над блоком.
void execute(Block & block, const ColumnNumbers & arguments, size_t result)
{
size_t size = block.getByPosition(0).column->size();
size_t size = block.rowsInFirstColumn();
block.getByPosition(result).column = ColumnConstUInt64(size, size).convertToFullColumn();
}
};
@ -638,7 +638,7 @@ public:
/// Выполнить функцию над блоком.
void execute(Block & block, const ColumnNumbers & arguments, size_t result)
{
block.getByPosition(result).column = new ColumnConstUInt8(block.getByPosition(0).column->size(), 0);
block.getByPosition(result).column = new ColumnConstUInt8(block.rowsInFirstColumn(), 0);
}
};

View File

@ -116,7 +116,7 @@ public:
typename ColumnVector<ToType>::Container_t & vec_to = col_to->getData();
size_t size = block.getByPosition(0).column->size();
size_t size = block.rowsInFirstColumn();
vec_to.resize(size);
Impl::execute(vec_to);
}

View File

@ -185,6 +185,15 @@ size_t Block::rows() const
}
size_t Block::rowsInFirstColumn() const
{
if (data.empty() || data.front().column.isNull())
return 0;
return data.front().column->size();
}
size_t Block::columns() const
{
return data.size();