Fixed #26517 -- Fixed ExpressionWrapper with empty queryset.

This commit is contained in:
Johannes Dollinger 2016-08-05 09:09:01 -04:00 committed by Tim Graham
parent 1410616e0e
commit c002a0d39f
2 changed files with 20 additions and 2 deletions

View File

@ -223,7 +223,12 @@ class SQLCompiler(object):
ret = [] ret = []
for col, alias in select: for col, alias in select:
ret.append((col, self.compile(col, select_format=True), alias)) try:
sql, params = self.compile(col, select_format=True)
except EmptyResultSet:
# Select a predicate that's always False.
sql, params = '0', ()
ret.append((col, (sql, params), alias))
return ret, klass_info, annotations return ret, klass_info, annotations
def get_order_by(self): def get_order_by(self):

View File

@ -6,7 +6,7 @@ from decimal import Decimal
from django.core.exceptions import FieldDoesNotExist, FieldError from django.core.exceptions import FieldDoesNotExist, FieldError
from django.db.models import ( from django.db.models import (
BooleanField, CharField, Count, DateTimeField, ExpressionWrapper, F, Func, BooleanField, CharField, Count, DateTimeField, ExpressionWrapper, F, Func,
IntegerField, Sum, Value, IntegerField, Q, Sum, Value,
) )
from django.db.models.functions import Lower from django.db.models.functions import Lower
from django.test import TestCase, skipUnlessDBFeature from django.test import TestCase, skipUnlessDBFeature
@ -148,6 +148,19 @@ class NonAggregateAnnotationTestCase(TestCase):
combined = int(test.pages + test.rating) combined = int(test.pages + test.rating)
self.assertEqual(b.combined, combined) self.assertEqual(b.combined, combined)
def test_empty_expression_annotation(self):
books = Book.objects.annotate(
selected=ExpressionWrapper(Q(pk__in=[]), output_field=BooleanField())
)
self.assertEqual(len(books), Book.objects.count())
self.assertTrue(all(not book.selected for book in books))
books = Book.objects.annotate(
selected=ExpressionWrapper(Q(pk__in=Book.objects.none()), output_field=BooleanField())
)
self.assertEqual(len(books), Book.objects.count())
self.assertTrue(all(not book.selected for book in books))
def test_annotate_with_aggregation(self): def test_annotate_with_aggregation(self):
books = Book.objects.annotate( books = Book.objects.annotate(
is_book=Value(1, output_field=IntegerField()), is_book=Value(1, output_field=IntegerField()),