Opened 4 years ago

Closed 4 years ago

#18097 closed Bug (worksforme)

__contains__ on an incompletely evaluated QuerySet can incorrectly return False

Reported by: Kevin Michel Owned by: nobody
Component: Database layer (models, ORM) Version: 1.4
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: yes Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The bug is in the function QuerySet.__contains__(self, val), which is executed when using the python operator in.

It can only happen if :

  • val is in the QuerySet
  • val is the last item of the QuerySet
  • the QuerySet has not been completely evaluated

If all those conditions hold, then :

  • val is not yet in self._result_cache
  • self._iter is not None

This makes us jump to the while True loop, which runs correctly until we fetch the last item using self._fill_cache(num=1).

When fetching the last item, inside the self._fill_cache function, self._iter is set to None.

Just after fetching the last item, but before comparing its value against val, self.__contains__ checks the value of self._iter, which is None, and incorrectly return False.

The value of the last item should have been checked before checking the value of self._iter.

Attachments (1)

fix_queryset_contains.diff (639 bytes) - added by Kevin Michel 4 years ago.

Download all attachments as: .zip

Change History (4)

Changed 4 years ago by Kevin Michel

Attachment: fix_queryset_contains.diff added

comment:1 Changed 4 years ago by Alex Ogier

Needs documentation: unset
Needs tests: set
Patch needs improvement: unset
Triage Stage: UnreviewedAccepted

comment:2 Changed 4 years ago by Kevin Michel

Actually, after trying to write a test for the bug, I think the bug does not really exist.

During the "self._fill_cache(num=1)", self._iter will be set to None only if no element has been added to the _result_cache, in which case there is no new element to compare against val.

Sorry for the false alarm.

comment:3 Changed 4 years ago by Aymeric Augustin

Resolution: worksforme
Status: newclosed

As indicated by kmichel_wgs. Please re-open if you can provide a test case. Thanks!

Note: See TracTickets for help on using tickets.
Back to Top