From a0ed37e04e0a2b4550f0676254a7c348a43db670 Mon Sep 17 00:00:00 2001 From: vdimir Date: Wed, 28 Jul 2021 16:35:02 +0300 Subject: [PATCH] Ignore constness in ExpressionActionsChain::JoinStep Fix 01064_pm_all_join_const_and_nullable with bad cast check --- src/Interpreters/ExpressionActions.cpp | 9 ++++++--- src/Interpreters/ExpressionAnalyzer.cpp | 4 ++-- src/Interpreters/TableJoin.cpp | 24 +++--------------------- src/Interpreters/TableJoin.h | 1 - 4 files changed, 11 insertions(+), 27 deletions(-) diff --git a/src/Interpreters/ExpressionActions.cpp b/src/Interpreters/ExpressionActions.cpp index 6797947a101..d8c008c6065 100644 --- a/src/Interpreters/ExpressionActions.cpp +++ b/src/Interpreters/ExpressionActions.cpp @@ -793,12 +793,15 @@ ExpressionActionsChain::JoinStep::JoinStep( : Step({}) , analyzed_join(std::move(analyzed_join_)) , join(std::move(join_)) - , result_columns(std::move(required_columns_)) { - for (const auto & column : result_columns) + for (const auto & column : required_columns_) required_columns.emplace_back(column.name, column.type); - analyzed_join->addJoinedColumnsAndCorrectTypes(result_columns); + NamesAndTypesList result_names_and_types = required_columns; + analyzed_join->addJoinedColumnsAndCorrectTypes(result_names_and_types); + for (const auto & [name, type] : result_names_and_types) + /// `column` is `nullptr` because we don't care on constness here, it may be changed in join + result_columns.emplace_back(nullptr, type, name); } void ExpressionActionsChain::JoinStep::finalize(const NameSet & required_output_) diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index 875a7bef862..d48cee413ae 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -215,7 +215,7 @@ void ExpressionAnalyzer::analyzeAggregation() if (join) { getRootActionsNoMakeSet(analyzedJoin().leftKeysList(), true, temp_actions, false); - auto sample_columns = temp_actions->getResultColumns(); + auto sample_columns = temp_actions->getNamesAndTypesList(); analyzedJoin().addJoinedColumnsAndCorrectTypes(sample_columns); temp_actions = std::make_shared(sample_columns); } @@ -1213,7 +1213,7 @@ void SelectQueryExpressionAnalyzer::appendSelect(ExpressionActionsChain & chain, } ActionsDAGPtr SelectQueryExpressionAnalyzer::appendOrderBy(ExpressionActionsChain & chain, bool only_types, bool optimize_read_in_order, - ManyExpressionActions & order_by_elements_actions) + ManyExpressionActions & order_by_elements_actions) { const auto * select_query = getSelectQuery(); diff --git a/src/Interpreters/TableJoin.cpp b/src/Interpreters/TableJoin.cpp index 20e8f6b18b4..86c84d9c8c9 100644 --- a/src/Interpreters/TableJoin.cpp +++ b/src/Interpreters/TableJoin.cpp @@ -231,20 +231,7 @@ void TableJoin::addJoinedColumn(const NameAndTypePair & joined_column) void TableJoin::addJoinedColumnsAndCorrectTypes(NamesAndTypesList & names_and_types, bool correct_nullability) const { - ColumnsWithTypeAndName columns; - for (auto & pair : names_and_types) - columns.emplace_back(nullptr, std::move(pair.type), std::move(pair.name)); - names_and_types.clear(); - - addJoinedColumnsAndCorrectTypes(columns, correct_nullability); - - for (auto & col : columns) - names_and_types.emplace_back(std::move(col.name), std::move(col.type)); -} - -void TableJoin::addJoinedColumnsAndCorrectTypes(ColumnsWithTypeAndName & columns, bool correct_nullability) const -{ - for (auto & col : columns) + for (auto & col : names_and_types) { if (hasUsing()) { @@ -252,17 +239,12 @@ void TableJoin::addJoinedColumnsAndCorrectTypes(ColumnsWithTypeAndName & columns col.type = it->second; } if (correct_nullability && leftBecomeNullable(col.type)) - { - /// No need to nullify constants - bool is_column_const = col.column && isColumnConst(*col.column); - if (!is_column_const) - col.type = JoinCommon::convertTypeToNullable(col.type); - } + col.type = JoinCommon::convertTypeToNullable(col.type); } /// Types in columns_added_by_join already converted and set nullable if needed for (const auto & col : columns_added_by_join) - columns.emplace_back(nullptr, col.type, col.name); + names_and_types.emplace_back(col.name, col.type); } bool TableJoin::sameStrictnessAndKind(ASTTableJoin::Strictness strictness_, ASTTableJoin::Kind kind_) const diff --git a/src/Interpreters/TableJoin.h b/src/Interpreters/TableJoin.h index 4c8c16028f5..4fe9565666f 100644 --- a/src/Interpreters/TableJoin.h +++ b/src/Interpreters/TableJoin.h @@ -191,7 +191,6 @@ public: void addJoinedColumn(const NameAndTypePair & joined_column); void addJoinedColumnsAndCorrectTypes(NamesAndTypesList & names_and_types, bool correct_nullability = true) const; - void addJoinedColumnsAndCorrectTypes(ColumnsWithTypeAndName & columns, bool correct_nullability = true) const; /// Calculates common supertypes for corresponding join key columns. bool inferJoinKeyCommonType(const NamesAndTypesList & left, const NamesAndTypesList & right);