1
0
mirror of https://github.com/django/django.git synced 2025-07-04 09:49:12 +00:00

[1.1.X] 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.

Backport of r12896 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12897 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2010-03-31 13:51:20 +00:00
parent f0fa0808ea
commit 7a7b9a0428
2 changed files with 27 additions and 4 deletions

View File

@ -875,7 +875,7 @@ class BaseQuery(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 get_ordering(self): def get_ordering(self):

View File

@ -1,5 +1,6 @@
from django.conf import settings
from django.test import TestCase from django.test import TestCase
from django.db.models import Max from django.db.models import Count, Max
from regressiontests.aggregation_regress.models import * from regressiontests.aggregation_regress.models import *
@ -13,7 +14,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 +34,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 +47,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.DATABASE_ENGINE != '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)