Skip to content

Commit

Permalink
Fix issue where createSchema() would omit primary keys sometimes.
Browse files Browse the repository at this point in the history
Fix missing primary key SQL when using the primary flag + other indexes.

Fixes #3292
  • Loading branch information
markstory committed Oct 23, 2012
1 parent 1c0c860 commit a0a61b5
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/Cake/Model/Datasource/DboSource.php
Expand Up @@ -2984,7 +2984,7 @@ public function createSchema($schema, $tableName = null) {
$tableParameters = array_merge($tableParameters, $this->buildTableParameters($col, $table));
}
}
if (empty($indexes) && !empty($primary)) {
if (!isset($columns['indexes']['PRIMARY']) && !empty($primary)) {
$col = array('PRIMARY' => array('column' => $primary, 'unique' => 1));
$indexes = array_merge($indexes, $this->buildIndex($col, $table));
}
Expand Down
46 changes: 46 additions & 0 deletions lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php
Expand Up @@ -877,6 +877,52 @@ public function testTwoColumnsWithPrimaryKey() {
$this->assertContains('`user_id` int(11) NOT NULL,', $result);
}

/**
* Test that the primary flag is handled correctly.
*
* @return void
*/
public function testCreateSchemaAutoPrimaryKey() {
$schema = new CakeSchema();
$schema->tables = array(
'no_indexes' => array(
'id' => array('type' => 'integer', 'null' => false, 'key' => 'primary'),
'data' => array('type' => 'integer', 'null' => false),
'indexes' => array(),
)
);
$result = $this->Dbo->createSchema($schema, 'no_indexes');
$this->assertContains('PRIMARY KEY (`id`)', $result);
$this->assertNotContains('UNIQUE KEY', $result);

$schema->tables = array(
'primary_index' => array(
'id' => array('type' => 'integer', 'null' => false),
'data' => array('type' => 'integer', 'null' => false),
'indexes' => array(
'PRIMARY' => array('column' => 'id', 'unique' => 1),
'some_index' => array('column' => 'data', 'unique' => 1)
),
)
);
$result = $this->Dbo->createSchema($schema, 'primary_index');
$this->assertContains('PRIMARY KEY (`id`)', $result);
$this->assertContains('UNIQUE KEY `some_index` (`data`)', $result);

$schema->tables = array(
'primary_flag_has_index' => array(
'id' => array('type' => 'integer', 'null' => false, 'key' => 'primary'),
'data' => array('type' => 'integer', 'null' => false),
'indexes' => array (
'some_index' => array('column' => 'data', 'unique' => 1)
),
)
);
$result = $this->Dbo->createSchema($schema, 'primary_flag_has_index');
$this->assertContains('PRIMARY KEY (`id`)', $result);
$this->assertContains('UNIQUE KEY `some_index` (`data`)', $result);
}

/**
* Tests that listSources method sends the correct query and parses the result accordingly
* @return void
Expand Down

0 comments on commit a0a61b5

Please sign in to comment.