[1.11.x] Fixed #29229 -- Fixed column mismatch crash when combining two annotated values_list() querysets with union(), difference(), or intersection().
Regression in 7316720603821ebb64dfe8fa592ba6edcef5f3e. Backport of a0c03c62a8ac586e5be5b21393c925afa581efaf from master
This commit is contained in:
parent
cd4275f8d7
commit
c5bb472095
@ -393,7 +393,8 @@ class SQLCompiler(object):
|
||||
# If the columns list is limited, then all combined queries
|
||||
# must have the same columns list. Set the selects defined on
|
||||
# the query on all combined queries, if not already set.
|
||||
if not compiler.query.values_select and self.query.values_select:
|
||||
if (not compiler.query.values_select and not compiler.query.annotations and
|
||||
self.query.values_select):
|
||||
compiler.query.set_values(self.query.values_select)
|
||||
parts += (compiler.as_sql(),)
|
||||
except EmptyResultSet:
|
||||
|
@ -9,4 +9,6 @@ Django 1.11.12 fixes a bug in 1.11.11.
|
||||
Bugfixes
|
||||
========
|
||||
|
||||
* ...
|
||||
* Fixed a regression in Django 1.11.8 where combining two annotated
|
||||
``values_list()`` querysets with ``union()``, ``difference()``, or
|
||||
``intersection()`` crashed due to mismatching columns (:ticket:`29229`).
|
||||
|
@ -128,6 +128,17 @@ class QuerySetSetOperationTests(TestCase):
|
||||
reserved_name = qs1.union(qs1).values_list('name', 'order', 'id').get()
|
||||
self.assertEqual(reserved_name[:2], ('a', 2))
|
||||
|
||||
def test_union_with_two_annotated_values_list(self):
|
||||
qs1 = Number.objects.filter(num=1).annotate(
|
||||
count=Value(0, IntegerField()),
|
||||
).values_list('num', 'count')
|
||||
qs2 = Number.objects.filter(num=2).values('pk').annotate(
|
||||
count=F('num'),
|
||||
).annotate(
|
||||
num=Value(1, IntegerField()),
|
||||
).values_list('num', 'count')
|
||||
self.assertCountEqual(qs1.union(qs2), [(1, 0), (2, 1)])
|
||||
|
||||
def test_count_union(self):
|
||||
qs1 = Number.objects.filter(num__lte=1).values('num')
|
||||
qs2 = Number.objects.filter(num__gte=2, num__lte=3).values('num')
|
||||
|
Loading…
x
Reference in New Issue
Block a user