summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2015-12-13 23:46:41 -0500
committerSimon Charette <charette.s@gmail.com>2015-12-14 13:13:47 -0500
commitc402db2e2f3315dc3292526a6bdae36630026dfe (patch)
treee83c4b314783267aee3a58fa7e6c6d6cd60655ca
parent45ea00742b06393a76f2d553999a5c37e09dc7c3 (diff)
[1.9.x] Fixed #25882 -- Prevented fast deletes matching no rows from crashing on MySQL.
Thanks to Trac aliases gerricom for the report, raphaelmerx for the attempts to reproduce and Sergey Fedoseev and Tim for the review. Refs #16891 Backport of 8035cee92293f3319919c8248c7787ba43c05917 from master
-rw-r--r--django/db/models/sql/subqueries.py2
-rw-r--r--docs/releases/1.9.1.txt3
-rw-r--r--tests/delete/tests.py12
3 files changed, 16 insertions, 1 deletions
diff --git a/django/db/models/sql/subqueries.py b/django/db/models/sql/subqueries.py
index 35c814f903..266b6a017c 100644
--- a/django/db/models/sql/subqueries.py
+++ b/django/db/models/sql/subqueries.py
@@ -68,7 +68,7 @@ class DeleteQuery(Query):
# We can't do the delete using subquery.
values = list(query.values_list('pk', flat=True))
if not values:
- return
+ return 0
return self.delete_batch(values, using)
else:
innerq.clear_select_clause()
diff --git a/docs/releases/1.9.1.txt b/docs/releases/1.9.1.txt
index bc4a0be8ad..eee5a88737 100644
--- a/docs/releases/1.9.1.txt
+++ b/docs/releases/1.9.1.txt
@@ -34,3 +34,6 @@ Bugfixes
created by ``startapp`` on Python 2 (:ticket:`25909`). Add this line to your
own ``apps.py`` files created using Django 1.9 if you want your migrations
to work on both Python 2 and Python 3.
+
+* Prevented ``QuerySet.delete()`` from crashing on MySQL when querying across
+ relations (:ticket`25882`).
diff --git a/tests/delete/tests.py b/tests/delete/tests.py
index c50f95e126..e874321744 100644
--- a/tests/delete/tests.py
+++ b/tests/delete/tests.py
@@ -502,3 +502,15 @@ class FastDeleteTests(TestCase):
# that + fast delete of the related objs.
self.assertNumQueries(2, a.delete)
self.assertEqual(User.objects.count(), 0)
+
+ def test_fast_delete_empty_no_update_can_self_select(self):
+ """
+ #25932 - Fast deleting on backends that don't have the
+ `no_update_can_self_select` feature should work even if the specified
+ filter doesn't match any row.
+ """
+ with self.assertNumQueries(1):
+ self.assertEqual(
+ User.objects.filter(avatar__desc='missing').delete(),
+ (0, {'delete.User': 0})
+ )