]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fix QueryContext ref cycle on joinedload
authorCarson Ip <carsonip715@gmail.com>
Fri, 3 Jan 2020 22:09:20 +0000 (17:09 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 4 Jan 2020 18:02:28 +0000 (13:02 -0500)
Avoid storing a reference to itself when dealing with create_eager_joins. Also fix a cheating test.

Fixes: #5071
Closes: #5072
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/5072
Pull-request-sha: 75ebaf7c91e96d7567eb5760be713dc134c58763

Change-Id: I511ddc0979b46f7928217347199eca4b1d0b4a49
(cherry picked from commit 5ecb7732fb62d80adb4434bdd0e606e43aa14a98)

doc/build/changelog/unreleased_13/5056.rst
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/orm/strategies.py
test/aaa_profiling/test_memusage.py

index 217044c1853fde6515e7c7ffddac746d6fd20123..950cce3c20e478fa78bef2bc7853e6a75eee67ce 100644 (file)
@@ -1,6 +1,6 @@
 .. change::
     :tags: bug, orm, engine
-    :tickets: 5056, 5050
+    :tickets: 5056, 5050, 5071
 
     Added test support and repaired a wide variety of unnecessary reference
     cycles created for short-lived objects, mostly in the area of ORM queries.
index e1a873b570f25cbc2d061df8ac0c7fda6bac0443..051a368f43afc3f7a45ac4cd40b0a778881d19a2 100644 (file)
@@ -3911,7 +3911,7 @@ class Query(object):
 
         for rec in context.create_eager_joins:
             strategy = rec[0]
-            strategy(*rec[1:])
+            strategy(context, *rec[1:])
 
         if context.from_clause:
             # "load from explicit FROMs" mode,
index e234596f6ffc88cd73266957b35ead0eb31b1463..4bd74988a5c8d00666f654f6def2af55d8404a4f 100644 (file)
@@ -1707,7 +1707,6 @@ class JoinedLoader(AbstractRelationshipLoader):
         context.create_eager_joins.append(
             (
                 self._create_eager_join,
-                context,
                 entity,
                 path,
                 adapter,
index be825151d5a45b82ae92e8e3e07a6f3a09eeb53e..0b407c11690a418e9b423987db6830ad45a32ba8 100644 (file)
@@ -1208,6 +1208,21 @@ class CycleTest(_fixtures.FixtureTest):
 
         go()
 
+    def test_query_joinedload(self):
+        User, Address = self.classes("User", "Address")
+
+        s = Session()
+
+        def generate():
+            s.query(User).options(joinedload(User.addresses)).all()
+
+        # cycles here are due to ClauseElement._cloned_set and Load.context
+        @assert_cycles(28)
+        def go():
+            generate()
+
+        go()
+
     def test_plain_join(self):
         users, addresses = self.tables("users", "addresses")