diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-04-14 21:11:17 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-04-14 21:13:27 +0200 |
| commit | 208e72276a3e12a4e7998b9a1219bc96a16cf7b8 (patch) | |
| tree | 0b82534d3aef1eecaf3b83a224cc11a0fb1f0fe0 /tests | |
| parent | d0267690f8a8e83065459d13a5a6f29e75640f78 (diff) | |
[3.2.x] Fixed #32645 -- Fixed QuerySet.update() crash when ordered by joined fields on MySQL/MariaDB.
Thanks Matt Westcott for the report.
Regression in 779e615e362108862f1681f965ee9e4f1d0ae6d2.
Backport of ca9872905559026af82000e46cde6f7dedc897b6 from main
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/update/models.py | 4 | ||||
| -rw-r--r-- | tests/update/tests.py | 28 |
2 files changed, 31 insertions, 1 deletions
diff --git a/tests/update/models.py b/tests/update/models.py index 98f40a8603..131c5b327e 100644 --- a/tests/update/models.py +++ b/tests/update/models.py @@ -45,3 +45,7 @@ class Bar(models.Model): class UniqueNumber(models.Model): number = models.IntegerField(unique=True) + + +class UniqueNumberChild(UniqueNumber): + pass diff --git a/tests/update/tests.py b/tests/update/tests.py index 588db40de6..ccaeb13c58 100644 --- a/tests/update/tests.py +++ b/tests/update/tests.py @@ -7,7 +7,10 @@ from django.db.models.functions import Abs, Concat, Lower from django.test import TestCase from django.test.utils import register_lookup -from .models import A, B, Bar, D, DataPoint, Foo, RelatedPoint, UniqueNumber +from .models import ( + A, B, Bar, D, DataPoint, Foo, RelatedPoint, UniqueNumber, + UniqueNumberChild, +) class SimpleTest(TestCase): @@ -249,3 +252,26 @@ class MySQLUpdateOrderByTest(TestCase): ).order_by('number_inverse').update( number=F('number') + 1, ) + + def test_order_by_update_on_parent_unique_constraint(self): + # Ordering by inherited fields is omitted because joined fields cannot + # be used in the ORDER BY clause. + UniqueNumberChild.objects.create(number=3) + UniqueNumberChild.objects.create(number=4) + with self.assertRaises(IntegrityError): + UniqueNumberChild.objects.order_by('number').update( + number=F('number') + 1, + ) + + def test_order_by_update_on_related_field(self): + # Ordering by related fields is omitted because joined fields cannot be + # used in the ORDER BY clause. + data = DataPoint.objects.create(name='d0', value='apple') + related = RelatedPoint.objects.create(name='r0', data=data) + with self.assertNumQueries(1) as ctx: + updated = RelatedPoint.objects.order_by('data__name').update(name='new') + sql = ctx.captured_queries[0]['sql'] + self.assertNotIn('ORDER BY', sql) + self.assertEqual(updated, 1) + related.refresh_from_db() + self.assertEqual(related.name, 'new') |
