Commit 6fb7312d authored by Steve Müller's avatar Steve Müller

Merge pull request #786 from andig/fix-dbal-464

Fix removing autoincrement column from a primary key
parents 937c92fe 0e86073e
......@@ -625,6 +625,9 @@ class MySqlPlatform extends AbstractPlatform
$sql[] = 'ALTER TABLE ' . $table . ' MODIFY ' .
$this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray());
// original autoincrement information might be needed later on by other parts of the table alteration
$column->setAutoincrement(true);
}
}
}
......@@ -669,6 +672,7 @@ class MySqlPlatform extends AbstractPlatform
$sql = array_merge(
$sql,
$this->getPreAlterTableAlterIndexForeignKeySQL($diff),
parent::getPreAlterTableIndexForeignKeySQL($diff),
$this->getPreAlterTableRenameIndexForeignKeySQL($diff)
);
......@@ -676,6 +680,42 @@ class MySqlPlatform extends AbstractPlatform
return $sql;
}
/**
* @param TableDiff $diff The table diff to gather the SQL for.
*
* @return array
*/
private function getPreAlterTableAlterIndexForeignKeySQL(TableDiff $diff)
{
$sql = array();
$table = $diff->getName($this)->getQuotedName($this);
foreach ($diff->changedIndexes as $changedIndex) {
// Changed primary key
if ($changedIndex->isPrimary() && $diff->fromTable instanceof Table) {
foreach ($diff->fromTable->getPrimaryKeyColumns() as $columnName) {
$column = $diff->fromTable->getColumn($columnName);
// Check if an autoincrement column was dropped from the primary key.
if ($column->getAutoincrement() && ! in_array($columnName, $changedIndex->getColumns())) {
// The autoincrement attribute needs to be removed from the dropped column
// before we can drop and recreate the primary key.
$column->setAutoincrement(false);
$sql[] = 'ALTER TABLE ' . $table . ' MODIFY ' .
$this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray());
// Restore the autoincrement attribute as it might be needed later on
// by other parts of the table alteration.
$column->setAutoincrement(true);
}
}
}
}
return $sql;
}
/**
* @param TableDiff $diff The table diff to gather the SQL for.
*
......
......@@ -333,14 +333,40 @@ abstract class AbstractMySQLPlatformTestCase extends AbstractPlatformTestCase
);
}
/**
* @group DBAL-1132
*/
public function testAlterPrimaryKeyWithAutoincrementColumn()
{
$table = new Table("alter_primary_key");
$table->addColumn('id', 'integer', array('autoincrement' => true));
$table->addColumn('foo', 'integer');
$table->setPrimaryKey(array('id'));
$comparator = new Comparator();
$diffTable = clone $table;
$diffTable->dropPrimaryKey();
$diffTable->setPrimaryKey(array('foo'));
$this->assertEquals(
array(
'ALTER TABLE alter_primary_key MODIFY id INT NOT NULL',
'ALTER TABLE alter_primary_key DROP PRIMARY KEY',
'ALTER TABLE alter_primary_key ADD PRIMARY KEY (foo)'
),
$this->_platform->getAlterTableSQL($comparator->diffTable($table, $diffTable))
);
}
/**
* @group DBAL-464
*/
public function testDropPrimaryKeyWithAutoincrementColumn()
{
$table = new Table("drop_primary_key");
$table->addColumn('id', 'integer', array('primary' => true, 'autoincrement' => true));
$table->addColumn('foo', 'integer', array('primary' => true));
$table->addColumn('id', 'integer', array('autoincrement' => true));
$table->addColumn('foo', 'integer');
$table->addColumn('bar', 'integer');
$table->setPrimaryKey(array('id', 'foo'));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment