diff --git a/system/Database/BaseBuilder.php b/system/Database/BaseBuilder.php index 4e6e422b2a6f..acfaa9e9183c 100644 --- a/system/Database/BaseBuilder.php +++ b/system/Database/BaseBuilder.php @@ -424,8 +424,10 @@ public function select($select = '*', ?bool $escape = null) * This prevents NULL being escaped * @see https://github.com/codeigniter4/CodeIgniter4/issues/1169 */ - if (mb_stripos(trim($val), 'NULL') === 0) { - $escape = false; + if (mb_stripos($val, 'NULL') === 0) { + $this->QBNoEscape[] = false; + + continue; } $this->QBNoEscape[] = $escape; diff --git a/tests/system/Database/Builder/SelectTest.php b/tests/system/Database/Builder/SelectTest.php index cd3f39029f6b..a761706dd3df 100644 --- a/tests/system/Database/Builder/SelectTest.php +++ b/tests/system/Database/Builder/SelectTest.php @@ -100,6 +100,28 @@ public function testSelectWorksWithComplexSelects(): void $this->assertSame($expected, str_replace("\n", ' ', $builder->getCompiledSelect())); } + public function testSelectNullAsInString(): void + { + $builder = new BaseBuilder('users', $this->db); + + $builder->select('NULL as field_alias, name'); + + $expected = 'SELECT NULL as field_alias, "name" FROM "users"'; + + $this->assertSame($expected, str_replace("\n", ' ', $builder->getCompiledSelect())); + } + + public function testSelectNullAsInArray(): void + { + $builder = new BaseBuilder('users', $this->db); + + $builder->select(['NULL as field_alias', 'name']); + + $expected = 'SELECT NULL as field_alias, "name" FROM "users"'; + + $this->assertSame($expected, str_replace("\n", ' ', $builder->getCompiledSelect())); + } + /** * @see https://github.com/codeigniter4/CodeIgniter4/issues/4355 */