diff options
| author | Simon Charette <charette.s@gmail.com> | 2015-12-13 23:46:41 -0500 |
|---|---|---|
| committer | Simon Charette <charette.s@gmail.com> | 2015-12-14 13:12:36 -0500 |
| commit | 8035cee92293f3319919c8248c7787ba43c05917 (patch) | |
| tree | 1d210cccd6ea810ecc1854b33785ce7141ca28b0 | |
| parent | 5233b70070f8979f41ca1da2c1b1d78c8e30944e (diff) | |
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
| -rw-r--r-- | django/db/models/sql/subqueries.py | 2 | ||||
| -rw-r--r-- | docs/releases/1.9.1.txt | 3 | ||||
| -rw-r--r-- | tests/delete/tests.py | 12 |
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 663a22791b..1a8941904c 100644 --- a/tests/delete/tests.py +++ b/tests/delete/tests.py @@ -503,3 +503,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}) + ) |
