Skip to content

Commit cefe7bb

Browse files
authored
fix: missing target table for select into with union (#572)
1 parent e0fbf32 commit cefe7bb

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

sqllineage/core/parser/sqlfluff/extractors/select.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,7 @@ def extract(
5959
self.extract_subquery(subqueries, holder)
6060

6161
for segment in segments:
62-
self._handle_swap_partition(segment, holder)
63-
self._handle_select_into(segment, holder)
64-
self.tables.extend(
65-
self._list_table_from_from_clause_or_join_clause(segment, holder)
66-
)
67-
self._handle_column(segment)
62+
self._handle_select_statement_child_segments(segment, holder)
6863

6964
if is_set_expression(segment):
7065
for idx, sub_segment in enumerate(
@@ -75,19 +70,24 @@ def extract(
7570
(len(self.columns), len(self.tables))
7671
)
7772
for seg in list_child_segments(sub_segment):
78-
self.tables.extend(
79-
self._list_table_from_from_clause_or_join_clause(
80-
seg, holder
81-
)
82-
)
83-
self._handle_column(seg)
73+
self._handle_select_statement_child_segments(seg, holder)
8474

8575
self.end_of_query_cleanup(holder)
8676

8777
holder.expand_wildcard(self.metadata_provider)
8878

8979
return holder
9080

81+
def _handle_select_statement_child_segments(
82+
self, segment: BaseSegment, holder: SubQueryLineageHolder
83+
):
84+
self._handle_swap_partition(segment, holder)
85+
self._handle_select_into(segment, holder)
86+
self.tables.extend(
87+
self._list_table_from_from_clause_or_join_clause(segment, holder)
88+
)
89+
self._handle_column(segment)
90+
9191
@staticmethod
9292
def _handle_swap_partition(segment: BaseSegment, holder: SubQueryLineageHolder):
9393
"""

tests/sql/table/test_select_dialect_specific.py

+8
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ def test_select_into(dialect: str):
6060
assert_table_lineage_equal(sql, {"films"}, {"films_recent"}, dialect=dialect)
6161

6262

63+
@pytest.mark.parametrize("dialect", ["postgres", "tsql"])
64+
def test_select_into_with_union(dialect: str):
65+
sql = "SELECT * INTO films_all FROM films UNION ALL SELECT * FROM films_backup"
66+
assert_table_lineage_equal(
67+
sql, {"films", "films_backup"}, {"films_all"}, dialect=dialect
68+
)
69+
70+
6371
@pytest.mark.parametrize("dialect", ["athena"])
6472
def test_select_from_unnest_with_ordinality(dialect: str):
6573
"""

0 commit comments

Comments
 (0)