#10032: ORM switches incorrectly to OUTER JOIN in certain cases with isnull=True
------------------------------------------+---------------------------------
Reporter: gabor | Owner: nobody
Status: new | Milestone:
Component: Database layer (models, ORM) | Version: 1.0
Keywords: | Stage: Unreviewed
Has_patch: 0 |
------------------------------------------+---------------------------------
using postgresql-8.2, with the postgresql-psycopg2 db-connector,
python-2.5
imagine the following case:
{{{
from django.db.models import *
class Group(Model):
name = CharField(max_length=20)
def __unicode__(self):
return self.name
class Person(Model):
name = CharField(max_length=20)
group = ForeignKey(Group)
stamp = DateTimeField(blank = True, null = True)
def __unicode__(self):
return self.name
}}}
now let's do this (empty db):
{{{
>>> Group.objects.create(name='group1')
<Group: group1>
>>> list(Group.objects.filter(person__stamp__isnull=True))
[<Group: group1>]
}}}
this is not what i want to get, because there are no person objects at
all,
so there obviously is no person objects that satisfies the requirement.
the mentioned query produces this SQL:
{{{
SELECT "x_group"."id", "x_group"."name" FROM "x_group" LEFT OUTER JOIN
"x_person" ON ("x_group"."id" = "x_person"."group_id") WHERE
"x_person"."stamp" IS NULL
}}}
if i change it to INNER JOIN, then it works correctly.
the strange thing is, that only isnull=True seems to trigger this.
for example the following:
{{{
>>> list(Group.objects.filter(person__stamp='2008-12-12'))
[]
}}}
works correctly, and produces this SQL:
{{{
SELECT "x_group"."id", "x_group"."name" FROM "x_group" INNER JOIN
"x_person" ON ("x_group"."id" = "x_person"."group_id") WHERE
"x_person"."stamp" = E\'2008-12-12 00:00:00\'
}}}
this problem appeared with changeset 7477 (merging in the queryset-
refactor branch).
with older versions the code works correctly.
--
Ticket URL: <http://code.djangoproject.com/ticket/10032>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---