summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2021-04-17 04:45:28 +0000
committerGerrit Code Review <gerrit@ci3.zzzcomputing.com>2021-04-17 04:45:28 +0000
commit23a09b117d4af2418b754fc6d3b3b9728e8f0b14 (patch)
tree173362d5d8dd2d37d46bb0c87a38b75361ecd287 /lib/sqlalchemy/sql
parent776262ce4cf2ca0ce0bc9d26934cc1c589363984 (diff)
parent46f34449f389a8aa994485f36e99f95275a19170 (diff)
downloadsqlalchemy-23a09b117d4af2418b754fc6d3b3b9728e8f0b14.tar.gz
Merge "Uniquify FROMs when traversing through select"
Diffstat (limited to 'lib/sqlalchemy/sql')
-rw-r--r--lib/sqlalchemy/sql/selectable.py27
1 files changed, 18 insertions, 9 deletions
diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py
index 2a221cdf0..3a90f77fb 100644
--- a/lib/sqlalchemy/sql/selectable.py
+++ b/lib/sqlalchemy/sql/selectable.py
@@ -4428,15 +4428,24 @@ class _SelectFromElements(object):
# note this does not include elements
# in _setup_joins or _legacy_setup_joins
- return itertools.chain(
- itertools.chain.from_iterable(
- [element._from_objects for element in self._raw_columns]
- ),
- itertools.chain.from_iterable(
- [element._from_objects for element in self._where_criteria]
- ),
- self._from_obj,
- )
+ seen = set()
+ for element in self._raw_columns:
+ for fr in element._from_objects:
+ if fr in seen:
+ continue
+ seen.add(fr)
+ yield fr
+ for element in self._where_criteria:
+ for fr in element._from_objects:
+ if fr in seen:
+ continue
+ seen.add(fr)
+ yield fr
+ for element in self._from_obj:
+ if element in seen:
+ continue
+ seen.add(element)
+ yield element
class Select(