#36632: AlterIndexTogether drops overlapping indexes
-------------------------------------+-------------------------------------
     Reporter:  mherrmann            |                     Type:  Bug
       Status:  new                  |                Component:  Database
                                     |  layer (models, ORM)
      Version:  5.2                  |                 Severity:  Normal
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
 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.
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36632>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/01070199956d407f-e911ac88-2f69-4964-b9fb-be1ea153d7d9-000000%40eu-central-1.amazonses.com.

Reply via email to