Opened 15 years ago

Last modified 11 years ago

#12807 closed

Empty results break when part of ORs — at Initial Version

Reported by: Samuel Cormier-Iijima Owned by: nobody
Component: Database layer (models, ORM) Version: 1.1
Severity: Normal Keywords: query, sql, q, filter, or, empty
Cc: sciyoshi@… Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description

The following query:

User.objects.filter((Q(pk=3) | ~Q(pkin=[]) & Q(pk=1))

currently breaks, since ~Q(pkin=[]) isn't noticed as being full, thus leading to the following query:

User.objects.filter((Q(pk=3) | ~Q(pkin=[])) & Q(pk=1)).values('id').query.as_sql()

('SELECT "auth_user"."id" FROM "auth_user" WHERE (("auth_user"."id" = %s ) AND "auth_user"."id" = %s )', (3, 1))

and giving an empty result set, instead of the correct

User.objects.filter((Q(pk=3) | ~Q(pkin=[])) & Q(pk=1)).values('id').query.as_sql()

('SELECT "auth_user"."id" FROM "auth_user" WHERE ("auth_user"."id" = %s )', (1,))

which returns the single user with PK 1.

Attaching a patch which fixes it by making as_sql() raise FullResultSet and adds a test case. The issue could also be fixed by checking if the child's as_sql() is empty, but this seemed cleaner.

Change History (1)

by Samuel Cormier-Iijima, 15 years ago

Attachment: 12807.patch added
Note: See TracTickets for help on using tickets.
Back to Top