]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 310231: MySQL-specific get_alter_column_ddl will not drop primary key
authormkanat%kerio.com <>
Mon, 19 Dec 2005 02:53:00 +0000 (02:53 +0000)
committermkanat%kerio.com <>
Mon, 19 Dec 2005 02:53:00 +0000 (02:53 +0000)
Patch By Olav Vitters <bugzilla-mozilla@bkor.dhs.org> r=mkanat, a=justdave

Bugzilla/DB/Schema/Mysql.pm

index ba6ac7280e378186fc83e20ab5fdf1427334d150..04ea92162cce8103cd0b535e995ede66bba95b0a 100644 (file)
@@ -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;
 }