diff --git a/dbms/include/DB/Functions/FunctionsMiscellaneous.h b/dbms/include/DB/Functions/FunctionsMiscellaneous.h index 063203625014600bac6c7d944b337afddad7122a..ae606f531820f5f01958d08b550df8e8346c734a 100644 --- a/dbms/include/DB/Functions/FunctionsMiscellaneous.h +++ b/dbms/include/DB/Functions/FunctionsMiscellaneous.h @@ -534,6 +534,36 @@ public: }; +class FunctionIdentity : public IFunction +{ +public: + static constexpr auto name = "identity"; + static IFunction * create(const Context & context) { return new FunctionIdentity; } + + /// Получить имя функции. + String getName() const + { + return name; + } + + /// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение. + DataTypePtr getReturnType(const DataTypes & arguments) const + { + if (arguments.size() != 1) + throw Exception("Function " + getName() + " requires exactly one argument.", + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); + + return arguments.front()->clone(); + } + + /// Выполнить функцию над блоком. + void execute(Block & block, const ColumnNumbers & arguments, size_t result) + { + block.getByPosition(result).column = block.getByPosition(arguments.front()).column; + } +}; + + class FunctionArrayJoin : public IFunction { public: diff --git a/dbms/src/Functions/FunctionsMiscellaneous.cpp b/dbms/src/Functions/FunctionsMiscellaneous.cpp index e2a478933c177719059f8cd77548dd581c15fe0f..08b51f8ba5fcc0800ca213d60e1284ffadb3c22b 100644 --- a/dbms/src/Functions/FunctionsMiscellaneous.cpp +++ b/dbms/src/Functions/FunctionsMiscellaneous.cpp @@ -325,6 +325,7 @@ void registerFunctionsMiscellaneous(FunctionFactory & factory) factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); + factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); diff --git a/dbms/tests/queries/0_stateless/00194_identity.reference b/dbms/tests/queries/0_stateless/00194_identity.reference new file mode 100644 index 0000000000000000000000000000000000000000..72749c905a314fb1c4bdabd91f28aef935074b97 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00194_identity.reference @@ -0,0 +1 @@ +1 1 1 diff --git a/dbms/tests/queries/0_stateless/00194_identity.sql b/dbms/tests/queries/0_stateless/00194_identity.sql new file mode 100644 index 0000000000000000000000000000000000000000..cb2e7264b16c6535e0cb80c324a98b9f610166b7 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00194_identity.sql @@ -0,0 +1 @@ +SELECT identity(1 AS a) AS b, a, b;