From 70adf1be30d18f1735a14813abccdc79baca0e4b Mon Sep 17 00:00:00 2001 From: "mkanat%kerio.com" <> Date: Mon, 19 Dec 2005 02:53:00 +0000 Subject: Bug 310231: MySQL-specific get_alter_column_ddl will not drop primary key Patch By Olav Vitters r=mkanat, a=justdave --- Bugzilla/DB/Schema/Mysql.pm | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'Bugzilla/DB') diff --git a/Bugzilla/DB/Schema/Mysql.pm b/Bugzilla/DB/Schema/Mysql.pm index ba6ac7280..04ea92162 100644 --- a/Bugzilla/DB/Schema/Mysql.pm +++ b/Bugzilla/DB/Schema/Mysql.pm @@ -153,12 +153,25 @@ sub _get_create_index_ddl { # MySQL has a simpler ALTER TABLE syntax than ANSI. sub get_alter_column_ddl { my ($self, $table, $column, $new_def, $set_nulls_to) = @_; - my $new_ddl = $self->get_type_ddl($new_def); + my $old_def = $self->get_column($table, $column); + my %new_def_copy = %$new_def; + if ($old_def->{PRIMARYKEY} && $new_def->{PRIMARYKEY}) { + # If a column stays a primary key do NOT specify PRIMARY KEY in the + # ALTER TABLE statement. This avoids a MySQL error that two primary + # keys are not allowed. + delete $new_def_copy{PRIMARYKEY}; + } + + my $new_ddl = $self->get_type_ddl(\%new_def_copy); my @statements; push(@statements, "UPDATE $table SET $column = $set_nulls_to WHERE $column IS NULL") if defined $set_nulls_to; push(@statements, "ALTER TABLE $table CHANGE COLUMN $column $column $new_ddl"); + if ($old_def->{PRIMARYKEY} && !$new_def->{PRIMARYKEY}) { + # Dropping a PRIMARY KEY needs an explicit DROP PRIMARY KEY + push(@statements, "ALTER TABLE $table DROP PRIMARY KEY"); + } return @statements; } -- cgit v1.2.3-24-g4f1b