summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2020-05-24 09:18:12 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-05-25 08:47:51 +0200
commitd91095def47a9916300b6f1ce970befcd497381f (patch)
tree61975d84775b853bd436bac51ec5092e9a4d6731
parent6e3c54390913c2e0256a90543a46b9a78a778f32 (diff)
[3.1.x] Fixed #31624 -- Avoided subquery usage on QuerySet.all().delete().
Thanks Adam Johnson for the report. Regression in 7acef095d73322f45dcceb99afa1a4e50b520479. Backport of 972000420e08703dd4981466ff67adcd5a61ad4b from master
-rw-r--r--django/db/models/sql/compiler.py2
-rw-r--r--tests/delete/tests.py6
2 files changed, 8 insertions, 0 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index c368a59226..2c51561ae8 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -1400,6 +1400,8 @@ class SQLInsertCompiler(SQLCompiler):
class SQLDeleteCompiler(SQLCompiler):
@cached_property
def single_alias(self):
+ # Ensure base table is in aliases.
+ self.query.get_initial_alias()
return sum(self.query.alias_refcount[t] > 0 for t in self.query.alias_map) == 1
def _as_sql(self, query):
diff --git a/tests/delete/tests.py b/tests/delete/tests.py
index c32ebba83f..e1ec26bc1a 100644
--- a/tests/delete/tests.py
+++ b/tests/delete/tests.py
@@ -605,6 +605,12 @@ class DeletionTests(TestCase):
class FastDeleteTests(TestCase):
+ def test_fast_delete_all(self):
+ with self.assertNumQueries(1) as ctx:
+ User.objects.all().delete()
+ sql = ctx.captured_queries[0]['sql']
+ # No subqueries is used when performing a full delete.
+ self.assertNotIn('SELECT', sql)
def test_fast_delete_fk(self):
u = User.objects.create(