Refs #27849 -- Fixed filtered aggregates crash on filters that match everything.

This commit is contained in:
Simon Charette 2022-11-07 09:01:50 +01:00 committed by Mariusz Felisiak
parent 77cf70ea96
commit 967f8750ab
2 changed files with 25 additions and 11 deletions

View File

@ -105,6 +105,7 @@ class Aggregate(Func):
if self.filter: if self.filter:
if connection.features.supports_aggregate_filter_clause: if connection.features.supports_aggregate_filter_clause:
filter_sql, filter_params = self.filter.as_sql(compiler, connection) filter_sql, filter_params = self.filter.as_sql(compiler, connection)
if filter_sql:
template = self.filter_template % extra_context.get( template = self.filter_template % extra_context.get(
"template", self.template "template", self.template
) )

View File

@ -205,3 +205,16 @@ class FilteredAggregateTests(TestCase):
max_rating=Max("rating", filter=Q(rating__in=[])) max_rating=Max("rating", filter=Q(rating__in=[]))
) )
self.assertEqual(aggregate, {"max_rating": None}) self.assertEqual(aggregate, {"max_rating": None})
def test_filtered_aggregate_full_condition(self):
book = Book.objects.annotate(
authors_count=Count(
"authors",
filter=~Q(authors__in=[]),
),
).get(pk=self.b1.pk)
self.assertEqual(book.authors_count, 2)
aggregate = Book.objects.aggregate(
max_rating=Max("rating", filter=~Q(rating__in=[]))
)
self.assertEqual(aggregate, {"max_rating": 4.5})