Opened 14 years ago

Last modified 11 years ago

#12807 closed Bug

Empty results break when part of ORs — at Version 7

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 (last modified by Anssi Kääriäinen)

The following query:

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

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

User.objects.filter((Q(pk=3) | ~Q(pk__in=[])) & 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(pk__in=[])) & 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 (8)

by Samuel Cormier-Iijima, 14 years ago

Attachment: 12807.patch added

comment:1 by Samuel Cormier-Iijima, 14 years ago

Sorry about the formatting (should probably use preview next time). That should have read:

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.

comment:2 by Alex Gaynor, 14 years ago

Triage Stage: UnreviewedAccepted

comment:3 by Luke Plant, 13 years ago

Type: Bug

comment:4 by Luke Plant, 13 years ago

Severity: Normal

comment:5 by patchhammer, 13 years ago

Easy pickings: unset
Patch needs improvement: set

12807.patch fails to apply cleanly on to trunk

comment:6 by Aymeric Augustin, 12 years ago

UI/UX: unset

Change UI/UX from NULL to False.

comment:7 by Anssi Kääriäinen, 11 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top