summaryrefslogtreecommitdiff
path: root/tests/update
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2021-04-14 21:11:17 +0200
committerGitHub <noreply@github.com>2021-04-14 21:11:17 +0200
commitca9872905559026af82000e46cde6f7dedc897b6 (patch)
tree6864cdf30fcf91155fe92b510d6fa406afd60af6 /tests/update
parent338eb65b6ecca9c7334aae94ce0b44a0faca4b1d (diff)
downloaddjango-ca9872905559026af82000e46cde6f7dedc897b6.tar.gz
Fixed #32645 -- Fixed QuerySet.update() crash when ordered by joined fields on MySQL/MariaDB.
Thanks Matt Westcott for the report. Regression in 779e615e362108862f1681f965ee9e4f1d0ae6d2.
Diffstat (limited to 'tests/update')
-rw-r--r--tests/update/models.py4
-rw-r--r--tests/update/tests.py28
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 0ba6fe43c3..a90f0f8323 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')