提交 4e54056c 编写于 作者: A Alexey Milovidov

dbms: allowed to specify duplicate columns in JOIN subquery [#METR-17664].

上级 64d47f35
......@@ -2251,7 +2251,8 @@ void ExpressionAnalyzer::collectJoinedColumns(NameSet & joined_columns, NamesAnd
for (const auto i : ext::range(0, nested_result_sample.columns()))
{
const auto & col = nested_result_sample.getByPosition(i);
if (join_key_names_right.end() == std::find(join_key_names_right.begin(), join_key_names_right.end(), col.name))
if (join_key_names_right.end() == std::find(join_key_names_right.begin(), join_key_names_right.end(), col.name)
&& !joined_columns.count(col.name)) /// Дублирующиеся столбцы в подзапросе для JOIN-а не имеют смысла.
{
joined_columns.insert(col.name);
joined_columns_name_type.emplace_back(col.name, col.type);
......
......@@ -78,6 +78,8 @@ void ASTSelectQuery::rewriteSelectExpressionList(const Names & column_names)
using Mapping = std::vector<Arrow>;
Mapping mapping(asts.size());
/// На какой позиции в SELECT-выражении находится соответствующий столбец из column_names.
std::vector<size_t> from(column_names.size());
/// Не будем выбрасывать выражения, содержащие функцию arrayJoin.
......@@ -106,6 +108,8 @@ void ASTSelectQuery::rewriteSelectExpressionList(const Names & column_names)
}
auto to = from;
/// Теперь from - список позиций column_names по возрастанию.
std::sort(from.begin(), from.end());
for (size_t i = 0; i < column_names.size(); ++i)
......@@ -130,7 +134,7 @@ void ASTSelectQuery::rewriteSelectExpressionList(const Names & column_names)
/** NOTE: Может показаться, что мы могли испортить запрос, выбросив выражение с алиасом, который используется где-то еще.
* Такого произойти не может, потому что этот метод вызывается всегда для запроса, на котором хоть раз создавали
* ExpressionAnalyzer, что гарантирует, что в нем все алиасы уже подставлены. Не совсем очевидная логика :)
* ExpressionAnalyzer, что гарантирует, что в нем все алиасы уже подставлены. Не совсем очевидная логика.
*/
}
......
select b from (select 1 as a, 42 as c) any left join (select 2 as b, 2 as b, 41 as c) using c;
select b from (select 1 as a, 42 as c) any left join (select 2 as b, 2 as b, 42 as c) using c;
select c,a,a,b,b from
(select 1 as a, 1 as a, 42 as c group by c order by a,c)
any left join
(select 2 as b, 2 as b, 41 as c group by c order by b,c)
using c
order by b;
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册