From bdd538488c837edec74cbfd4b0064228373319a1 Mon Sep 17 00:00:00 2001 From: Bendeguz Csirmaz Date: Thu, 18 Jul 2024 18:33:09 +0800 Subject: [PATCH] Fixed #35614 -- Prevented SQLCompiler.as_subquery_condition() from mutating a query. --- django/db/models/sql/compiler.py | 9 +++++---- tests/foreign_object/tests.py | 7 +++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 262d722dc1d..1d426f49b6d 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -1616,14 +1616,15 @@ class SQLCompiler: def as_subquery_condition(self, alias, columns, compiler): qn = compiler.quote_name_unless_alias qn2 = self.connection.ops.quote_name + query = self.query.clone() - for index, select_col in enumerate(self.query.select): + for index, select_col in enumerate(query.select): lhs_sql, lhs_params = self.compile(select_col) rhs = "%s.%s" % (qn(alias), qn2(columns[index])) - self.query.where.add(RawSQL("%s = %s" % (lhs_sql, rhs), lhs_params), AND) + query.where.add(RawSQL("%s = %s" % (lhs_sql, rhs), lhs_params), AND) - sql, params = self.as_sql() - return "EXISTS (%s)" % sql, params + sql, params = query.as_sql(compiler, self.connection) + return "EXISTS %s" % sql, params def explain_query(self): result = list(self.execute_sql()) diff --git a/tests/foreign_object/tests.py b/tests/foreign_object/tests.py index c9e8da57923..2d3aa800f75 100644 --- a/tests/foreign_object/tests.py +++ b/tests/foreign_object/tests.py @@ -223,6 +223,13 @@ class MultiColumnFKTests(TestCase): [m2], ) + def test_query_does_not_mutate(self): + """ + Recompiling the same subquery doesn't mutate it. + """ + queryset = Friendship.objects.filter(to_friend__in=Person.objects.all()) + self.assertEqual(str(queryset.query), str(queryset.query)) + def test_select_related_foreignkey_forward_works(self): Membership.objects.create( membership_country=self.usa, person=self.bob, group=self.cia