#32152: Groupby after aggregation and subquery produces subtly wrong results
-------------------------------------+-------------------------------------
     Reporter:  Christian Klus       |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  3.1
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:  Accepted
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Simon Charette):

 * stage:  Unreviewed => Accepted


Comment:

 Thanks for the report and test Christian, I think you analysis is right;
 all members of the `SELECT` clause should be considered.

 Could you submit a PR on Github including your test and the following
 changes

 {{{#!diff
 diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
 index ee98984826..96819803c0 100644
 --- a/django/db/models/sql/query.py
 +++ b/django/db/models/sql/query.py
 @@ -2205,8 +2205,10 @@ def set_values(self, fields):
                          field_names.append(f)
              self.set_extra_mask(extra_names)
              self.set_annotation_mask(annotation_names)
 +            selected = frozenset(field_names + extra_names +
 annotation_names)
          else:
              field_names = [f.attname for f in
 self.model._meta.concrete_fields]
 +            selected = frozenset(field_names)
          # Selected annotations must be known before setting the GROUP BY
          # clause.
          if self.group_by is True:
 @@ -2220,7 +2222,7 @@ def set_values(self, fields):
              # the selected fields anymore.
              group_by = []
              for expr in self.group_by:
 -                if isinstance(expr, Ref) and expr.refs not in
 field_names:
 +                if isinstance(expr, Ref) and expr.refs not in selected:
                      expr = self.annotations[expr.refs]
                  group_by.append(expr)
              self.group_by = tuple(group_by)
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32152#comment:3>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/065.7eb0c4715d8bead8e7d66a3a6c6fe702%40djangoproject.com.

Reply via email to