diff --git a/lib/Cake/Model/CakeSchema.php b/lib/Cake/Model/CakeSchema.php index 38f663cc5..85ec28bb4 100644 --- a/lib/Cake/Model/CakeSchema.php +++ b/lib/Cake/Model/CakeSchema.php @@ -486,8 +486,9 @@ class CakeSchema extends Object { foreach ($fields as $field => $value) { if (!empty($old[$table][$field])) { - $diff = $this->_arrayDiffAssoc($value, $old[$table][$field]); - if (!empty($diff) && $field !== 'indexes' && $field !== 'tableParameters') { + $diff = !empty($this->_arrayDiffAssoc($value, $old[$table][$field])) + || !empty($this->_arrayDiffAssoc($old[$table][$field], $value)); + if ($diff && $field !== 'indexes' && $field !== 'tableParameters') { $tables[$table]['change'][$field] = $value; } } diff --git a/lib/Cake/Test/Case/Model/CakeSchemaTest.php b/lib/Cake/Test/Case/Model/CakeSchemaTest.php index 67c4d8bd5..eb2a64a82 100644 --- a/lib/Cake/Test/Case/Model/CakeSchemaTest.php +++ b/lib/Cake/Test/Case/Model/CakeSchemaTest.php @@ -953,6 +953,63 @@ class CakeSchemaTest extends CakeTestCase { $this->assertEquals($expected, $compare, 'Invalid SQL, datetime does not have length'); } +/** + * Test comparing with field length/limit changed from some non-default value to the default + * + * @return void + */ + public function testCompareLimitToDefault() { + $old = array( + 'posts' => array( + 'id' => array('type' => 'integer', 'null' => false, 'default' => 1, 'key' => 'primary'), + 'author_id' => array('type' => 'integer', 'null' => false, 'limit' => 5), + 'title' => array('type' => 'string', 'null' => true, 'length' => 45), + 'indexes' => array( + 'PRIMARY' => array('column' => 'id', 'unique' => true) + ), + 'tableParameters' => array( + 'charset' => 'latin1', + 'collate' => 'latin1_general_ci' + ) + ), + ); + $new = array( + 'posts' => array( + 'id' => array('type' => 'integer', 'null' => false, 'key' => 'primary'), + 'author_id' => array('type' => 'integer', 'null' => false), + 'title' => array('type' => 'varchar', 'null' => true), + 'indexes' => array( + 'PRIMARY' => array('column' => 'id', 'unique' => true) + ), + 'tableParameters' => array( + 'charset' => 'latin1', + 'collate' => 'latin1_general_ci' + ) + ), + ); + $compare = $this->Schema->compare($old, $new); + $expected = array( + 'posts' => array( + 'change' => array( + 'id' => array( + 'type' => 'integer', + 'null' => false, + 'key' => 'primary' + ), + 'author_id' => array( + 'type' => 'integer', + 'null' => false, + ), + 'title' => array( + 'type' => 'varchar', + 'null' => true, + ) + ) + ), + ); + $this->assertEquals($expected, $compare, 'Invalid SQL, field length change not detected'); + } + /** * testSchemaLoading method *