Opened 9 years ago

Closed 9 years ago

#23836 closed Bug (fixed)

aggregate with a sliced queryset doesn't work with relations

Reported by: Reinout van Rees Owned by: nobody
Component: Database layer (models, ORM) Version: dev
Severity: Normal Keywords:
Cc: Sander Smits, yitzc Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Reinout van Rees)

#12886 fixed aggregation for sliced querysets by using subqueries.

This also fixed the GIS "Extent" aggregation for sliced querysets, which was reported in #15101.

While investigating #15101, a test we made failed initially. We noticed however that we were doing an extent aggregation over a relation. So we also made a test for the simple slice+extent() case, which worked.

Aha! Then we made a test similar to the one made to test #12886, but which followed a relation. At least with postgres this resulted in an error: column subquery.num_awards does not exist.

Traceback (most recent call last):
  File "/d/dev/repos/django/django/tests/aggregation/tests.py", line 664, in test_aggregation_with_limit_and_relation
    vals = qs.aggregate(average_num_awards=Avg('publisher__num_awards'))['average_num_awards']
  File "/d/dev/repos/django/django/django/db/models/query.py", line 342, in aggregate
    return query.get_aggregation(using=self.db, force_subq=force_subq)
  File "/d/dev/repos/django/django/django/db/models/sql/query.py", line 366, in get_aggregation
    result = compiler.execute_sql(SINGLE)
  File "/d/dev/repos/django/django/django/db/models/sql/compiler.py", line 817, in execute_sql
    cursor.execute(sql, params)
  File "/d/dev/repos/django/django/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/d/dev/repos/django/django/django/db/utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/d/dev/repos/django/django/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
ProgrammingError: column subquery.num_awards does not exist
LINE 1: SELECT AVG("subquery"."num_awards") FROM (SELECT "aggregatio...

I don't know how bad this is. Whether it is even supposed to work.

I also don't know how hard to fix it is :-) Might be just a matter of doing AVG("subquery"."publisher"."num_awards"), so adding the .publisher relation name in there.

Pull request with the failing test is upcoming.

Change History (7)

comment:1 by Reinout van Rees, 9 years ago

Description: modified (diff)

comment:2 by Reinout van Rees, 9 years ago

Here is a branch demonstrating the issue with a test: https://github.com/jsmits/django/compare/jsmits_ticket_23836

comment:3 by Tim Graham, 9 years ago

Triage Stage: UnreviewedAccepted

comment:4 by yitzc, 9 years ago

Cc: yitzc added

Hi,
The test from reinout's branch passes against the current master.
Looking at the sql run in the aggregate function seems to properly join the relation, which allows completing the query successfully.
I think it can be closed.

comment:5 by Tim Graham, 9 years ago

It would be nice to bisect to determine the commit where it was fixed to ensure that a sufficient test was added.

comment:6 by yitzc, 9 years ago

Looks like it was fixed in #23877

comment:7 by Tim Graham, 9 years ago

Resolution: fixed
Status: newclosed

The tests that were added there look good to me.

Note: See TracTickets for help on using tickets.
Back to Top