Skip to content

Commit

Permalink
Fixed #7181 -- when ordering by a potentially NULL field, use a left-…
Browse files Browse the repository at this point in the history
…outer join

so that the ordering doesn't accidentally restrict the result set.

(Ironically, one existing test actually showed this problem, but I was too
dumb to notice the result was incorrect.)


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7761 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Jun 26, 2008
1 parent e41df5a commit ba015e0
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 1 deletion.
4 changes: 4 additions & 0 deletions django/db/models/sql/query.py
Expand Up @@ -610,6 +610,10 @@ def find_ordering_name(self, name, opts, alias=None, default_order='ASC',
alias = joins[-1]
col = target.column

# Must use left outer joins for nullable fields.
for join in joins:
self.promote_alias(join)

# If we get to this point and the field is a relation to another model,
# append the default ordering for that model.
if field.rel and len(joins) > 1 and opts.ordering:
Expand Down
8 changes: 7 additions & 1 deletion tests/regressiontests/queries/models.py
Expand Up @@ -499,7 +499,7 @@ class Child(models.Model):
# Ordering by a many-valued attribute (e.g. a many-to-many or reverse
# ForeignKey) is legal, but the results might not make sense. That isn't
# Django's problem. Garbage in, garbage out.
>>> Item.objects.all().order_by('tags', 'id')
>>> Item.objects.filter(tags__isnull=False).order_by('tags', 'id')
[<Item: one>, <Item: two>, <Item: one>, <Item: two>, <Item: four>]
# If we replace the default ordering, Django adjusts the required tables
Expand Down Expand Up @@ -762,5 +762,11 @@ class Child(models.Model):
>>> Tag.objects.exclude(parent__name=t1.name)
[<Tag: t1>, <Tag: t4>, <Tag: t5>]
Bug #7181 -- ordering by related tables should accomodate nullable fields (this
test is a little tricky, since NULL ordering is database dependent. Instead, we
just count the number of results).
>>> len(Tag.objects.order_by('parent__name'))
5
"""}

0 comments on commit ba015e0

Please sign in to comment.