diff --git a/sqlglot/dialects/exasol.py b/sqlglot/dialects/exasol.py index da9ed97493..f43391acd4 100644 --- a/sqlglot/dialects/exasol.py +++ b/sqlglot/dialects/exasol.py @@ -92,18 +92,33 @@ def _add_local_prefix_for_aliases(expression: exp.Expression) -> exp.Expression: ): table_ident.replace(exp.to_identifier(table_ident.name.upper(), quoted=True)) - def prefix_local(node): + def prefix_local(node, visible_aliases: dict[str, bool]) -> exp.Expression: if isinstance(node, exp.Column) and not node.table: - if node.name in aliases: + if node.name in visible_aliases: return exp.Column( - this=exp.to_identifier(node.name, quoted=aliases[node.name]), + this=exp.to_identifier(node.name, quoted=visible_aliases[node.name]), table=exp.to_identifier("LOCAL", quoted=False), ) return node for key in ("where", "group", "having"): if arg := expression.args.get(key): - expression.set(key, arg.transform(prefix_local)) + expression.set(key, arg.transform(lambda node: prefix_local(node, aliases))) + + seen_aliases: dict[str, bool] = {} + new_selects: list[exp.Expression] = [] + for sel in expression.selects: + if isinstance(sel, exp.Alias): + inner = sel.this.transform(lambda node: prefix_local(node, seen_aliases)) + sel.set("this", inner) + + alias_node = sel.args.get("alias") + + seen_aliases[sel.alias] = bool(alias_node and getattr(alias_node, "quoted", False)) + new_selects.append(sel) + else: + new_selects.append(sel.transform(lambda node: prefix_local(node, seen_aliases))) + expression.set("expressions", new_selects) return expression diff --git a/tests/dialects/test_exasol.py b/tests/dialects/test_exasol.py index 8ff110d25d..5677b6ad1f 100644 --- a/tests/dialects/test_exasol.py +++ b/tests/dialects/test_exasol.py @@ -682,7 +682,9 @@ def test_local_prefix_for_alias(self): self.validate_identity( 'SELECT YEAR(a_date) AS "a_year" FROM MY_SUMMARY_TABLE GROUP BY LOCAL."a_year"', ) - self.validate_identity('SELECT a_year AS a_year FROM "LOCAL" GROUP BY "LOCAL".a_year') + self.validate_identity( + 'SELECT a_year AS a_year FROM "LOCAL" GROUP BY "LOCAL".a_year', + ) test_cases = [ ( @@ -705,6 +707,16 @@ def test_local_prefix_for_alias(self): "SELECT YEAR(a_date) AS a_year, MONTH(a_date) AS a_month FROM my_table WHERE LOCAL.a_year > 2020 AND LOCAL.a_month < 6", "SELECT YEAR(a_date) AS a_year, MONTH(a_date) AS a_month FROM my_table WHERE a_year > 2020 AND a_month < 6", ), + ( + "Select list aliases", + "SELECT YR AS THE_YEAR, ID AS YR, LOCAL.THE_YEAR + 1 AS NEXT_YEAR FROM my_table", + "SELECT YR AS THE_YEAR, ID AS YR, THE_YEAR + 1 AS NEXT_YEAR FROM my_table", + ), + ( + "Select list aliases without Local keyword", + "SELECT YEAR(CURRENT_DATE) AS current_year, LOCAL.current_year + 1 AS next_year", + "SELECT YEAR(CURRENT_DATE) AS current_year, current_year + 1 AS next_year", + ), ] for title, exasol_sql, dbx_sql in test_cases: with self.subTest(clause=title):