diff --git a/system/Database/BaseBuilder.php b/system/Database/BaseBuilder.php index a3fc6c7563d3..a684ff525b7f 100644 --- a/system/Database/BaseBuilder.php +++ b/system/Database/BaseBuilder.php @@ -1662,7 +1662,10 @@ public function insertBatch(?array $set = null, ?bool $escape = null, int $batch } if (! $hasQBSet) { - $this->resetWrite(); + $this->resetRun([ + 'QBSet' => [], + 'QBKeys' => [], + ]); } } diff --git a/system/Test/Mock/MockBuilder.php b/system/Test/Mock/MockBuilder.php index 63002436b4e4..ae28190b0337 100644 --- a/system/Test/Mock/MockBuilder.php +++ b/system/Test/Mock/MockBuilder.php @@ -15,4 +15,9 @@ class MockBuilder extends BaseBuilder { + protected $supportedIgnoreStatements = [ + 'update' => 'IGNORE', + 'insert' => 'IGNORE', + 'delete' => 'IGNORE', + ]; } diff --git a/tests/system/Database/Builder/InsertTest.php b/tests/system/Database/Builder/InsertTest.php index 5235a3bdbf58..1844434d3a1c 100644 --- a/tests/system/Database/Builder/InsertTest.php +++ b/tests/system/Database/Builder/InsertTest.php @@ -100,6 +100,43 @@ public function testInsertBatch() $this->assertSame($expected, str_replace("\n", ' ', $query->getQuery())); } + /** + * @see https://github.com/codeigniter4/CodeIgniter4/issues/5671 + */ + public function testInsertBatchIgnore() + { + $builder = $this->db->table('jobs'); + + $insertData = [ + [ + 'id' => 2, + 'name' => 'Commedian', + 'description' => 'There\'s something in your teeth', + ], + [ + 'id' => 3, + 'name' => 'Cab Driver', + 'description' => 'I am yellow', + ], + ]; + + $this->db->shouldReturn('execute', 1)->shouldReturn('affectedRows', 1); + $builder->ignore()->insertBatch($insertData, true, 1); + + $query = $this->db->getLastQuery(); + $this->assertInstanceOf(Query::class, $query); + + $raw = <<<'SQL' + INSERT IGNORE INTO "jobs" ("description", "id", "name") VALUES ('I am yellow',3,'Cab Driver') + SQL; + $this->assertSame($raw, str_replace("\n", ' ', $query->getOriginalQuery())); + + $expected = <<<'SQL' + INSERT IGNORE INTO "jobs" ("description", "id", "name") VALUES ('I am yellow',3,'Cab Driver') + SQL; + $this->assertSame($expected, str_replace("\n", ' ', $query->getQuery())); + } + public function testInsertBatchWithoutEscape() { $builder = $this->db->table('jobs');