mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Fixed #31150 -- Included subqueries that reference related fields in GROUP BY clauses.
Thanks Johannes Hoppe for the report.
Regression in fb3f034f1c
.
Co-authored-by: Simon Charette <charette.s@gmail.com>
This commit is contained in:
parent
3bd29a8a97
commit
7b8fa1653f
3 changed files with 44 additions and 1 deletions
|
@ -1,6 +1,7 @@
|
|||
import datetime
|
||||
import re
|
||||
from decimal import Decimal
|
||||
from unittest import skipIf
|
||||
|
||||
from django.core.exceptions import FieldError
|
||||
from django.db import connection
|
||||
|
@ -1190,6 +1191,26 @@ class AggregateTestCase(TestCase):
|
|||
},
|
||||
])
|
||||
|
||||
@skipUnlessDBFeature('supports_subqueries_in_group_by')
|
||||
@skipIf(
|
||||
connection.vendor == 'mysql',
|
||||
'GROUP BY optimization does not work properly when ONLY_FULL_GROUP_BY '
|
||||
'mode is enabled on MySQL, see #31331.',
|
||||
)
|
||||
def test_aggregation_subquery_annotation_multivalued(self):
|
||||
"""
|
||||
Subquery annotations must be included in the GROUP BY if they use
|
||||
potentially multivalued relations (contain the LOOKUP_SEP).
|
||||
"""
|
||||
subquery_qs = Author.objects.filter(
|
||||
pk=OuterRef('pk'),
|
||||
book__name=OuterRef('book__name'),
|
||||
).values('pk')
|
||||
author_qs = Author.objects.annotate(
|
||||
subquery_id=Subquery(subquery_qs),
|
||||
).annotate(count=Count('book'))
|
||||
self.assertEqual(author_qs.count(), Author.objects.count())
|
||||
|
||||
def test_aggregation_order_by_not_selected_annotation_values(self):
|
||||
result_asc = [
|
||||
self.b4.pk,
|
||||
|
@ -1248,6 +1269,7 @@ class AggregateTestCase(TestCase):
|
|||
).annotate(total=Count('*'))
|
||||
self.assertEqual(dict(has_long_books_breakdown), {True: 2, False: 3})
|
||||
|
||||
@skipUnlessDBFeature('supports_subqueries_in_group_by')
|
||||
def test_aggregation_subquery_annotation_related_field(self):
|
||||
publisher = Publisher.objects.create(name=self.a9.name, num_awards=2)
|
||||
book = Book.objects.create(
|
||||
|
@ -1267,3 +1289,8 @@ class AggregateTestCase(TestCase):
|
|||
contact_publisher__isnull=False,
|
||||
).annotate(count=Count('authors'))
|
||||
self.assertSequenceEqual(books_qs, [book])
|
||||
# FIXME: GROUP BY doesn't need to include a subquery with
|
||||
# non-multivalued JOINs, see Col.possibly_multivalued (refs #31150):
|
||||
# with self.assertNumQueries(1) as ctx:
|
||||
# self.assertSequenceEqual(books_qs, [book])
|
||||
# self.assertEqual(ctx[0]['sql'].count('SELECT'), 2)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue