diff options
| author | Simon Charette <charettes@users.noreply.github.com> | 2018-02-08 09:59:25 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-02-08 09:59:25 -0500 |
| commit | d61fe246015aa4fdc6dcb837ffb1442fa71ae586 (patch) | |
| tree | 1e9a51bc460cde84f6bd8975569fe40cf94ec830 | |
| parent | 01bfa9219b921267a8b94ed77e5984f9ce15497a (diff) | |
Fixed #29108 -- Fixed crash in aggregation of distinct+ordered+sliced querysets.
Regression in 4acae21846f6212aa992763e587c7e201828d7b0.
Thanks Stephen Brooks for the report.
| -rw-r--r-- | django/db/models/sql/compiler.py | 6 | ||||
| -rw-r--r-- | docs/releases/2.0.3.txt | 3 | ||||
| -rw-r--r-- | tests/queries/tests.py | 3 |
3 files changed, 9 insertions, 3 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 3080b8c3ee..1f78a8b5b2 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -547,7 +547,9 @@ class SQLCompiler: # to exclude extraneous selects. sub_selects = [] sub_params = [] - for select, _, alias in self.select: + for index, (select, _, alias) in enumerate(self.select, start=1): + if not alias and with_col_aliases: + alias = 'col%d' % index if alias: sub_selects.append("%s.%s" % ( self.connection.ops.quote_name('subquery'), @@ -561,7 +563,7 @@ class SQLCompiler: return 'SELECT %s FROM (%s) subquery' % ( ', '.join(sub_selects), ' '.join(result), - ), sub_params + params + ), tuple(sub_params + params) return ' '.join(result), tuple(params) finally: diff --git a/docs/releases/2.0.3.txt b/docs/releases/2.0.3.txt index 50b39653ea..4fbca2e247 100644 --- a/docs/releases/2.0.3.txt +++ b/docs/releases/2.0.3.txt @@ -9,4 +9,5 @@ Django 2.0.3 fixes several bugs in 2.0.2. Bugfixes ======== -* ... +* Fixed a regression that caused sliced ``QuerySet.distinct().order_by()`` + followed by ``count()`` to crash (:ticket:`29108`). diff --git a/tests/queries/tests.py b/tests/queries/tests.py index ba2e6830f8..d0bf13413c 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -1918,6 +1918,9 @@ class Queries6Tests(TestCase): qs = Tag.objects.exclude(category=None).exclude(category__name='foo') self.assertEqual(str(qs.query).count(' INNER JOIN '), 1) + def test_distinct_ordered_sliced_subquery_aggregation(self): + self.assertEqual(Tag.objects.distinct().order_by('category__name')[:3].count(), 3) + class RawQueriesTests(TestCase): def setUp(self): |
