From e60d388f70533d0efd0632f39aadddcb2590a171 Mon Sep 17 00:00:00 2001 From: Frédéric Buclin Date: Fri, 15 Oct 2010 02:05:52 +0200 Subject: Bug 451735 part2: fix bz_drop_index() so that it first drops related FKs before deleting the index itself r/a=mkanat --- Bugzilla/DB.pm | 6 ++++++ Bugzilla/DB/Mysql.pm | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index 27644fba5..0290623d2 100644 --- a/Bugzilla/DB.pm +++ b/Bugzilla/DB.pm @@ -933,10 +933,16 @@ sub bz_drop_index { my $index_exists = $self->bz_index_info($table, $name); if ($index_exists) { + # We cannot delete an index used by a FK. + foreach my $column (@{$index_exists->{FIELDS}}) { + $self->bz_drop_related_fks($table, $column); + } $self->bz_drop_index_raw($table, $name); $self->_bz_real_schema->delete_index($table, $name); $self->_bz_store_real_schema; } + + return $index_exists ? 1 : 0; } # bz_drop_index_raw($table, $name, $silent) diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm index 7b7e4e9b9..6fd75b79f 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -765,6 +765,22 @@ sub bz_setup_database { } $self->_fix_defaults(); + + # Bug 451735 highlighted a bug in bz_drop_index() which didn't + # check for FKs before trying to delete an index. Consequently, + # the series_creator_idx index was considered to be deleted + # despite it was still present in the DB. That's why we have to + # force the deletion, bypassing the DB schema. + if (!$self->bz_index_info('series', 'series_category_idx')) { + if (!$self->bz_drop_index('series', 'series_creator_idx') + && $self->bz_index_info_real('series', 'series_creator_idx')) + { + foreach my $column (qw(creator category subcategory name)) { + $self->bz_drop_related_fks('series', $column); + } + $self->bz_drop_index_raw('series', 'series_creator_idx'); + } + } } # When you import a MySQL 3/4 mysqldump into MySQL 5, columns that -- cgit v1.2.3-24-g4f1b