Code

Opened 2 years ago

Closed 2 years ago

#18097 closed Bug (worksforme)

__contains__ on an incompletely evaluated QuerySet can incorrectly return False

Reported by: kmichel_wgs 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 kmichel_wgs 2 years ago.

Download all attachments as: .zip

Change History (4)

Changed 2 years ago by kmichel_wgs

comment:1 Changed 2 years ago by ogier

  • Needs documentation unset
  • Needs tests set
  • Patch needs improvement unset
  • Triage Stage changed from Unreviewed to Accepted

comment:2 Changed 2 years ago by kmichel_wgs

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 2 years ago by aaugustin

  • Resolution set to worksforme
  • Status changed from new to closed

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

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.