Added miscellaneous function blockNumber [#METR-21347].

This commit is contained in:
Alexey Milovidov 2016-05-17 21:25:47 +03:00
parent b9965978f0
commit ab04e6f5be
2 changed files with 37 additions and 0 deletions

View File

@ -288,6 +288,42 @@ public:
};
/** Инкрементальный номер блока среди вызовов этой функции. */
class FunctionBlockNumber : public IFunction
{
private:
std::atomic<size_t> block_number {0};
public:
static constexpr auto name = "blockNumber";
static IFunction * create(const Context & context) { return new FunctionBlockNumber; }
/// Получить имя функции.
String getName() const override
{
return name;
}
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
DataTypePtr getReturnType(const DataTypes & arguments) const override
{
if (!arguments.empty())
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
+ toString(arguments.size()) + ", should be 0.",
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
return new DataTypeUInt64;
}
/// Выполнить функцию над блоком.
void execute(Block & block, const ColumnNumbers & arguments, size_t result) override
{
size_t current_block_number = block_number++;
block.getByPosition(result).column = ColumnConstUInt64(block.rowsInFirstColumn(), current_block_number).convertToFullColumn();
}
};
class FunctionSleep : public IFunction
{
public:

View File

@ -381,6 +381,7 @@ void registerFunctionsMiscellaneous(FunctionFactory & factory)
factory.registerFunction<FunctionToTypeName>();
factory.registerFunction<FunctionBlockSize>();
factory.registerFunction<FunctionRowNumberInBlock>();
factory.registerFunction<FunctionBlockNumber>();
factory.registerFunction<FunctionSleep>();
factory.registerFunction<FunctionMaterialize>();
factory.registerFunction<FunctionIgnore>();