]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Fix for schema upgrade issue when primary keys change; fixes upgrade direct from...
authorBrion Vibber <brion@pobox.com>
Thu, 8 Sep 2011 20:03:22 +0000 (13:03 -0700)
committerBrion Vibber <brion@pobox.com>
Thu, 8 Sep 2011 20:03:22 +0000 (13:03 -0700)
Previously we were failing to update the primary key during ensureTable(), which could lead to failures when updating some tables (eg queue_item where we changed keys, and the addition of an autoincrement column failed because it conflicted with the old key).
Now if the key is different, we remove the old key at the start and add the new key at the end of the ALTER TABLE.

Not tested on PostgreSQL -- someone please check whether the alter table 'DROP CONSTRAINT PRIMARY KEY' bit works or if it needs to pull a special name for the key.
On MySQL, dropping uses alter table's 'DROP PRIMARY KEY' special case.

lib/mysqlschema.php
lib/schema.php

index c3d3501c74cff52f6018cc73ac8120be65970a75..435ba4e3a95f57f3ca0ba314db4fb483d0ca0b83 100644 (file)
@@ -298,6 +298,16 @@ class MysqlSchema extends Schema
         return "{$tableName}_{$columnName}_idx";
     }
 
+    /**
+     * MySQL doesn't take 'DROP CONSTRAINT', need to treat primary keys as
+     * if they were indexes here, but can use 'PRIMARY KEY' special name.
+     *
+     * @param array $phrase
+     */
+    function appendAlterDropPrimary(array &$phrase)
+    {
+        $phrase[] = 'DROP PRIMARY KEY';
+    }
 
     /**
      * MySQL doesn't take 'DROP CONSTRAINT', need to treat unique keys as
index 2e27955881c235450bbc383ad3e75791cfe11031..aad705a533a489086a7a1567f32539a93bfc9d32 100644 (file)
@@ -579,6 +579,10 @@ class Schema
             $this->appendAlterDropUnique($phrase, $keyName);
         }
 
+        if (isset($old['primary key']) && (!isset($def['primary key']) || $def['primary key'] != $old['primary key'])) {
+            $this->appendAlterDropPrimary($phrase);
+        }
+
         foreach ($fields['add'] as $columnName) {
             $this->appendAlterAddColumn($phrase, $columnName,
                     $def['fields'][$columnName]);
@@ -594,6 +598,10 @@ class Schema
             $this->appendAlterDropColumn($phrase, $columnName);
         }
 
+        if (isset($def['primary key']) && (!isset($old['primary key']) || $old['primary key'] != $def['primary key'])) {
+            $this->appendAlterAddPrimary($phrase, $def['primary key']);
+        }
+
         foreach ($uniques['mod'] + $uniques['add'] as $keyName) {
             $this->appendAlterAddUnique($phrase, $keyName, $def['unique keys'][$keyName]);
         }
@@ -713,6 +721,19 @@ class Schema
         $phrase[] = implode(' ', $sql);
     }
 
+    function appendAlterAddPrimary(array &$phrase, array $def)
+    {
+        $sql = array();
+        $sql[] = 'ADD';
+        $this->appendPrimaryKeyDef($sql, $def);
+        $phrase[] = implode(' ', $sql);
+    }
+
+    function appendAlterDropPrimary(array &$phrase)
+    {
+        $phrase[] = 'DROP CONSTRAINT PRIMARY KEY';
+    }
+
     function appendAlterDropUnique(array &$phrase, $keyName)
     {
         $phrase[] = 'DROP CONSTRAINT ' . $keyName;