From: Mike Bayer Date: Sun, 26 Mar 2017 02:17:17 +0000 (-0400) Subject: Pre-load alias.c within JoinedEagerLoader cached AliasedClass X-Git-Tag: rel_1_2_0b1~135 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f214f4d4f46de24008c63f2e034329a64f510833;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Pre-load alias.c within JoinedEagerLoader cached AliasedClass Fixed a race condition which could occur under threaded environments as a result of the caching added via :ticket:`3915`. An internal collection of ``Column`` objects could be regenerated on an alias object inappropriately, confusing a joined eager loader when it attempts to render SQL and collect results and resulting in an attribute error. The collection is now generated up front before the alias object is cached and shared among threads. Change-Id: I97d5b205992d38af8d2b4307178a15c086ef9993 Fixes: #3947 --- diff --git a/doc/build/changelog/changelog_11.rst b/doc/build/changelog/changelog_11.rst index 9d43d3ae16..c60550923d 100644 --- a/doc/build/changelog/changelog_11.rst +++ b/doc/build/changelog/changelog_11.rst @@ -21,6 +21,19 @@ .. changelog:: :version: 1.1.7 + .. change:: + :tags: bug, orm + :tickets: 3947 + :versions: 1.2.0b1 + + Fixed a race condition which could occur under threaded environments + as a result of the caching added via :ticket:`3915`. An internal + collection of ``Column`` objects could be regenerated on an alias + object inappropriately, confusing a joined eager loader when it + attempts to render SQL and collect results and resulting in an + attribute error. The collection is now generated up front before + the alias object is cached and shared among threads. + .. change:: :tags: bug, sql, postgresql :tickets: 2892 diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index caf0da3401..c70994e8f0 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -1309,6 +1309,10 @@ class JoinedLoader(AbstractRelationshipLoader): self.mapper, flat=True, use_mapper_path=True) + # load up the .columns collection on the Alias() before + # the object becomes shared among threads. this prevents + # races for column identities. + inspect(to_adapt).selectable.c self._aliased_class_pool.append(to_adapt)