dbms: fixed error with higher-order functions [#CONV-8757].

This commit is contained in:
Alexey Milovidov 2013-09-18 22:40:09 +00:00
parent 2d48435ecd
commit aa434e6830
3 changed files with 30 additions and 2 deletions

View File

@ -0,0 +1,25 @@
#pragma once
#include <DB/Columns/IColumnDummy.h>
namespace DB
{
/** Содержит промежуточные данные для вычисления выражений в функциях высшего порядка.
* Это - вложенный столбец произвольного размера.
* Сам ColumnReplicated притворяется, как столбец указанного в конструкторе размера.
*/
class ColumnReplicated : public IColumnDummy
{
public:
ColumnReplicated(size_t s_, ColumnPtr nested_) : IColumnDummy(s_), nested(nested_) {}
std::string getName() const { return "ColumnReplicated"; }
ColumnPtr cloneDummy(size_t s_) const { return new ColumnReplicated(s_, nested); }
ColumnPtr & getData() { return nested; }
private:
ColumnPtr nested;
};
}

View File

@ -5,6 +5,7 @@
#include <DB/DataTypes/DataTypesNumberFixed.h>
#include <DB/Columns/ColumnArray.h>
#include <DB/Columns/ColumnReplicated.h>
#include <DB/Columns/ColumnExpression.h>
#include <DB/Functions/IFunction.h>
@ -485,6 +486,7 @@ public:
ColumnWithNameAndType replicated_column = block.getByPosition(prerequisites[prerequisite_index]);
replicated_column.name = name;
replicated_column.column = dynamic_cast<ColumnReplicated &>(*replicated_column.column).getData();
temp_block.insert(replicated_column);
++prerequisite_index;

View File

@ -17,6 +17,7 @@
#include <DB/Columns/ColumnSet.h>
#include <DB/Columns/ColumnTuple.h>
#include <DB/Columns/ColumnArray.h>
#include <DB/Columns/ColumnReplicated.h>
#include <DB/Functions/IFunction.h>
@ -723,8 +724,8 @@ class FunctionReplicate : public IFunction
temp_column = const_array_column->convertToFullColumn();
array_column = dynamic_cast<ColumnArray *>(&*temp_column);
}
block.getByPosition(result).column = first_column->replicate(array_column->getOffsets());
block.getByPosition(result).column = new ColumnReplicated(first_column->size(), first_column->replicate(array_column->getOffsets()));
}
};