2012-08-26 06:48:39 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <DB/DataTypes/DataTypeArray.h>
|
|
|
|
|
#include <DB/Columns/ColumnArray.h>
|
|
|
|
|
#include <DB/Functions/IFunction.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/** Функции по работе с массивами:
|
|
|
|
|
*
|
|
|
|
|
* array(с1, с2, ...) - создать массив из констант.
|
2012-09-03 04:45:46 +00:00
|
|
|
|
* TODO arrayElement(arr, i) - получить элемент массива.
|
2012-08-26 06:48:39 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
class FunctionArray : public IFunction
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
/// Получить имя функции.
|
|
|
|
|
String getName() const
|
|
|
|
|
{
|
|
|
|
|
return "array";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
|
|
|
DataTypePtr getReturnType(const DataTypes & arguments) const
|
|
|
|
|
{
|
|
|
|
|
if (arguments.empty())
|
|
|
|
|
throw Exception("Function array requires at least one argument.", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
|
|
|
|
|
|
|
|
|
for (size_t i = 1, size = arguments.size(); i < size; ++i)
|
|
|
|
|
if (arguments[i]->getName() != arguments[0]->getName())
|
|
|
|
|
throw Exception("Arguments for function array must have same type.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
|
|
|
|
|
return new DataTypeArray(arguments[0]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Выполнить функцию над блоком.
|
|
|
|
|
void execute(Block & block, const ColumnNumbers & arguments, size_t result)
|
|
|
|
|
{
|
|
|
|
|
/// Все аргументы должны быть константами.
|
|
|
|
|
for (size_t i = 0, size = arguments.size(); i < size; ++i)
|
|
|
|
|
if (!block.getByPosition(arguments[i]).column->isConst())
|
|
|
|
|
throw Exception("Arguments for function array must be constant.", ErrorCodes::ILLEGAL_COLUMN);;
|
|
|
|
|
|
|
|
|
|
Array arr;
|
|
|
|
|
for (size_t i = 0, size = arguments.size(); i < size; ++i)
|
|
|
|
|
arr.push_back((*block.getByPosition(arguments[i]).column)[0]);
|
|
|
|
|
|
|
|
|
|
block.getByPosition(result).column = new ColumnConstArray(block.getByPosition(arguments[0]).column->size(), arr);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|