From 571af20a4f0176c8273809a8eb387753949898a2 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 22 May 2017 01:27:41 +0300 Subject: [PATCH] Added function defaultValueForArgumentType [#CLICKHOUSE-3013]. --- dbms/src/Functions/FunctionsMiscellaneous.cpp | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/dbms/src/Functions/FunctionsMiscellaneous.cpp b/dbms/src/Functions/FunctionsMiscellaneous.cpp index 1a130ca8a8..ebef13e405 100644 --- a/dbms/src/Functions/FunctionsMiscellaneous.cpp +++ b/dbms/src/Functions/FunctionsMiscellaneous.cpp @@ -255,6 +255,44 @@ public: }; +/// Returns global default value for type of passed argument (example: 0 for numeric types, '' for String). +class FunctionDefaultValueOfArgumentType : public IFunction +{ +public: + static constexpr auto name = "defaultValueOfArgumentType"; + static FunctionPtr create(const Context & context) + { + return std::make_shared(); + } + + String getName() const override + { + return name; + } + + bool hasSpecialSupportForNulls() const override + { + return true; + } + + size_t getNumberOfArguments() const override + { + return 1; + } + + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override + { + return arguments[0]->clone(); + } + + void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override + { + IDataType & type = *block.getByPosition(arguments[0]).type; + block.getByPosition(result).column = type.createConstColumn(block.rows(), type.getDefault()); + } +}; + + class FunctionBlockSize : public IFunction { public: @@ -1762,6 +1800,7 @@ void registerFunctionsMiscellaneous(FunctionFactory & factory) factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); + factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); -- GitLab