Fixed #34464 -- Fixed queryset aggregation over group by reference.

Regression in 59bea9efd2.

Refs #28477.

Thanks Ian Cubitt for the report.
This commit is contained in:
Simon Charette 2023-04-06 08:19:53 -04:00 committed by Mariusz Felisiak
parent 1c7aed71ec
commit 9daf8b4109
3 changed files with 13 additions and 0 deletions

View File

@ -453,6 +453,9 @@ class Query(BaseExpression):
# filtering against window functions is involved as it
# requires complex realising.
annotation_mask = set()
if isinstance(self.group_by, tuple):
for expr in self.group_by:
annotation_mask |= expr.get_refs()
for aggregate in aggregates.values():
annotation_mask |= aggregate.get_refs()
inner_query.set_annotation_mask(annotation_mask)

View File

@ -15,3 +15,6 @@ Bugfixes
* Fixed a regression in Django 4.2 that caused a crash of
:class:`~django.contrib.postgres.search.SearchVector` function with ``%``
characters (:ticket:`34459`).
* Fixed a regression in Django 4.2 that caused aggregation over query that
uses explicit grouping to group against the wrong columns (:ticket:`34464`).

View File

@ -36,6 +36,7 @@ from django.db.models.functions import (
Greatest,
Least,
Lower,
Mod,
Now,
Pi,
TruncDate,
@ -2175,3 +2176,9 @@ class AggregateAnnotationPruningTests(TestCase):
sql = ctx.captured_queries[0]["sql"].lower()
self.assertEqual(sql.count("select"), 2, "Subquery wrapping required")
self.assertEqual(sql.count("authors_count"), 2)
def test_referenced_group_by_annotation_kept(self):
queryset = Book.objects.values(pages_mod=Mod("pages", 10)).annotate(
mod_count=Count("*")
)
self.assertEqual(queryset.count(), 1)