summaryrefslogtreecommitdiffstats
path: root/sqlglot/optimizer/qualify_columns.py
diff options
context:
space:
mode:
Diffstat (limited to 'sqlglot/optimizer/qualify_columns.py')
-rw-r--r--sqlglot/optimizer/qualify_columns.py27
1 files changed, 24 insertions, 3 deletions
diff --git a/sqlglot/optimizer/qualify_columns.py b/sqlglot/optimizer/qualify_columns.py
index 7d77ef1..36ba028 100644
--- a/sqlglot/optimizer/qualify_columns.py
+++ b/sqlglot/optimizer/qualify_columns.py
@@ -2,8 +2,8 @@ import itertools
from sqlglot import alias, exp
from sqlglot.errors import OptimizeError
-from sqlglot.optimizer.schema import ensure_schema
-from sqlglot.optimizer.scope import traverse_scope
+from sqlglot.optimizer.scope import Scope, traverse_scope
+from sqlglot.schema import ensure_schema
def qualify_columns(expression, schema):
@@ -48,7 +48,7 @@ def _pop_table_column_aliases(derived_tables):
(e.g. SELECT ... FROM (SELECT ...) AS foo(col1, col2)
"""
for derived_table in derived_tables:
- if isinstance(derived_table, exp.UDTF):
+ if isinstance(derived_table.unnest(), exp.UDTF):
continue
table_alias = derived_table.args.get("alias")
if table_alias:
@@ -211,6 +211,22 @@ def _qualify_columns(scope, resolver):
if column_table:
column.set("table", exp.to_identifier(column_table))
+ # Determine whether each reference in the order by clause is to a column or an alias.
+ for ordered in scope.find_all(exp.Ordered):
+ for column in ordered.find_all(exp.Column):
+ column_table = column.table
+ column_name = column.name
+
+ if column_table or column.parent is ordered or column_name not in resolver.all_columns:
+ continue
+
+ column_table = resolver.get_table(column_name)
+
+ if column_table is None:
+ raise OptimizeError(f"Ambiguous column: {column_name}")
+
+ column.set("table", exp.to_identifier(column_table))
+
def _expand_stars(scope, resolver):
"""Expand stars to lists of column selections"""
@@ -346,6 +362,11 @@ class _Resolver:
except Exception as e:
raise OptimizeError(str(e)) from e
+ if isinstance(source, Scope) and isinstance(source.expression, exp.Values):
+ values_alias = source.expression.parent
+ if hasattr(values_alias, "alias_column_names"):
+ return values_alias.alias_column_names
+
# Otherwise, if referencing another scope, return that scope's named selects
return source.expression.named_selects