Skip to content

Commit b403135

Browse files
authored
Merge branch 'master' into test/issue-253-regression
2 parents 6bfcbea + 8564b43 commit b403135

8 files changed

Lines changed: 308 additions & 284 deletions

File tree

.github/workflows/lint.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
python-version: "3.12"
1818

1919
- name: Install Poetry
20-
uses: snok/install-poetry@v1.4.1
20+
uses: snok/install-poetry@v1.4.2
2121
with:
2222
version: latest
2323
virtualenvs-create: true

.github/workflows/python-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444

4545
# https://github.com/marketplace/actions/install-poetry-action
4646
- name: Install Poetry
47-
uses: snok/install-poetry@v1.4.1
47+
uses: snok/install-poetry@v1.4.2
4848
with:
4949
version: latest
5050
virtualenvs-create: true

.github/workflows/python-publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
python-version: '3.x'
2626

2727
- name: Install Poetry
28-
uses: snok/install-poetry@v1.4.1
28+
uses: snok/install-poetry@v1.4.2
2929
with:
3030
virtualenvs-create: true
3131
virtualenvs-in-project: true

.github/workflows/type-check.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
python-version: "3.12"
1818

1919
- name: Install Poetry
20-
uses: snok/install-poetry@v1.4.1
20+
uses: snok/install-poetry@v1.4.2
2121
with:
2222
version: latest
2323
virtualenvs-create: true

poetry.lock

Lines changed: 259 additions & 274 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ packages = [
1414

1515
[tool.poetry.dependencies]
1616
python = "^3.10"
17-
sqlglot = "^30.7.0"
17+
sqlglot = "^30.12.0"
1818

1919
[tool.poetry.group.dev.dependencies]
20-
coverage = {extras = ["toml"], version = "^7.13"}
21-
pytest = "^9.0.3"
20+
coverage = {extras = ["toml"], version = "^7.14"}
21+
pytest = "^9.1.1"
2222
pytest-cov = "^7.1.0"
2323
ruff = "^0.15"
24-
mypy = "^2.0"
24+
mypy = "^2.1"
2525

2626
[build-system]
2727
requires = ["poetry-core>=1.0.0"]

sql_metadata/column_extractor.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,12 @@ def add_alias(self, name: str, target: Any, clause: str) -> None:
199199
self.alias_names.append(name)
200200
if clause:
201201
self.alias_dict.setdefault(clause, UniqueList()).append(name)
202-
if target is not None:
203-
self.alias_map[name] = target
202+
if target is None:
203+
return
204+
existing = self.alias_map.get(name, [])
205+
merged = UniqueList(existing if isinstance(existing, list) else [existing])
206+
merged.extend(target if isinstance(target, list) else [target])
207+
self.alias_map[name] = merged if len(merged) > 1 else merged[0]
204208

205209

206210
# ---------------------------------------------------------------------------

test/test_unions.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,41 @@
11
from sql_metadata import Parser
22

33

4+
def test_union_column_aliases():
5+
# https://github.com/macbre/sql-metadata/issues/401
6+
# When UNION combines queries with the same alias,
7+
# columns_aliases should aggregate all source columns
8+
query = """
9+
select a.A as M
10+
from tab1 a
11+
union all
12+
select b.B as M
13+
from tab2 b
14+
"""
15+
parser = Parser(query)
16+
assert parser.columns_aliases == {"M": ["tab1.A", "tab2.B"]}
17+
assert parser.columns == ["tab1.A", "tab2.B"]
18+
assert parser.tables == ["tab1", "tab2"]
19+
20+
21+
def test_union_alias_with_expression_targets():
22+
# Regression: scalar then list-target must not nest
23+
q1 = """
24+
SELECT a AS x FROM t1
25+
UNION ALL
26+
SELECT b + c AS x FROM t2
27+
"""
28+
assert Parser(q1).columns_aliases == {"x": ["a", "b", "c"]}
29+
30+
# Regression: list then list-target must not raise TypeError on UniqueList
31+
q2 = """
32+
SELECT a + b AS x FROM t1
33+
UNION ALL
34+
SELECT c + d AS x FROM t2
35+
"""
36+
assert Parser(q2).columns_aliases == {"x": ["a", "b", "c", "d"]}
37+
38+
439
def test_union():
540
query = """
641
SELECT

0 commit comments

Comments
 (0)