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.