mirror of
https://github.com/django/django.git
synced 2025-10-24 14:16:09 +00:00
Fixed #32645 -- Fixed QuerySet.update() crash when ordered by joined fields on MySQL/MariaDB.
Thanks Matt Westcott for the report.
Regression in 779e615e36.
This commit is contained in:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user