Skip to content

Commit

Permalink
fix: add a primary key to an existing table
Browse files Browse the repository at this point in the history
  • Loading branch information
michalsn committed Oct 11, 2023
1 parent 155859b commit 6b23949
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 5 deletions.
8 changes: 3 additions & 5 deletions system/Database/Forge.php
Original file line number Diff line number Diff line change
Expand Up @@ -1084,12 +1084,10 @@ public function processIndexes(string $table): bool

if (! empty($this->keys)) {
$sqls = $this->_processIndexes($this->db->DBPrefix . $table, true);
}

$pk = $this->_processPrimaryKeys($table, true);

if ($pk !== '') {
$sqls[] = $pk;
}
if (! empty($this->primaryKeys)) {
$sqls[] = $this->_processPrimaryKeys($table, true);
}

$this->foreignKeys = $fk;
Expand Down
81 changes: 81 additions & 0 deletions tests/system/Database/Live/ForgeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1657,6 +1657,87 @@ public function testProcessIndexes(): void
$this->forge->dropTable('user2', true);
}

public function testProcessIndexesWithKeyOnly(): void
{
// make sure tables don't exist
$this->forge->dropTable('actions', true);

$this->createActionsTable();
$this->forge->addKey('name', false, false, 'db_actions_name');

// create indexes
$this->forge->processIndexes('actions');

// get a list of all indexes
$allIndexes = $this->db->getIndexData('actions');

// check that db_actions_name key exists
$indexes = array_filter(
$allIndexes,
static fn ($index) => ($index->name === 'db_actions_name')
&& ($index->fields === [0 => 'name'])
);
$this->assertCount(1, $indexes);

// drop tables to avoid any future conflicts
$this->forge->dropTable('actions', true);
}

public function testProcessIndexesWithPrimaryKeyOnly(): void
{
// make sure tables don't exist
$this->forge->dropTable('actions', true);

$this->createActionsTable();
$this->forge->addPrimaryKey('id');

// create indexes
$this->forge->processIndexes('actions');

// get a list of all indexes
$allIndexes = $this->db->getIndexData('actions');

// check that the primary key exists
$indexes = array_filter(
$allIndexes,
static fn ($index) => $index->type === 'PRIMARY'
);
$this->assertCount(1, $indexes);

// drop tables to avoid any future conflicts
$this->forge->dropTable('actions', true);
}

public function testProcessIndexesWithForeignKeyOnly(): void

Check warning on line 1711 in tests/system/Database/Live/ForgeTest.php

View workflow job for this annotation

GitHub Actions / database-live-tests (8.1, SQLSRV, 5.7) / Database Live Tests

Took 0.61s from 0.50s limit to run CodeIgniter\\Database\\Live\\ForgeTest::testProcessIndexesWithForeignKeyOnly
{
// make sure tables don't exist
$this->forge->dropTable('actions', true);
$this->forge->dropTable('user2', true);

$this->createUser2TableWithKeys();
$this->populateUser2Table();
$this->createActionsTable();

// SQLite does not support custom foreign key name
if ($this->db->DBDriver === 'SQLite3') {
$this->forge->addForeignKey('userid', 'user', 'id');
$this->forge->addForeignKey('userid2', 'user2', 'id');
} else {
$this->forge->addForeignKey('userid', 'user', 'id', '', '', 'db_actions_userid_foreign');
$this->forge->addForeignKey('userid2', 'user2', 'id', '', '', 'db_actions_userid2_foreign');
}

// create indexes
$this->forge->processIndexes('actions');

// check that the two foreign keys exist
$this->assertCount(2, $this->db->getForeignKeyData('actions'));

// drop tables to avoid any future conflicts
$this->forge->dropTable('actions', true);
$this->forge->dropTable('user2', true);
}

private function createUser2TableWithKeys(): void
{
$fields = [
Expand Down
2 changes: 2 additions & 0 deletions user_guide_src/source/changelogs/v4.4.2.rst
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ Bugs Fixed
Page Not Found.
- **Spark:** Fixed a bug that caused spark to not display exceptions in the
production mode or to display backtrace in json when an exception occurred.
- **Forge:** Fixed a bug where adding a Primary Key to an existing table was
ignored if there were no other Keys added too.

See the repo's
`CHANGELOG.md <https://github.com/codeigniter4/CodeIgniter4/blob/develop/CHANGELOG.md>`_
Expand Down

0 comments on commit 6b23949

Please sign in to comment.