Opened 2 hours ago

#36632 new Bug

AlterIndexTogether drops overlapping indexes

Reported by: Michael Herrmann Owned by:
Component: Database layer (models, ORM) Version: 5.2
Severity: Normal Keywords:
Cc: Michael Herrmann Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

  1. Create a model with two index_together fields: ('a', 'b')
  2. Run makemigrations.
  3. Add field c and change index_together to (('a', 'b'), ('a', 'b', 'c')).
  4. Run makemigrations.
  5. Run migrate.

For at least SQLite, this silently drops the two-column index and only produces the three-column index.

I am attaching code that can be used to reproduce the issue. To run it, place all files in the same folder, cd into it and execute:

chmod +x steps.sh
./steps.sh

(This requires macOS or Linux. It should be easy to see how to execute the steps on Windows.)

Executing steps.sh with Django 5 produces error

ValueError: Found wrong number (0) of indexes for polls_mymodel(a, b).

On the other hand, executing the script with Django 4 succeeds without any errors.

(Please see the script for what I mean by "executing with Django 4/5".)

The script generates three migrations. And actually, the bug is already there after the second migration. But the third migration highlights the issue with an error message.

I am attaching script show_indexes.py that can be used to debug the issue. It shows the indexes in the SQLite database. When steps.sh is executed with Django 4 and without the third migration, then show_indexes.py displays two indexes - one for two and one for three columns. On the other hand, when steps.sh is executed with Django 5 (and without the third migration), then show_indexes.py only shows one index, for the three columns. show_indexes.py needs Django 4.

Attachments (5)

models_1.py (171 bytes ) - added by Michael Herrmann 2 hours ago.
models_2.py (256 bytes ) - added by Michael Herrmann 2 hours ago.
models_3.py (284 bytes ) - added by Michael Herrmann 2 hours ago.
show_indexes.py (663 bytes ) - added by Michael Herrmann 2 hours ago.
steps.sh (865 bytes ) - added by Michael Herrmann 113 minutes ago.

Download all attachments as: .zip

Change History (5)

by Michael Herrmann, 2 hours ago

Attachment: models_1.py added

by Michael Herrmann, 2 hours ago

Attachment: models_2.py added

by Michael Herrmann, 2 hours ago

Attachment: models_3.py added

by Michael Herrmann, 2 hours ago

Attachment: show_indexes.py added

by Michael Herrmann, 113 minutes ago

Attachment: steps.sh added
Note: See TracTickets for help on using tickets.
Back to Top