diff --git a/src/Functions/materialize.cpp b/src/Functions/materialize.cpp index c7e02e615daf5c6c23eb248b209672e1384deca2..c9fdd019be78162ebf7a8aadcd538848dfecb146 100644 --- a/src/Functions/materialize.cpp +++ b/src/Functions/materialize.cpp @@ -1,51 +1,9 @@ -#include #include +#include namespace DB { -namespace -{ - -/** materialize(x) - materialize the constant - */ -class FunctionMaterialize : public IFunction -{ -public: - static constexpr auto name = "materialize"; - static FunctionPtr create(const Context &) - { - return std::make_shared(); - } - - bool useDefaultImplementationForNulls() const override - { - return false; - } - - /// Get the function name. - String getName() const override - { - return name; - } - - size_t getNumberOfArguments() const override - { - return 1; - } - - DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override - { - return arguments[0]; - } - - ColumnPtr executeImpl(ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override - { - return arguments[0].column->convertToFullColumnIfConst(); - } -}; - -} void registerFunctionMaterialize(FunctionFactory & factory) { diff --git a/src/Functions/materialize.h b/src/Functions/materialize.h new file mode 100644 index 0000000000000000000000000000000000000000..9146911ba9374871713279c1a7a92b8cbd3bad90 --- /dev/null +++ b/src/Functions/materialize.h @@ -0,0 +1,46 @@ +#pragma once +#include +#include + +namespace DB +{ + +/** materialize(x) - materialize the constant + */ +class FunctionMaterialize : public IFunction +{ +public: + static constexpr auto name = "materialize"; + static FunctionPtr create(const Context &) + { + return std::make_shared(); + } + + bool useDefaultImplementationForNulls() const override + { + return false; + } + + /// Get the function name. + String getName() const override + { + return name; + } + + size_t getNumberOfArguments() const override + { + return 1; + } + + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override + { + return arguments[0]; + } + + ColumnPtr executeImpl(ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override + { + return arguments[0].column->convertToFullColumnIfConst(); + } +}; + +} diff --git a/src/Interpreters/ActionsDAG.cpp b/src/Interpreters/ActionsDAG.cpp index 0c2e3e36133b0c66947880bb182fcbe7636645c5..cc6d03be440c27c10e35e8f547945556fbbc8125 100644 --- a/src/Interpreters/ActionsDAG.cpp +++ b/src/Interpreters/ActionsDAG.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -575,6 +576,11 @@ ActionsDAGPtr ActionsDAG::makeConvertingActions( FunctionOverloadResolverPtr func_builder_cast = std::make_shared(CastOverloadResolver::createImpl(false)); + FunctionOverloadResolverPtr func_builder_materialize = + std::make_shared( + std::make_unique( + std::make_shared())); + std::map> inputs; if (mode == MatchColumnsMode::Name) { @@ -641,6 +647,12 @@ ActionsDAGPtr ActionsDAG::makeConvertingActions( src_node = &actions_dag->addFunction(func_builder_cast, std::move(children), {}, true); } + if (src_node->column && isColumnConst(*src_node->column)) + { + Inputs children = {src_node}; + src_node = &actions_dag->addFunction(func_builder_materialize, std::move(children), {}, true); + } + if (src_node->result_name != res_elem.name) src_node = const_cast(&actions_dag->addAlias(src_node->result_name, res_elem.name, true));