1
0
mirror of https://github.com/django/django.git synced 2025-06-08 13:09:13 +00:00

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
This commit is contained in:
Russell Keith-Magee 2010-03-31 13:43:22 +00:00
parent a75dc3406f
commit 4e5c20b78b
2 changed files with 28 additions and 4 deletions

View File

@ -484,7 +484,7 @@ class SQLCompiler(object):
elif hasattr(col, 'as_sql'): elif hasattr(col, 'as_sql'):
result.append(col.as_sql(qn)) result.append(col.as_sql(qn))
else: else:
result.append(str(col)) result.append('(%s)' % str(col))
return result, params return result, params
def fill_related_selections(self, opts=None, root_alias=None, cur_depth=1, def fill_related_selections(self, opts=None, root_alias=None, cur_depth=1,

View File

@ -1,5 +1,7 @@
from django.conf import settings
from django.test import TestCase 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 * from regressiontests.aggregation_regress.models import *
@ -13,7 +15,7 @@ class AggregationTests(TestCase):
Tests that the subselect works and returns results equivalent to a Tests that the subselect works and returns results equivalent to a
query with the IDs listed. query with the IDs listed.
Before the corresponding fix for this bug, this test passed in 1.1 and Before the corresponding fix for this bug, this test passed in 1.1 and
failed in 1.2-beta (trunk). failed in 1.2-beta (trunk).
""" """
@ -33,7 +35,7 @@ class AggregationTests(TestCase):
Same as the above test, but evaluates the queryset for the subquery Same as the above test, but evaluates the queryset for the subquery
before it's used as a subquery. before it's used as a subquery.
Before the corresponding fix for this bug, this test failed in both Before the corresponding fix for this bug, this test failed in both
1.1 and 1.2-beta (trunk). 1.1 and 1.2-beta (trunk).
""" """
@ -46,3 +48,25 @@ class AggregationTests(TestCase):
qs1 = books.filter(id__in=qs) qs1 = books.filter(id__in=qs)
qs2 = books.filter(id__in=list(qs)) qs2 = books.filter(id__in=list(qs))
self.assertEqual(list(qs1), list(qs2)) 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)