From 3c0d1a4c8be3893f358ab932b0c8bb5d5bce8973 Mon Sep 17 00:00:00 2001 From: Frédéric Buclin Date: Mon, 26 Dec 2011 11:34:25 +0100 Subject: Bug 683644: Foreign keys aren't renamed correctly when DB tables are renamed r=wicked a=LpSolit --- Bugzilla/DB/Pg.pm | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) (limited to 'Bugzilla/DB/Pg.pm') diff --git a/Bugzilla/DB/Pg.pm b/Bugzilla/DB/Pg.pm index e59a638a4..b6be64011 100644 --- a/Bugzilla/DB/Pg.pm +++ b/Bugzilla/DB/Pg.pm @@ -282,14 +282,18 @@ END $self->bz_add_index('products', 'products_name_lower_idx', {FIELDS => ['LOWER(name)'], TYPE => 'UNIQUE'}); - # bz_rename_column didn't correctly rename the sequence. - if ($self->bz_column_info('fielddefs', 'id') - && $self->bz_sequence_exists('fielddefs_fieldid_seq')) - { - print "Fixing fielddefs_fieldid_seq sequence...\n"; - $self->do("ALTER TABLE fielddefs_fieldid_seq RENAME TO fielddefs_id_seq"); - $self->do("ALTER TABLE fielddefs ALTER COLUMN id - SET DEFAULT NEXTVAL('fielddefs_id_seq')"); + # bz_rename_column and bz_rename_table didn't correctly rename + # the sequence. + $self->_fix_bad_sequence('fielddefs', 'id', 'fielddefs_fieldid_seq', 'fielddefs_id_seq'); + # If the 'tags' table still exists, then bz_rename_table() + # will fix the sequence for us. + if (!$self->bz_table_info('tags')) { + my $res = $self->_fix_bad_sequence('tag', 'id', 'tags_id_seq', 'tag_id_seq'); + # If $res is true, then the sequence has been renamed, meaning that + # the primary key must be renamed too. + if ($res) { + $self->do('ALTER INDEX tags_pkey RENAME TO tag_pkey'); + } } # Certain sequences got upgraded before we required Pg 8.3, and @@ -320,6 +324,20 @@ END } } +sub _fix_bad_sequence { + my ($self, $table, $column, $old_seq, $new_seq) = @_; + if ($self->bz_column_info($table, $column) + && $self->bz_sequence_exists($old_seq)) + { + print "Fixing $old_seq sequence...\n"; + $self->do("ALTER SEQUENCE $old_seq RENAME TO $new_seq"); + $self->do("ALTER TABLE $table ALTER COLUMN $column + SET DEFAULT NEXTVAL('$new_seq')"); + return 1; + } + return 0; +} + # Renames things that differ only in case. sub _fix_case_differences { my ($table, $field) = @_; -- cgit v1.2.3-24-g4f1b