#24386: Querysets with filters and exclusions based on deep relations build 
invalid
queries
----------------------------------------------+--------------------
     Reporter:  rtpg                          |      Owner:  nobody
         Type:  Bug                           |     Status:  new
    Component:  Database layer (models, ORM)  |    Version:  master
     Severity:  Normal                        |   Keywords:
 Triage Stage:  Unreviewed                    |  Has patch:  0
Easy pickings:  0                             |      UI/UX:  0
----------------------------------------------+--------------------
 I've hit this bug in 1.6, and reproduced it on master (django
 v1.9.dev20150221182749)

 I have the following models:

 {{{
 class Owner(models.Model):
     pass

 class Employee(models.Model):
     owner = models.ForeignKey(Owner)
     status = models.CharField(max_length=100)
     start_date = models.DateField()

 }}}

 When trying to find the oldest active employees for each owner, I tried
 the following query:

 {{{
 >>> query =
 
Employee.objects.filter(status='active').exclude(owner__employee__start_date__lte=F('start_date'),owner__employee__status='active').distinct()
 >>> query
   [...]
   File "/Users/rtpg/proj/test_django/django-
 trunk/django/db/backends/utils.py", line 64, in execute
     return self.cursor.execute(sql, params)
   File "/Users/rtpg/proj/test_django/django-trunk/django/db/utils.py",
 line 95, in __exit__
     six.reraise(dj_exc_type, dj_exc_value, traceback)
   File "/Users/rtpg/proj/test_django/django-
 trunk/django/db/backends/utils.py", line 64, in execute
     return self.cursor.execute(sql, params)
 ProgrammingError: missing FROM-clause entry for table "u1"
 LINE 1: ...e_employee" U0 INNER JOIN "core_employee" U2 ON ( U1."id" = ...
                                                              ^
 }}}

 The SQL query generated by the queryset seems to be at fault
 {{{
 >>> print query.query
 SELECT DISTINCT "core_employee"."id", "core_employee"."owner_id",
 "core_employee"."status", "core_employee"."start_date" FROM
 "core_employee" WHERE ("core_employee"."status" = active AND NOT
 ("core_employee"."owner_id" IN (SELECT U2."owner_id" AS Col1 FROM
 "core_employee" U2 WHERE U2."status" = active) AND
 "core_employee"."owner_id" IN (SELECT U2."owner_id" AS Col1 FROM
 "core_employee" U0 INNER JOIN "core_employee" U2 ON ( U1."id" =
 U2."owner_id" ) WHERE U2."start_date" <= (U0."start_date"))))
 }}}

 I'm not very good at reading complex SQL queries, so I'm not sure what
 this is supposed to look like but in any case this query is refused by
 PostgreSQL

--
Ticket URL: <https://code.djangoproject.com/ticket/24386>
Django <https://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 unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/047.a863db610e9a63c09a95598558556d6e%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to