Commit 4e5c20b7 authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

Fixed #11916 -- Corrected handling of aggregation when there is a subquery...

Fixed #11916 -- Corrected handling of aggregation when there is a subquery provided in an extra(select=) clause. Thanks to jaklaassen@gmail.com for the report, and to tobias, paluh, Karen Tracey and Ian Kelly for their work on the fix.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12896 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent a75dc340
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -484,7 +484,7 @@ class SQLCompiler(object):
                elif hasattr(col, 'as_sql'):
                    result.append(col.as_sql(qn))
                else:
                    result.append(str(col))
                    result.append('(%s)' % str(col))
        return result, params

    def fill_related_selections(self, opts=None, root_alias=None, cur_depth=1,
+27 −3
Original line number Diff line number Diff line
from django.conf import settings
from django.test import TestCase
from django.db.models import Max
from django.db import DEFAULT_DB_ALIAS
from django.db.models import Count, Max

from regressiontests.aggregation_regress.models import *

@@ -46,3 +48,25 @@ class AggregationTests(TestCase):
        qs1 = books.filter(id__in=qs)
        qs2 = books.filter(id__in=list(qs))
        self.assertEqual(list(qs1), list(qs2))

    if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.oracle':
        def test_annotate_with_extra(self):
            """
            Regression test for #11916: Extra params + aggregation creates
            incorrect SQL.
            """
            #oracle doesn't support subqueries in group by clause
            shortest_book_sql = """
            SELECT name
            FROM aggregation_regress_book b
            WHERE b.publisher_id = aggregation_regress_publisher.id
            ORDER BY b.pages
            LIMIT 1
            """
            # tests that this query does not raise a DatabaseError due to the full
            # subselect being (erroneously) added to the GROUP BY parameters
            qs = Publisher.objects.extra(select={
                'name_of_shortest_book': shortest_book_sql,
            }).annotate(total_books=Count('book'))
            # force execution of the query
            list(qs)