diff --git a/system/Database/Forge.php b/system/Database/Forge.php index b41b8f34f8c8..974c45848d1c 100644 --- a/system/Database/Forge.php +++ b/system/Database/Forge.php @@ -778,7 +778,7 @@ public function addColumn(string $table, $fields): bool } /** - * @param array|string $columnNames column names to DROP + * @param list|string $columnNames column names to DROP * * @return bool * diff --git a/system/Database/SQLite3/Forge.php b/system/Database/SQLite3/Forge.php index 48e9abcc425c..03120dd7a0da 100644 --- a/system/Database/SQLite3/Forge.php +++ b/system/Database/SQLite3/Forge.php @@ -110,6 +110,31 @@ public function dropDatabase(string $dbName): bool return true; } + /** + * @param list|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 @@ -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 = []; diff --git a/tests/system/Database/Live/ForgeTest.php b/tests/system/Database/Live/ForgeTest.php index 8f76efd12b42..0ab672e72067 100644 --- a/tests/system/Database/Live/ForgeTest.php +++ b/tests/system/Database/Live/ForgeTest.php @@ -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(); diff --git a/user_guide_src/source/changelogs/v4.5.7.rst b/user_guide_src/source/changelogs/v4.5.7.rst index b196c5f5fffe..fc36acf3b314 100644 --- a/user_guide_src/source/changelogs/v4.5.7.rst +++ b/user_guide_src/source/changelogs/v4.5.7.rst @@ -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 `_ diff --git a/utils/phpstan-baseline/missingType.iterableValue.neon b/utils/phpstan-baseline/missingType.iterableValue.neon index 812228800d8f..6abf970718c7 100644 --- a/utils/phpstan-baseline/missingType.iterableValue.neon +++ b/utils/phpstan-baseline/missingType.iterableValue.neon @@ -1,4 +1,4 @@ -# total 1686 errors +# total 1685 errors parameters: ignoreErrors: @@ -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