Fixed #10181 -- Handle an EmptyResultSet exception case properly in nested querysets.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9951 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2009-03-02 06:08:02 +00:00
parent a605a8fe08
commit 851461aa72
2 changed files with 9 additions and 6 deletions

View File

@ -50,7 +50,7 @@ class WhereNode(tree.Node):
if hasattr(obj, "process"): if hasattr(obj, "process"):
try: try:
obj, params = obj.process(lookup_type, value) obj, params = obj.process(lookup_type, value)
except EmptyShortCircuit: except (EmptyShortCircuit, EmptyResultSet):
# There are situations where we want to short-circuit any # There are situations where we want to short-circuit any
# comparisons and make sure that nothing is returned. One # comparisons and make sure that nothing is returned. One
# example is when checking for a NULL pk value, or the # example is when checking for a NULL pk value, or the

View File

@ -1048,11 +1048,14 @@ performance problems on backends like MySQL.
[<Annotation: a1>] [<Annotation: a1>]
Nested queries should not evaluate the inner query as part of constructing the Nested queries should not evaluate the inner query as part of constructing the
SQL. This test verifies this: if the inner query is evaluated, the outer "in" SQL (so we should see a nested query here, indicated by two "SELECT" calls).
lookup will raise an EmptyResultSet exception (as the inner query returns >>> Annotation.objects.filter(notes__in=Note.objects.filter(note="xyzzy")).query.as_sql()[0].count('SELECT')
nothing). 2
>>> print Annotation.objects.filter(notes__in=Note.objects.filter(note="xyzzy")).query
SELECT ... Bug #10181 -- Avoid raising an EmptyResultSet if an inner query is provably
empty (and hence, not executed).
>>> Tag.objects.filter(id__in=Tag.objects.filter(id__in=[]))
[]
Bug #9997 -- If a ValuesList or Values queryset is passed as an inner query, we Bug #9997 -- If a ValuesList or Values queryset is passed as an inner query, we
make sure it's only requesting a single value and use that as the thing to make sure it's only requesting a single value and use that as the thing to