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:
parent
f0fa0808ea
commit
7a7b9a0428
@ -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):
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user