Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge pull request #813 from HiddenData/ticket-19263

fixes #19263 - EmptyResultSet in subquery causes incorrect SQL
  • Loading branch information...
commit fc38d6a92be8baec1d02fbdf95e56c4204b9425b 2 parents 692902b + 2b76f19
@HonzaKral HonzaKral authored
View
4 django/db/models/sql/where.py
@@ -204,6 +204,10 @@ def make_atom(self, child, qn, connection):
raise EmptyResultSet
if extra:
return ('%s IN %s' % (field_sql, extra), params)
+ if not params:
+ # Empty params would generate invalid sql in subquery
+ raise EmptyResultSet
+
max_in_list_size = connection.ops.max_in_list_size()
if max_in_list_size and len(params) > max_in_list_size:
# Break up the params list into an OR of manageable chunks.
View
15 tests/regressiontests/queries/tests.py
@@ -2021,6 +2021,9 @@ def setUp(self):
Article.objects.create(name='three', created=datetime.datetime.now())
Article.objects.create(name='four', created=datetime.datetime.now())
+ food = Food.objects.create(name='spam')
+ Eaten.objects.create(meal='spam with eggs', food=food)
+
def test_tickets_7698_10202(self):
# People like to slice with '0' as the high-water mark.
self.assertQuerysetEqual(Article.objects.all()[0:0], [])
@@ -2036,6 +2039,18 @@ def test_empty_resultset_sql(self):
# ticket #12192
self.assertNumQueries(0, lambda: list(Number.objects.all()[1:1]))
+ def test_empty_sliced_subquery(self):
+ # ticket #19263 - testing subqueries
+ self.assertEqual(
+ Eaten.objects.filter(food__in=Food.objects.all()[0:0]).count(),
+ 0)
+
+ def test_empty_sliced_subquery_exclude(self):
+ # ticket #19263 - testing subqueries
+ self.assertEqual(
+ Eaten.objects.exclude(food__in=Food.objects.all()[0:0]).count(),
+ 1)
+
class EscapingTests(TestCase):
def test_ticket_7302(self):
Please sign in to comment.
Something went wrong with that request. Please try again.