From ab04e6f5be0188abd6a0ba478c306ed22c70571c Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Tue, 17 May 2016 21:25:47 +0300 Subject: [PATCH] Added miscellaneous function blockNumber [#METR-21347]. --- .../DB/Functions/FunctionsMiscellaneous.h | 36 +++++++++++++++++++ dbms/src/Functions/FunctionsMiscellaneous.cpp | 1 + 2 files changed, 37 insertions(+) diff --git a/dbms/include/DB/Functions/FunctionsMiscellaneous.h b/dbms/include/DB/Functions/FunctionsMiscellaneous.h index 3553f45c433..90fba3070c3 100644 --- a/dbms/include/DB/Functions/FunctionsMiscellaneous.h +++ b/dbms/include/DB/Functions/FunctionsMiscellaneous.h @@ -288,6 +288,42 @@ public: }; +/** Инкрементальный номер блока среди вызовов этой функции. */ +class FunctionBlockNumber : public IFunction +{ +private: + std::atomic 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: diff --git a/dbms/src/Functions/FunctionsMiscellaneous.cpp b/dbms/src/Functions/FunctionsMiscellaneous.cpp index 4bbdad83011..0b1237e0cfc 100644 --- a/dbms/src/Functions/FunctionsMiscellaneous.cpp +++ b/dbms/src/Functions/FunctionsMiscellaneous.cpp @@ -381,6 +381,7 @@ void registerFunctionsMiscellaneous(FunctionFactory & factory) factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); + factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); factory.registerFunction();