doctrine / migrations

Doctrine Database Migrations Library
https://www.doctrine-project.org/projects/migrations.html
MIT License
4.65k stars 386 forks source link

Renaming sqlite table with unique index throws "index already exists" #1343

Open karrakoliko opened 12 months ago

karrakoliko commented 12 months ago

Bug Report

Q A
BC Break no
Version 3.6.0.0

Summary

When i try rename sqlite table that contains index, i get exception "index *** already exists".

Current behavior

An exception occurred while executing a query: SQLSTATE[HY000]: General error: 1 index *your_index_name* already exists

How to reproduce

  1. Create sqlite table
  2. Create unique index on any column of this table
  3. Create migration that renames table:
    $schema->renameTable('oldTableName', 'newTableName');

Demo repo: https://github.com/karrakoliko/doctrine-migrations-sqlite-driver-is-broken-example

Expected behavior

Table renamed (recreated with all the indexes, keys, etc., in case of sqlite)

Workaround tried (no success)

I tried workaround, but no success: Drop index in preUp hook, then recreate it in postUp hook. I ensured both hooks executed. Index successfully dropped, but not created (silently: no error appeared). $table->hasIndex(indexName) returns true, but index never created.

karrakoliko commented 12 months ago

Workaround that works: to rename table use 3 migrations instead of one: 1) migration that drops indexes 2) migration that renames table 3) migration that restores (re-creates) indexes