CLICKHOUSE-1660 Added duplicated columns removal in USING(...)

This commit is contained in:
VadimPE 2018-08-31 13:00:46 +03:00
parent 5551f2902c
commit db8e63ff67
2 changed files with 40 additions and 5 deletions

View File

@ -242,6 +242,9 @@ ExpressionAnalyzer::ExpressionAnalyzer(
// Remove duplicated elements from LIMIT BY clause.
optimizeLimitBy();
/// Remove duplicated columns from USING(...).
optimizeUsing();
/// array_join_alias_to_name, array_join_result_to_source.
getArrayJoinedColumns();
@ -1410,6 +1413,38 @@ void ExpressionAnalyzer::optimizeLimitBy()
elems = unique_elems;
}
void ExpressionAnalyzer::optimizeUsing()
{
if (!select_query)
return;
auto node = const_cast<ASTTablesInSelectQueryElement *>(select_query->join());
if (!node)
return;
auto table_join = static_cast<ASTTableJoin *>(&*node->table_join);
if (!(table_join && table_join->using_expression_list))
return;
ASTs & expression_list = table_join->using_expression_list->children;
ASTs uniq_expressions_list;
std::set<String> expressions_names;
for (const auto & expression : expression_list)
{
auto expression_name = expression->getAliasOrColumnName();
if (expressions_names.find(expression_name) == expressions_names.end())
{
uniq_expressions_list.push_back(expression);
expressions_names.insert(expression_name);
}
}
if (uniq_expressions_list.size() < expression_list.size())
expression_list = uniq_expressions_list;
}
void ExpressionAnalyzer::makeSetsForIndex()
{
@ -3151,11 +3186,8 @@ void ExpressionAnalyzer::collectJoinedColumns(NameSet & joined_columns)
auto add_name_to_join_keys = [](Names & join_keys, ASTs & join_asts, const String & name, const ASTPtr & ast)
{
if (join_keys.end() == std::find(join_keys.begin(), join_keys.end(), name))
{
join_keys.push_back(name);
join_asts.push_back(ast);
}
join_keys.push_back(name);
join_asts.push_back(ast);
};
if (table_join.using_expression_list)

View File

@ -325,6 +325,9 @@ private:
void optimizeLimitBy();
/// Remove duplicated columns from USING(...).
void optimizeUsing();
/// remove Function_if AST if condition is constant
void optimizeIfWithConstantCondition();
void optimizeIfWithConstantConditionImpl(ASTPtr & current_ast, Aliases & aliases) const;