summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charettes@users.noreply.github.com>2018-02-08 09:59:25 -0500
committerTim Graham <timograham@gmail.com>2018-02-08 10:00:12 -0500
commit8d03356d35a91e2a8536bae4319f061ccf6c0294 (patch)
tree349265e3049e53dcbd98b379761ab95d765f620a
parent781a3372421da6d44f7cc60d3c539ada2537582b (diff)
[2.0.x] Fixed #29108 -- Fixed crash in aggregation of distinct+ordered+sliced querysets.
Regression in 4acae21846f6212aa992763e587c7e201828d7b0. Thanks Stephen Brooks for the report. Backport of d61fe246015aa4fdc6dcb837ffb1442fa71ae586 from master
-rw-r--r--django/db/models/sql/compiler.py6
-rw-r--r--docs/releases/2.0.3.txt3
-rw-r--r--tests/queries/tests.py3
3 files changed, 9 insertions, 3 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 839e37aa8a..72a6537e05 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -559,7 +559,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'),
@@ -573,7 +575,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 668b07361a..79bd8203ca 100644
--- a/tests/queries/tests.py
+++ b/tests/queries/tests.py
@@ -1891,6 +1891,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):