Skip to content

Commit f89a683

Browse files
committed
Move tests to qualify_tables.sql
1 parent 3a0707f commit f89a683

File tree

3 files changed

+45
-77
lines changed

3 files changed

+45
-77
lines changed

sqlglot/optimizer/qualify_tables.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def _set_alias(
131131
_set_alias(source, target_alias=name or source.name or None, normalize=True)
132132

133133
source_fqn = ".".join(p.name for p in source.parts)
134-
table_aliases[source_fqn] = exp.to_identifier(source.alias)
134+
table_aliases[source_fqn] = source.args["alias"].this.copy()
135135

136136
if pivot:
137137
target_alias = source.alias if pivot.unpivot else None
@@ -179,6 +179,6 @@ def _set_alias(
179179
and (canonical_table := canonical_aliases.get(table, "")) != column.table
180180
):
181181
# Amend existing aliases, e.g. t.c -> _0.c if t is aliased to _0
182-
column.set("table", exp.to_identifier(canonical_table))
182+
column.set("table", exp.to_identifier(canonical_table, quoted=True))
183183

184184
return expression

tests/fixtures/optimizer/qualify_tables.sql

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,5 +213,40 @@ WITH cte AS (SELECT 1 AS c, 'name' AS name) UPDATE t SET name = cte.name FROM ct
213213
WITH cte AS (SELECT 1 AS c, 'name' AS name) UPDATE c.db.t SET name = cte.name FROM cte WHERE cte.c = 1;
214214

215215
# title: avoid qualifying CTE with DELETE
216-
WITH cte AS (SELECT 1 AS c, 'name' AS name) DELETE t FROM t AS t INNER JOIN cte ON t.id = cte.c
217-
WITH cte AS (SELECT 1 AS c, 'name' AS name) DELETE c.db.t FROM c.db.t AS t INNER JOIN cte ON t.id = cte.c
216+
WITH cte AS (SELECT 1 AS c, 'name' AS name) DELETE t FROM t AS t INNER JOIN cte ON t.id = cte.c;
217+
WITH cte AS (SELECT 1 AS c, 'name' AS name) DELETE c.db.t FROM c.db.t AS t INNER JOIN cte ON t.id = cte.c;
218+
219+
# title: canonicalize single table alias
220+
# canonicalize_table_aliases: true
221+
SELECT * FROM t;
222+
SELECT * FROM c.db.t AS "_0";
223+
224+
# title: canonicalize join table aliases
225+
# canonicalize_table_aliases: true
226+
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id;
227+
SELECT * FROM c.db.t1 AS "_0" JOIN c.db.t2 AS "_1" ON "_0".id = "_1".id;
228+
229+
# title: canonicalize join with different databases
230+
# canonicalize_table_aliases: true
231+
SELECT * FROM db1.users JOIN db2.users ON db1.users.id = db2.users.id;
232+
SELECT * FROM c.db1.users AS "_0" JOIN c.db2.users AS "_1" ON "_0".id = "_1".id;
233+
234+
# title: canonicalize CTE alias
235+
# canonicalize_table_aliases: true
236+
WITH cte AS (SELECT * FROM t) SELECT * FROM cte;
237+
WITH cte AS (SELECT * FROM c.db.t AS "_0") SELECT * FROM cte AS "_1";
238+
239+
# title: canonicalize subquery alias
240+
# canonicalize_table_aliases: true
241+
SELECT * FROM (SELECT * FROM t);
242+
SELECT * FROM (SELECT * FROM c.db.t AS "_0") AS "_1";
243+
244+
# title: canonicalize multiple tables with subquery
245+
# canonicalize_table_aliases: true
246+
SELECT * FROM t1, (SELECT * FROM t2) AS sub, t3;
247+
SELECT * FROM c.db.t1 AS "_2", (SELECT * FROM c.db.t2 AS "_0") AS "_1", c.db.t3 AS "_3";
248+
249+
# title: canonicalize CTE with PIVOT
250+
# canonicalize_table_aliases: true
251+
WITH cte AS (SELECT * FROM t) SELECT * FROM cte PIVOT(SUM(c) FOR v IN ('x', 'y'));
252+
WITH cte AS (SELECT * FROM c.db.t AS "_0") SELECT * FROM cte AS "_1" PIVOT(SUM(c) FOR v IN ('x', 'y')) AS "_2";

tests/test_optimizer.py

Lines changed: 6 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -163,21 +163,25 @@ def check_file(
163163
title = meta.get("title") or f"{i}, {sql}"
164164
if only and title != only:
165165
continue
166+
166167
dialect = meta.get("dialect")
167168
leave_tables_isolated = meta.get("leave_tables_isolated")
168169
validate_qualify_columns = meta.get("validate_qualify_columns")
170+
canonicalize_table_aliases = meta.get("canonicalize_table_aliases")
171+
172+
func_kwargs = kwargs.copy()
169173

170-
func_kwargs = {**kwargs}
171174
if leave_tables_isolated is not None:
172175
func_kwargs["leave_tables_isolated"] = string_to_bool(leave_tables_isolated)
173176

174177
if validate_qualify_columns is not None:
175178
func_kwargs["validate_qualify_columns"] = string_to_bool(
176179
validate_qualify_columns
177180
)
178-
179181
if dialect:
180182
func_kwargs["dialect"] = dialect
183+
if canonicalize_table_aliases:
184+
func_kwargs["canonicalize_table_aliases"] = canonicalize_table_aliases
181185

182186
future = pool.submit(parse_and_optimize, func, sql, dialect, **func_kwargs)
183187
results[future] = (
@@ -240,77 +244,6 @@ def test_isolate_table_selects(self):
240244
)
241245

242246
def test_qualify_tables(self):
243-
self.assertEqual(
244-
optimizer.qualify_tables.qualify_tables(
245-
parse_one("SELECT * FROM t"),
246-
db="db",
247-
catalog="c",
248-
canonicalize_table_aliases=True,
249-
).sql(),
250-
'SELECT * FROM c.db.t AS "_0"',
251-
)
252-
253-
self.assertEqual(
254-
optimizer.qualify_tables.qualify_tables(
255-
parse_one("SELECT * FROM t1 JOIN t2 ON t1.id = t2.id"),
256-
db="db",
257-
catalog="c",
258-
canonicalize_table_aliases=True,
259-
).sql(),
260-
'SELECT * FROM c.db.t1 AS "_0" JOIN c.db.t2 AS "_1" ON _0.id = _1.id',
261-
)
262-
263-
self.assertEqual(
264-
optimizer.qualify_tables.qualify_tables(
265-
parse_one("SELECT * FROM db1.users JOIN db2.users ON db1.users.id = db2.users.id"),
266-
catalog="c",
267-
canonicalize_table_aliases=True,
268-
).sql(),
269-
'SELECT * FROM c.db1.users AS "_0" JOIN c.db2.users AS "_1" ON _0.id = _1.id',
270-
)
271-
272-
self.assertEqual(
273-
optimizer.qualify_tables.qualify_tables(
274-
parse_one("WITH cte AS (SELECT * FROM t) SELECT * FROM cte"),
275-
db="db",
276-
catalog="c",
277-
canonicalize_table_aliases=True,
278-
).sql(),
279-
'WITH cte AS (SELECT * FROM c.db.t AS "_0") SELECT * FROM cte AS "_1"',
280-
)
281-
282-
self.assertEqual(
283-
optimizer.qualify_tables.qualify_tables(
284-
parse_one("SELECT * FROM (SELECT * FROM t)"),
285-
db="db",
286-
catalog="c",
287-
canonicalize_table_aliases=True,
288-
).sql(),
289-
'SELECT * FROM (SELECT * FROM c.db.t AS "_0") AS "_1"',
290-
)
291-
292-
self.assertEqual(
293-
optimizer.qualify_tables.qualify_tables(
294-
parse_one("SELECT * FROM t1, (SELECT * FROM t2) AS sub, t3"),
295-
db="db",
296-
catalog="c",
297-
canonicalize_table_aliases=True,
298-
).sql(),
299-
'SELECT * FROM c.db.t1 AS "_2", (SELECT * FROM c.db.t2 AS "_0") AS "_1", c.db.t3 AS "_3"',
300-
)
301-
302-
self.assertEqual(
303-
optimizer.qualify_tables.qualify_tables(
304-
parse_one(
305-
"WITH cte AS (SELECT * FROM t) SELECT * FROM cte PIVOT(SUM(c) FOR v IN ('x', 'y'))"
306-
),
307-
db="db",
308-
catalog="c",
309-
canonicalize_table_aliases=True,
310-
).sql(),
311-
'WITH cte AS (SELECT * FROM c.db.t AS "_0") SELECT * FROM cte AS "_1" PIVOT(SUM(c) FOR v IN (\'x\', \'y\')) AS "_2"',
312-
)
313-
314247
self.assertEqual(
315248
optimizer.qualify.qualify(
316249
parse_one("WITH tesT AS (SELECT * FROM t1) SELECT * FROM test", "bigquery"),

0 commit comments

Comments
 (0)