From 74a8b14ca489fb3a81eeb3f79584559153ad4be1 Mon Sep 17 00:00:00 2001 From: Pavel Kruglov Date: Wed, 28 Apr 2021 01:31:49 +0300 Subject: [PATCH] Fix tests --- src/Columns/ColumnFunction.cpp | 12 ++++++------ src/Columns/ColumnFunction.h | 6 +++--- src/Columns/MaskOperations.cpp | 1 + src/Interpreters/ExpressionActions.cpp | 12 ++++++++++-- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/Columns/ColumnFunction.cpp b/src/Columns/ColumnFunction.cpp index b83dcda5c88..2555b7d92c0 100644 --- a/src/Columns/ColumnFunction.cpp +++ b/src/Columns/ColumnFunction.cpp @@ -15,10 +15,10 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } -ColumnFunction::ColumnFunction(size_t size, FunctionBasePtr function_, const ColumnsWithTypeAndName & columns_to_capture) +ColumnFunction::ColumnFunction(size_t size, FunctionBasePtr function_, const ColumnsWithTypeAndName & columns_to_capture, bool ignore_arguments_types) : size_(size), function(function_) { - appendArguments(columns_to_capture); + appendArguments(columns_to_capture, ignore_arguments_types); } MutableColumnPtr ColumnFunction::cloneResized(size_t size) const @@ -173,7 +173,7 @@ size_t ColumnFunction::allocatedBytes() const return total_size; } -void ColumnFunction::appendArguments(const ColumnsWithTypeAndName & columns) +void ColumnFunction::appendArguments(const ColumnsWithTypeAndName & columns, bool ignore_arguments_types) { auto args = function->getArgumentTypes().size(); auto were_captured = captured_columns.size(); @@ -186,15 +186,15 @@ void ColumnFunction::appendArguments(const ColumnsWithTypeAndName & columns) + ".", ErrorCodes::LOGICAL_ERROR); for (const auto & column : columns) - appendArgument(column); + appendArgument(column, ignore_arguments_types); } -void ColumnFunction::appendArgument(const ColumnWithTypeAndName & column) +void ColumnFunction::appendArgument(const ColumnWithTypeAndName & column, bool ignore_argument_type) { const auto & argumnet_types = function->getArgumentTypes(); auto index = captured_columns.size(); - if (!column.type->equals(*argumnet_types[index])) + if (!ignore_argument_type && !column.type->equals(*argumnet_types[index])) throw Exception("Cannot capture column " + std::to_string(argumnet_types.size()) + " because it has incompatible type: got " + column.type->getName() + ", but " + argumnet_types[index]->getName() + " is expected.", ErrorCodes::LOGICAL_ERROR); diff --git a/src/Columns/ColumnFunction.h b/src/Columns/ColumnFunction.h index 895f61ec6db..8ed7b393f80 100644 --- a/src/Columns/ColumnFunction.h +++ b/src/Columns/ColumnFunction.h @@ -25,7 +25,7 @@ class ColumnFunction final : public COWHelper private: friend class COWHelper; - ColumnFunction(size_t size, FunctionBasePtr function_, const ColumnsWithTypeAndName & columns_to_capture); + ColumnFunction(size_t size, FunctionBasePtr function_, const ColumnsWithTypeAndName & columns_to_capture, bool ignore_arguments_types = false); public: const char * getFamilyName() const override { return "Function"; } @@ -51,7 +51,7 @@ public: size_t byteSizeAt(size_t n) const override; size_t allocatedBytes() const override; - void appendArguments(const ColumnsWithTypeAndName & columns); + void appendArguments(const ColumnsWithTypeAndName & columns, bool ignore_arguments_types = false); ColumnWithTypeAndName reduce(bool reduce_arguments = false) const; Field operator[](size_t) const override @@ -159,7 +159,7 @@ private: FunctionBasePtr function; ColumnsWithTypeAndName captured_columns; - void appendArgument(const ColumnWithTypeAndName & column); + void appendArgument(const ColumnWithTypeAndName & column, bool ignore_argument_type = false); }; } diff --git a/src/Columns/MaskOperations.cpp b/src/Columns/MaskOperations.cpp index d8a2d0a8eb0..533669a6fe7 100644 --- a/src/Columns/MaskOperations.cpp +++ b/src/Columns/MaskOperations.cpp @@ -236,6 +236,7 @@ void maskedExecute(ColumnWithTypeAndName & column, const PaddedPODArray & if (default_value_for_expanding_mask) { result.column = result.column->convertToFullColumnIfLowCardinality(); + result.column = result.column->convertToFullColumnIfConst(); expandMaskColumnByMask(result.column, mask, reverse, *default_value_for_expanding_mask); } else diff --git a/src/Interpreters/ExpressionActions.cpp b/src/Interpreters/ExpressionActions.cpp index 6fb3dbbb20a..fb5c3aa8039 100644 --- a/src/Interpreters/ExpressionActions.cpp +++ b/src/Interpreters/ExpressionActions.cpp @@ -74,8 +74,15 @@ bool ExpressionActions::rewriteShortCircuitArguments(const ActionsDAG::NodeRawCo bool have_rewritten_child = false; for (const auto * child : children) { - if (!need_outside.contains(child) || need_outside.at(child) || child->is_lazy_executed) + if (!need_outside.contains(child) || need_outside.at(child)) continue; + + if (child->is_lazy_executed) + { + have_rewritten_child = true; + continue; + } + switch (child->type) { case ActionsDAG::ActionType::FUNCTION: @@ -92,6 +99,7 @@ bool ExpressionActions::rewriteShortCircuitArguments(const ActionsDAG::NodeRawCo break; } } + return have_rewritten_child; } @@ -419,7 +427,7 @@ static void executeAction(const ExpressionActions::Action & action, ExecutionCon } if (action.node->is_lazy_executed) - res_column.column = ColumnFunction::create(num_rows, action.node->function_base, std::move(arguments)); + res_column.column = ColumnFunction::create(num_rows, action.node->function_base, std::move(arguments), true); else { ProfileEvents::increment(ProfileEvents::FunctionExecute);