diff --git a/system/Database/BaseBuilder.php b/system/Database/BaseBuilder.php index ccfa5bd9d8bb..842aae3c8a29 100644 --- a/system/Database/BaseBuilder.php +++ b/system/Database/BaseBuilder.php @@ -2763,6 +2763,10 @@ protected function buildSubquery($builder, bool $wrapped = false, string $alias $builder($builder = $this->db->newQuery()); } + if ($builder === $this) { + throw new DatabaseException('The subquery cannot be the same object as the main query object.'); + } + $subquery = strtr($builder->getCompiledSelect(), "\n", ' '); if ($wrapped) { diff --git a/tests/system/Database/Builder/BaseTest.php b/tests/system/Database/Builder/BaseTest.php index 1390e4668200..c7386066aa74 100644 --- a/tests/system/Database/Builder/BaseTest.php +++ b/tests/system/Database/Builder/BaseTest.php @@ -11,6 +11,7 @@ namespace CodeIgniter\Database\Builder; +use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\Mock\MockConnection; @@ -53,4 +54,14 @@ public function testGetTableIgnoresFrom() $result = $builder->getTable(); $this->assertSame('jobs', $result); } + + public function testSubquerySameBaseBuilderObject() + { + $this->expectException(DatabaseException::class); + $this->expectExceptionMessage('The subquery cannot be the same object as the main query object.'); + + $builder = $this->db->table('users'); + + $builder->fromSubquery($builder, 'sub'); + } }