Opened 72 minutes ago
#37255 assigned Uncategorized
Tests rely on unspecified row order of SELECT without ORDER BY
| Reported by: | Yaroslav K | Owned by: | Yaroslav K |
|---|---|---|---|
| Component: | Testing framework | Version: | dev |
| Severity: | Normal | Keywords: | test |
| Cc: | Yaroslav K | Triage Stage: | Unreviewed |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Many (~70) tests assert a specific row order for querysets whose SQL has no
ORDER BY. SQL standard does not define that order.
On PostgreSQL the rows usually arrive in physical storage order, which
on a freshly loaded table matches insertion order -- so these assertions
pass by coincidence rather than by contract. That breaks when rows are
updated or deleted and the space is reused, or when the planner picks a
different access path such as an index scan. A test like this can start
failing with no change to Django or to the test itself.
Proposed solution:
- add
order_by()where the asserted sequence is meaningful - use
assertCountEqual()otherwise
Found by running the suite under
pg_disorder.