Skip to content

Commit

Permalink
fix: Forge::dropColumn() always returns false on SQLite3 driver (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
paulbalandan authored Dec 31, 2024
1 parent 0fe4bd0 commit d7ce2ba
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 20 deletions.
2 changes: 1 addition & 1 deletion system/Database/Forge.php
Original file line number Diff line number Diff line change
Expand Up @@ -778,7 +778,7 @@ public function addColumn(string $table, $fields): bool
}

/**
* @param array|string $columnNames column names to DROP
* @param list<string>|string $columnNames column names to DROP
*
* @return bool
*
Expand Down
36 changes: 25 additions & 11 deletions system/Database/SQLite3/Forge.php
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,31 @@ public function dropDatabase(string $dbName): bool
return true;
}

/**
* @param list<string>|string $columnNames
*
* @throws DatabaseException
*/
public function dropColumn(string $table, $columnNames): bool
{
$columns = is_array($columnNames) ? $columnNames : array_map(trim(...), explode(',', $columnNames));
$result = (new Table($this->db, $this))
->fromTable($this->db->DBPrefix . $table)
->dropColumn($columns)
->run();

if (! $result && $this->db->DBDebug) {
throw new DatabaseException(sprintf(
'Failed to drop column%s "%s" on "%s" table.',
count($columns) > 1 ? 's' : '',
implode('", "', $columns),
$table,
));
}

return $result;
}

/**
* @param array|string $processedFields Processed column definitions
* or column names to DROP
Expand All @@ -121,17 +146,6 @@ public function dropDatabase(string $dbName): bool
protected function _alterTable(string $alterType, string $table, $processedFields)
{
switch ($alterType) {
case 'DROP':
$columnNamesToDrop = $processedFields;

$sqlTable = new Table($this->db, $this);

$sqlTable->fromTable($table)
->dropColumn($columnNamesToDrop)
->run();

return ''; // Why empty string?
case 'CHANGE':
$fieldsToModify = [];

Expand Down
3 changes: 1 addition & 2 deletions tests/system/Database/Live/ForgeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1319,8 +1319,7 @@ public function testDropColumn(): void
$this->forge->createTable('forge_test_two');

$this->assertTrue($this->db->fieldExists('name', 'forge_test_two'));

$this->forge->dropColumn('forge_test_two', 'name');
$this->assertTrue($this->forge->dropColumn('forge_test_two', 'name'));

$this->db->resetDataCache();

Expand Down
1 change: 1 addition & 0 deletions user_guide_src/source/changelogs/v4.5.7.rst
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ Bugs Fixed
**********

- **Common:** Fixed a bug where the ``helper()`` method may throw `FileNotFoundException` on valid namespaced helper.
- **Forge:** Fixed an issue where `SQLite3`'s Forge always returns `false` when calling ``dropColumn()``.

See the repo's
`CHANGELOG.md <https://github.com/codeigniter4/CodeIgniter4/blob/develop/CHANGELOG.md>`_
Expand Down
7 changes: 1 addition & 6 deletions utils/phpstan-baseline/missingType.iterableValue.neon
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# total 1686 errors
# total 1685 errors

parameters:
ignoreErrors:
Expand Down Expand Up @@ -1697,11 +1697,6 @@ parameters:
count: 1
path: ../../system/Database/Forge.php

-
message: '#^Method CodeIgniter\\Database\\Forge\:\:dropColumn\(\) has parameter \$columnNames with no value type specified in iterable type array\.$#'
count: 1
path: ../../system/Database/Forge.php

-
message: '#^Method CodeIgniter\\Database\\Forge\:\:modifyColumn\(\) has parameter \$fields with no value type specified in iterable type array\.$#'
count: 1
Expand Down

0 comments on commit d7ce2ba

Please sign in to comment.