diff --git a/src/Interpreters/ExpressionActions.cpp b/src/Interpreters/ExpressionActions.cpp index bfd2ad13504..29dc1f1addb 100644 --- a/src/Interpreters/ExpressionActions.cpp +++ b/src/Interpreters/ExpressionActions.cpp @@ -44,7 +44,8 @@ namespace ErrorCodes ExpressionActions::~ExpressionActions() = default; -ExpressionActions::ExpressionActions(ActionsDAGPtr actions_dag_, const ExpressionActionsSettings & settings) +ExpressionActions::ExpressionActions(ActionsDAGPtr actions_dag_, const ExpressionActionsSettings & settings_) + : settings(settings_) { actions_dag = actions_dag_->clone(); @@ -55,8 +56,6 @@ ExpressionActions::ExpressionActions(ActionsDAGPtr actions_dag_, const Expressio linearizeActions(); - max_temporary_non_const_columns = settings.max_temporary_non_const_columns; - if (settings.max_temporary_columns && num_columns > settings.max_temporary_columns) throw Exception(ErrorCodes::TOO_MANY_TEMPORARY_COLUMNS, "Too many temporary columns: {}. Maximum: {}", @@ -261,14 +260,14 @@ std::string ExpressionActions::Action::toString() const void ExpressionActions::checkLimits(const ColumnsWithTypeAndName & columns) const { - if (max_temporary_non_const_columns) + if (settings.max_temporary_non_const_columns) { size_t non_const_columns = 0; for (const auto & column : columns) if (column.column && !isColumnConst(*column.column)) ++non_const_columns; - if (non_const_columns > max_temporary_non_const_columns) + if (non_const_columns > settings.max_temporary_non_const_columns) { WriteBufferFromOwnString list_of_non_const_columns; for (const auto & column : columns) @@ -276,7 +275,7 @@ void ExpressionActions::checkLimits(const ColumnsWithTypeAndName & columns) cons list_of_non_const_columns << "\n" << column.name; throw Exception("Too many temporary non-const columns:" + list_of_non_const_columns.str() - + ". Maximum: " + std::to_string(max_temporary_non_const_columns), + + ". Maximum: " + std::to_string(settings.max_temporary_non_const_columns), ErrorCodes::TOO_MANY_TEMPORARY_NON_CONST_COLUMNS); } } diff --git a/src/Interpreters/ExpressionActions.h b/src/Interpreters/ExpressionActions.h index 9863bcea06e..e8cef24f68d 100644 --- a/src/Interpreters/ExpressionActions.h +++ b/src/Interpreters/ExpressionActions.h @@ -78,12 +78,12 @@ private: ColumnNumbers result_positions; Block sample_block; - size_t max_temporary_non_const_columns = 0; + ExpressionActionsSettings settings; public: ExpressionActions() = delete; ~ExpressionActions(); - explicit ExpressionActions(ActionsDAGPtr actions_dag_, const ExpressionActionsSettings & settings); + explicit ExpressionActions(ActionsDAGPtr actions_dag_, const ExpressionActionsSettings & settings_); ExpressionActions(const ExpressionActions &) = default; ExpressionActions & operator=(const ExpressionActions &) = default; @@ -91,6 +91,7 @@ public: const std::list & getNodes() const { return actions_dag->getNodes(); } const ActionsDAG & getActionsDAG() const { return *actions_dag; } const ColumnNumbers & getResultPositions() const { return result_positions; } + const ExpressionActionsSettings & getSettings() const { return settings; } /// Get a list of input columns. Names getRequiredColumns() const; diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index fbe9e084c02..459c60dbe0c 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -869,7 +869,9 @@ JoinPtr SelectQueryExpressionAnalyzer::makeTableJoin( const ColumnsWithTypeAndName & right_sample_columns = subquery_for_join.sample_block.getColumnsWithTypeAndName(); bool need_convert = syntax->analyzed_join->applyJoinKeyConvert(left_sample_columns, right_sample_columns); if (need_convert) - subquery_for_join.addJoinActions(std::make_shared(syntax->analyzed_join->rightConvertingActions())); + subquery_for_join.addJoinActions(std::make_shared( + syntax->analyzed_join->rightConvertingActions(), + ExpressionActionsSettings::fromContext(context))); subquery_for_join.join = makeJoin(syntax->analyzed_join, subquery_for_join.sample_block, context); diff --git a/src/Interpreters/SubqueryForSet.cpp b/src/Interpreters/SubqueryForSet.cpp index c81b7a710ae..a3a51210bf1 100644 --- a/src/Interpreters/SubqueryForSet.cpp +++ b/src/Interpreters/SubqueryForSet.cpp @@ -51,7 +51,7 @@ void SubqueryForSet::addJoinActions(ExpressionActionsPtr actions) auto new_dag = ActionsDAG::merge( std::move(*joined_block_actions->getActionsDAG().clone()), std::move(*actions->getActionsDAG().clone())); - joined_block_actions = std::make_shared(new_dag); + joined_block_actions = std::make_shared(new_dag, actions->getSettings()); } }