summaryrefslogtreecommitdiff
path: root/django/db/models/sql
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2023-05-21 23:57:49 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-05-23 06:25:58 +0200
commite5c844d6f2a4ac6ae674d741b5f1fa2a688cedf4 (patch)
treeb7f47b9b83726965bd1d97284555e701cb8a48ba /django/db/models/sql
parent2ee01747c32a7275a7a1a5f7862acba7db764921 (diff)
Fixed #34551 -- Fixed QuerySet.aggregate() crash when referencing subqueries.
Regression in 59bea9efd2768102fc9d3aedda469502c218e9b7. Refs #28477. Thanks Denis Roldán and Mariusz for the test.
Diffstat (limited to 'django/db/models/sql')
-rw-r--r--django/db/models/sql/query.py6
1 files changed, 6 insertions, 0 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index c4b435df2d..781dfd5499 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -402,6 +402,7 @@ class Query(BaseExpression):
return {}
# Store annotation mask prior to temporarily adding aggregations for
# resolving purpose to facilitate their subsequent removal.
+ refs_subquery = False
replacements = {}
annotation_select_mask = self.annotation_select_mask
for alias, aggregate_expr in aggregate_exprs.items():
@@ -414,6 +415,10 @@ class Query(BaseExpression):
# Temporarily add aggregate to annotations to allow remaining
# members of `aggregates` to resolve against each others.
self.append_annotation_mask([alias])
+ refs_subquery |= any(
+ getattr(self.annotations[ref], "subquery", False)
+ for ref in aggregate.get_refs()
+ )
aggregate = aggregate.replace_expressions(replacements)
self.annotations[alias] = aggregate
replacements[Ref(alias, aggregate)] = aggregate
@@ -445,6 +450,7 @@ class Query(BaseExpression):
isinstance(self.group_by, tuple)
or self.is_sliced
or has_existing_aggregation
+ or refs_subquery
or qualify
or self.distinct
or self.combinator