Bug 289139: Bugzilla::DB::Schema::Pg needs to re-create indexes when it has to drop them for a rename/alter

Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=Tomas.Kopal, a=justdave
This commit is contained in:
mkanat%kerio.com 2005-05-03 08:35:29 +00:00
parent 3a4f4121f8
commit 99d0bb95b2

View File

@ -1464,21 +1464,39 @@ sub get_alter_column_ddl {
# UPDATE the temp column to have the same values as the old column
push(@statements, "UPDATE $table SET ${column}_ALTERTEMP = "
. " CAST($column AS $type)");
# Some databases drop a whole index when a column is dropped,
# some only remove that column from an index. For consistency,
# we manually drop all indexes on the column before dropping the
# column.
my %col_idx = $self->get_indexes_on_column_abstract($table, $column);
foreach my $idx_name (keys %col_idx) {
push(@statements, $self->get_drop_index_ddl($table, $idx_name));
}
# DROP the old column
push(@statements, "ALTER TABLE $table DROP COLUMN $column");
# And rename the temp column to be the new one.
push(@statements, "ALTER TABLE $table RENAME COLUMN "
. " ${column}_ALTERTEMP TO $column");
# FIXME - And now, we have to regenerate any indexes that got
# And now, we have to regenerate any indexes that got
# dropped, except for the PK index which will be handled
# below.
foreach my $idx_name (keys %col_idx) {
push(@statements,
$self->get_add_index_ddl($table, $idx_name, $col_idx{$idx_name}));
}
}
my $default = $new_def->{DEFAULT};
my $default_old = $old_def->{DEFAULT};
# This first condition prevents "uninitialized value" errors.
if (!defined $default && !defined $default_old) {
# Do Nothing
}
# If we went from having a default to not having one
if (!defined $default && defined $default_old) {
elsif (!defined $default && defined $default_old) {
push(@statements, "ALTER TABLE $table ALTER COLUMN $column"
. " DROP DEFAULT");
}
@ -1637,6 +1655,45 @@ sub get_column_abstract {
return undef;
}
=item C<get_indexes_on_column_abstract($table, $column)>
Description: Gets a list of indexes that are on a given column.
Params: $table - The table the column is on.
$column - The name of the column.
Returns: Indexes in the standard format of an INDEX
entry on a table. That is, key-value pairs
where the key is the index name and the value
is the index definition.
If there are no indexes on that column, we return
undef.
=cut
sub get_indexes_on_column_abstract {
my ($self, $table, $column) = @_;
my %ret_hash;
my $table_def = $self->get_table_abstract($table);
if ($table_def && exists $table_def->{INDEXES}) {
my %indexes = (@{ $table_def->{INDEXES} });
foreach my $index_name (keys %indexes) {
my $col_list;
# Get the column list, depending on whether the index
# is in hashref or arrayref format.
if (ref($indexes{$index_name}) eq 'HASH') {
$col_list = $indexes{$index_name}->{FIELDS};
} else {
$col_list = $indexes{$index_name};
}
if(grep($_ eq $column, @$col_list)) {
$ret_hash{$index_name} = dclone($indexes{$index_name});
}
}
}
return %ret_hash;
}
sub get_index_abstract {
=item C<get_index_abstract($table, $index)
@ -1730,7 +1787,7 @@ sub delete_column {
sub rename_column {
=item C<rename_column($table, $old_name, $new_name>
=item C<rename_column($table, $old_name, $new_name)>
Description: Renames a column on a table in the Schema object.
The column that you are renaming must exist.