|
51 | 51 | from sqlalchemy.engine.base import Engine
|
52 | 52 | from sqlalchemy.sql.schema import Column
|
53 | 53 | from sqlalchemy.sql.schema import Table
|
| 54 | +from sqlalchemy.sql.selectable import CTE |
54 | 55 | from sqlalchemy.sql import elements, selectable
|
55 | 56 | import re
|
56 | 57 |
|
@@ -254,6 +255,20 @@ def visit_table_valued_alias(self, element, **kw):
|
254 | 255 | ret = f"{aliases}, {ret}"
|
255 | 256 | return ret
|
256 | 257 |
|
| 258 | + def _known_tables(self): |
| 259 | + known_tables = set() |
| 260 | + |
| 261 | + for from_ in self.compile_state.froms: |
| 262 | + if isinstance(from_, Table): |
| 263 | + known_tables.add(from_.name) |
| 264 | + elif isinstance(from_, CTE): |
| 265 | + for column in from_.original.selected_columns: |
| 266 | + table = getattr(column, "table", None) |
| 267 | + if table is not None: |
| 268 | + known_tables.add(table.name) |
| 269 | + |
| 270 | + return known_tables |
| 271 | + |
257 | 272 | def visit_column(
|
258 | 273 | self,
|
259 | 274 | column,
|
@@ -290,12 +305,7 @@ def visit_column(
|
290 | 305 | if isinstance(tablename, elements._truncated_label):
|
291 | 306 | tablename = self._truncated_identifier("alias", tablename)
|
292 | 307 | elif TABLE_VALUED_ALIAS_ALIASES in kwargs:
|
293 |
| - known_tables = set( |
294 |
| - from_.name |
295 |
| - for from_ in self.compile_state.froms |
296 |
| - if isinstance(from_, Table) |
297 |
| - ) |
298 |
| - if tablename not in known_tables: |
| 308 | + if tablename not in self._known_tables(): |
299 | 309 | aliases = kwargs[TABLE_VALUED_ALIAS_ALIASES]
|
300 | 310 | if tablename not in aliases:
|
301 | 311 | aliases[tablename] = self.anon_map[
|
|
0 commit comments