diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.cpp b/dbms/src/Interpreters/ExpressionAnalyzer.cpp index 02faff83e91..63d2ceb557b 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.cpp +++ b/dbms/src/Interpreters/ExpressionAnalyzer.cpp @@ -342,6 +342,7 @@ void ExpressionAnalyzer::translateQualifiedNamesImpl(ASTPtr & ast, const String { String node_alias = ast->tryGetAlias(); ast = ast->children.back(); + static_cast(*ast.get()).can_be_alias = false; if (!node_alias.empty()) ast->setAlias(node_alias); } @@ -356,6 +357,7 @@ void ExpressionAnalyzer::translateQualifiedNamesImpl(ASTPtr & ast, const String new_name += '.'; new_name += static_cast(*child.get()).name; } + ident->can_be_alias = false; ident->name = new_name; } } @@ -1007,7 +1009,7 @@ void ExpressionAnalyzer::normalizeTreeImpl( } else if ((identifier_node = typeid_cast(ast.get()))) { - if (identifier_node->kind == ASTIdentifier::Column) + if (identifier_node->kind == ASTIdentifier::Column && identifier_node->can_be_alias) { /// If it is an alias, but not a parent alias (for constructs like "SELECT column + 1 AS column"). auto it_alias = aliases.find(identifier_node->name); diff --git a/dbms/src/Parsers/ASTIdentifier.h b/dbms/src/Parsers/ASTIdentifier.h index 017e33af500..0ab607dfa09 100644 --- a/dbms/src/Parsers/ASTIdentifier.h +++ b/dbms/src/Parsers/ASTIdentifier.h @@ -25,8 +25,11 @@ class ASTIdentifier : public ASTWithAlias /// what this identifier identifies Kind kind; + /// if it's a cropped name it could not be an alias + bool can_be_alias; + ASTIdentifier(const String & name_, const Kind kind_ = Column) - : name(name_), kind(kind_) {} + : name(name_), kind(kind_), can_be_alias(true) {} /** Get the text that identifies this element. */ String getID() const override { return "Identifier_" + name; } diff --git a/tests/mutable-test/bugs/flash-451.test b/tests/mutable-test/bugs/flash-451.test new file mode 100644 index 00000000000..30640376ceb --- /dev/null +++ b/tests/mutable-test/bugs/flash-451.test @@ -0,0 +1,17 @@ +>> DBGInvoke __enable_schema_sync_service('false') + +# Unqualified identifiers resolve to alias in select list. +>> select 0 as c, c + 1 as c1 from (select 1 as c) as t where c = 1; + +# Qualified identifiers resolve to column in table. +>> select 0 as c, t.c + 1 as c1 from (select 1 as c) as t where t.c = 1; +┌─c─┬─c1─┐ +│ 0 │ 2 │ +└───┴────┘ + +# Combine the above two. +>> select 0 as c, c + 1 as c1 from (select 1 as c) as t where t.c = 1; +┌─c─┬─c1─┐ +│ 0 │ 1 │ +└───┴────┘ +