]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fix QueryContext ref cycle on joinedload 5072/head
authorCarson Ip <carsonip715@gmail.com>
Fri, 3 Jan 2020 03:02:03 +0000 (11:02 +0800)
committerCarson Ip <carsonip715@gmail.com>
Fri, 3 Jan 2020 03:02:03 +0000 (11:02 +0800)
Fixes: #5071
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/orm/strategies.py
test/aaa_profiling/test_memusage.py

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")