1
0
mirror of https://github.com/django/django.git synced 2024-12-22 09:05:43 +00:00

Fixed #34372 -- Fixed queryset crash on order by aggregation using OrderBy.

Regression in 278881e376 caused by a lack
of expression copying when an OrderBy expression is explicitly provided.

Thanks Jannis Vajen for the report and regression test.
This commit is contained in:
Simon Charette 2023-02-27 01:10:19 -05:00 committed by GitHub
parent 2276ec8c21
commit b15f162f25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 0 deletions

View File

@ -358,11 +358,13 @@ class SQLCompiler:
if ( if (
field.nulls_first is None and field.nulls_last is None field.nulls_first is None and field.nulls_last is None
) or self.connection.features.supports_order_by_nulls_modifier: ) or self.connection.features.supports_order_by_nulls_modifier:
field = field.copy()
field.expression = select_ref field.expression = select_ref
# Alias collisions are not possible when dealing with # Alias collisions are not possible when dealing with
# combined queries so fallback to it if emulation of NULLS # combined queries so fallback to it if emulation of NULLS
# handling is required. # handling is required.
elif self.query.combinator: elif self.query.combinator:
field = field.copy()
field.expression = Ref(select_ref.refs, select_ref.source) field.expression = Ref(select_ref.refs, select_ref.source)
yield field, select_ref is not None yield field, select_ref is not None
continue continue

View File

@ -638,3 +638,9 @@ class OrderingTests(TestCase):
.first(), .first(),
self.a1, self.a1,
) )
def test_order_by_expr_query_reuse(self):
qs = Author.objects.annotate(num=Count("article")).order_by(
F("num").desc(), "pk"
)
self.assertCountEqual(qs, qs.iterator())