diff options
| author | Simon Charette <charette.s@gmail.com> | 2021-02-23 20:56:29 -0500 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-02-24 09:01:36 +0100 |
| commit | 277eea8fcced7f04f3800617f189beb349a3212e (patch) | |
| tree | 95595b6c299ea769cd53068505806d344e82e310 /django/db/models/sql/query.py | |
| parent | 3aa545281e0c0f9fac93753e3769df9e0334dbaa (diff) | |
Fixed #32478 -- Included nested columns referenced by subqueries in GROUP BY on aggregations.
Regression in fb3f034f1c63160c0ff13c609acd01c18be12f80.
Refs #31094, #31150.
Thanks Igor Pejic for the report.
Diffstat (limited to 'django/db/models/sql/query.py')
| -rw-r--r-- | django/db/models/sql/query.py | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 3b2211b3b3..5ca3f38e15 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -1072,7 +1072,7 @@ class Query(BaseExpression): def get_external_cols(self): exprs = chain(self.annotations.values(), self.where.children) return [ - col for col in self._gen_cols(exprs) + col for col in self._gen_cols(exprs, include_external=True) if col.alias in self.external_aliases ] @@ -1707,12 +1707,17 @@ class Query(BaseExpression): return targets, joins[-1], joins @classmethod - def _gen_cols(cls, exprs): + def _gen_cols(cls, exprs, include_external=False): for expr in exprs: if isinstance(expr, Col): yield expr + elif include_external and callable(getattr(expr, 'get_external_cols', None)): + yield from expr.get_external_cols() else: - yield from cls._gen_cols(expr.get_source_expressions()) + yield from cls._gen_cols( + expr.get_source_expressions(), + include_external=include_external, + ) @classmethod def _gen_col_aliases(cls, exprs): |
