Skip to content

Commit 4727025

Browse files
authored
Merge pull request #6390 from iRedds/fix/alias-subquery
Fix: The subquery adds a prefix for the table alias.
2 parents aed7114 + 99f0dd5 commit 4727025

File tree

4 files changed

+46
-3
lines changed

4 files changed

+46
-3
lines changed

system/Database/BaseBuilder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ public function fromSubquery(BaseBuilder $from, string $alias): self
577577
{
578578
$table = $this->buildSubquery($from, true, $alias);
579579

580-
$this->trackAliases($table);
580+
$this->db->addTableAlias($alias);
581581
$this->QBFrom[] = $table;
582582

583583
return $this;
@@ -2952,7 +2952,7 @@ protected function buildSubquery($builder, bool $wrapped = false, string $alias
29522952
throw new DatabaseException('The subquery cannot be the same object as the main query object.');
29532953
}
29542954

2955-
$subquery = strtr($builder->getCompiledSelect(), "\n", ' ');
2955+
$subquery = strtr($builder->getCompiledSelect(false), "\n", ' ');
29562956

29572957
if ($wrapped) {
29582958
$subquery = '(' . $subquery . ')';

system/Database/BaseConnection.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,12 @@ public function table($tableName)
882882
*/
883883
public function newQuery(): BaseBuilder
884884
{
885-
return $this->table(',')->from([], true);
885+
// save table aliases
886+
$tempAliases = $this->aliasedTables;
887+
$builder = $this->table(',')->from([], true);
888+
$this->aliasedTables = $tempAliases;
889+
890+
return $builder;
886891
}
887892

888893
/**

tests/system/Database/Builder/PrefixTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace CodeIgniter\Database\Builder;
1313

14+
use CodeIgniter\Database\BaseBuilder;
1415
use CodeIgniter\Test\CIUnitTestCase;
1516
use CodeIgniter\Test\Mock\MockConnection;
1617

@@ -49,4 +50,40 @@ public function testPrefixesSetOnTableNamesWithWhereClause()
4950
$this->assertSame($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
5051
$this->assertSame($expectedBinds, $builder->getBinds());
5152
}
53+
54+
public function testPrefixWithSubquery(): void
55+
{
56+
$expected = <<<'NOWDOC'
57+
SELECT "u"."id", "u"."name", (SELECT 1 FROM "ci_users" "sub" WHERE "sub"."id" = "u"."id") "one"
58+
FROM "ci_users" "u"
59+
WHERE "u"."id" = 1
60+
NOWDOC;
61+
62+
$subquery = $this->db->table('users sub')
63+
->select('1', false)
64+
->where('sub.id = u.id');
65+
66+
$builder = $this->db->table('users u')
67+
->select('u.id, u.name')
68+
->selectSubquery($subquery, 'one')
69+
->where('u.id', 1);
70+
71+
$this->assertSame($expected, $builder->getCompiledSelect());
72+
}
73+
74+
public function testPrefixWithNewQuery(): void
75+
{
76+
$expectedSQL = <<<'NOWDOC'
77+
SELECT "users_1"."id", "name"
78+
FROM (SELECT "u"."id", "u"."name" FROM "ci_users" "u") "users_1"
79+
WHERE "users_1"."id" > 10
80+
NOWDOC;
81+
82+
$subquery = (new BaseBuilder('users u', $this->db))->select('u.id, u.name');
83+
$builder = $this->db->newQuery()->fromSubquery($subquery, 'users_1')
84+
->select('users_1.id, name')
85+
->where('users_1.id > ', 10);
86+
87+
$this->assertSame($expectedSQL, $builder->getCompiledSelect());
88+
}
5289
}

user_guide_src/source/changelogs/v4.2.5.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,6 @@ none.
3232

3333
Bugs Fixed
3434
**********
35+
- When using subqueries in the main query, prefixes are added to the table alias.
3536

3637
See the repo's `CHANGELOG.md <https://github.com/codeigniter4/CodeIgniter4/blob/develop/CHANGELOG.md>`_ for a complete list of bugs fixed.

0 commit comments

Comments
 (0)