Skip to content

Commit d560ab2

Browse files
committed
Update getCompiledX methods in BaseBuilder to return fully compiled query strings. Fixes #1526
1 parent 5f305a7 commit d560ab2

6 files changed

Lines changed: 56 additions & 35 deletions

File tree

system/Database/BaseBuilder.php

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,11 +1399,32 @@ public function getCompiledSelect($reset = true)
13991399
$this->resetSelect();
14001400
}
14011401

1402-
return $select;
1402+
return $this->compileFinalQuery($select);
14031403
}
14041404

14051405
//--------------------------------------------------------------------
14061406

1407+
/**
1408+
* Returns a finalized, compiled query string with the bindings
1409+
* inserted and prefixes swapped out.
1410+
*
1411+
* @param string $sql
1412+
*
1413+
* @return mixed|string
1414+
*/
1415+
protected function compileFinalQuery(string $sql): string
1416+
{
1417+
$query = new Query($this->db);
1418+
$query->setQuery($sql, $this->binds);
1419+
1420+
if (! empty($this->db->swapPre) && ! empty($this->db->DBPrefix))
1421+
{
1422+
$query->swapPrefix($this->db->DBPrefix, $this->db->swapPre);
1423+
}
1424+
1425+
return $query->getQuery();
1426+
}
1427+
14071428
/**
14081429
* Get
14091430
*
@@ -1741,7 +1762,7 @@ public function getCompiledInsert($reset = true)
17411762
$this->resetWrite();
17421763
}
17431764

1744-
return $sql;
1765+
return $this->compileFinalQuery($sql);
17451766
}
17461767

17471768
//--------------------------------------------------------------------
@@ -1931,7 +1952,7 @@ public function getCompiledUpdate($reset = true)
19311952
$this->resetWrite();
19321953
}
19331954

1934-
return $sql;
1955+
return $this->compileFinalQuery($sql);
19351956
}
19361957

19371958
//--------------------------------------------------------------------
@@ -2312,7 +2333,7 @@ public function getCompiledDelete($reset = true)
23122333
$sql = $this->delete($table, '', null, $reset);
23132334
$this->returnDeleteSQL = false;
23142335

2315-
return $sql;
2336+
return $this->compileFinalQuery($sql);
23162337
}
23172338

23182339
//--------------------------------------------------------------------

tests/system/Database/Builder/GroupTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public function testOrHavingBy()
5656
->having('id >', 3)
5757
->orHaving('SUM(id) > 2');
5858

59-
$expectedSQL = 'SELECT "name" FROM "user" GROUP BY "name" HAVING "id" > :id: OR SUM(id) > 2';
59+
$expectedSQL = 'SELECT "name" FROM "user" GROUP BY "name" HAVING "id" > 3 OR SUM(id) > 2';
6060

6161
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
6262
}
@@ -73,7 +73,7 @@ public function testAndGroups()
7373
->groupEnd()
7474
->where('name', 'Darth');
7575

76-
$expectedSQL = 'SELECT * FROM "user" WHERE ( "id" > :id: AND "name" != :name: ) AND "name" = :name0:';
76+
$expectedSQL = 'SELECT * FROM "user" WHERE ( "id" > 3 AND "name" != \'Luke\' ) AND "name" = \'Darth\'';
7777

7878
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
7979
}
@@ -90,7 +90,7 @@ public function testOrGroups()
9090
->where('name !=', 'Luke')
9191
->groupEnd();
9292

93-
$expectedSQL = 'SELECT * FROM "user" WHERE "name" = :name: OR ( "id" > :id: AND "name" != :name0: )';
93+
$expectedSQL = 'SELECT * FROM "user" WHERE "name" = \'Darth\' OR ( "id" > 3 AND "name" != \'Luke\' )';
9494

9595
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
9696
}
@@ -107,7 +107,7 @@ public function testNotGroups()
107107
->where('name !=', 'Luke')
108108
->groupEnd();
109109

110-
$expectedSQL = 'SELECT * FROM "user" WHERE "name" = :name: AND NOT ( "id" > :id: AND "name" != :name0: )';
110+
$expectedSQL = 'SELECT * FROM "user" WHERE "name" = \'Darth\' AND NOT ( "id" > 3 AND "name" != \'Luke\' )';
111111

112112
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
113113
}
@@ -124,7 +124,7 @@ public function testOrNotGroups()
124124
->where('name !=', 'Luke')
125125
->groupEnd();
126126

127-
$expectedSQL = 'SELECT * FROM "user" WHERE "name" = :name: OR NOT ( "id" > :id: AND "name" != :name0: )';
127+
$expectedSQL = 'SELECT * FROM "user" WHERE "name" = \'Darth\' OR NOT ( "id" > 3 AND "name" != \'Luke\' )';
128128

129129
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
130130
}

tests/system/Database/Builder/InsertTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public function testSimpleInsert()
2828
];
2929
$builder->insert($insertData, true, true);
3030

31-
$expectedSQL = 'INSERT INTO "jobs" ("id", "name") VALUES (:id:, :name:)';
31+
$expectedSQL = 'INSERT INTO "jobs" ("id", "name") VALUES (1, \'Grocery Sales\')';
3232
$expectedBinds = $insertData;
3333

3434
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledInsert()));

tests/system/Database/Builder/LikeTest.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public function testSimpleLike()
2424

2525
$builder->like('name', 'veloper');
2626

27-
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE :name: ESCAPE '!'";
27+
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE '%veloper%' ESCAPE '!'";
2828
$expectedBinds = ['name' => '%veloper%'];
2929

3030
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
@@ -39,7 +39,7 @@ public function testLikeNoSide()
3939

4040
$builder->like('name', 'veloper', 'none');
4141

42-
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE :name: ESCAPE '!'";
42+
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE 'veloper' ESCAPE '!'";
4343
$expectedBinds = ['name' => 'veloper'];
4444

4545
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
@@ -54,7 +54,7 @@ public function testLikeBeforeOnly()
5454

5555
$builder->like('name', 'veloper', 'before');
5656

57-
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE :name: ESCAPE '!'";
57+
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE '%veloper' ESCAPE '!'";
5858
$expectedBinds = ['name' => '%veloper'];
5959

6060
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
@@ -69,7 +69,7 @@ public function testLikeAfterOnly()
6969

7070
$builder->like('name', 'veloper', 'after');
7171

72-
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE :name: ESCAPE '!'";
72+
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE 'veloper%' ESCAPE '!'";
7373
$expectedBinds = ['name' => 'veloper%'];
7474

7575
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
@@ -84,7 +84,7 @@ public function testOrLike()
8484

8585
$builder->like('name', 'veloper')->orLike('name', 'ian');
8686

87-
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE :name: ESCAPE '!' OR \"name\" LIKE :name0: ESCAPE '!'";
87+
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE '%veloper%' ESCAPE '!' OR \"name\" LIKE '%ian%' ESCAPE '!'";
8888
$expectedBinds = [
8989
'name' => '%veloper%',
9090
'name0' => '%ian%',
@@ -102,7 +102,7 @@ public function testNotLike()
102102

103103
$builder->notLike('name', 'veloper');
104104

105-
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" NOT LIKE :name: ESCAPE '!'";
105+
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" NOT LIKE '%veloper%' ESCAPE '!'";
106106
$expectedBinds = ['name' => '%veloper%'];
107107

108108
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
@@ -117,7 +117,7 @@ public function testOrNotLike()
117117

118118
$builder->like('name', 'veloper')->orNotLike('name', 'ian');
119119

120-
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE :name: ESCAPE '!' OR \"name\" NOT LIKE :name0: ESCAPE '!'";
120+
$expectedSQL = "SELECT * FROM \"job\" WHERE \"name\" LIKE '%veloper%' ESCAPE '!' OR \"name\" NOT LIKE '%ian%' ESCAPE '!'";
121121
$expectedBinds = [
122122
'name' => '%veloper%',
123123
'name0' => '%ian%',
@@ -138,7 +138,7 @@ public function testCaseInsensitiveLike()
138138

139139
$builder->like('name', 'VELOPER', 'both', null, true);
140140

141-
$expectedSQL = "SELECT * FROM \"job\" WHERE LOWER(name) LIKE :name: ESCAPE '!'";
141+
$expectedSQL = "SELECT * FROM \"job\" WHERE LOWER(name) LIKE '%veloper%' ESCAPE '!'";
142142
$expectedBinds = ['name' => '%veloper%'];
143143

144144
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));

tests/system/Database/Builder/UpdateTest.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function testUpdate()
2525

2626
$builder->where('id', 1)->update(['name' => 'Programmer'], null, null, true);
2727

28-
$expectedSQL = 'UPDATE "jobs" SET "name" = :name: WHERE "id" = :id:';
28+
$expectedSQL = 'UPDATE "jobs" SET "name" = \'Programmer\' WHERE "id" = 1';
2929
$expectedBinds = [
3030
'id' => 1,
3131
'name' => 'Programmer',
@@ -43,7 +43,7 @@ public function testUpdateInternalWhereAndLimit()
4343

4444
$builder->update(['name' => 'Programmer'], ['id' => 1], 5, true);
4545

46-
$expectedSQL = 'UPDATE "jobs" SET "name" = :name: WHERE "id" = :id: LIMIT 5';
46+
$expectedSQL = 'UPDATE "jobs" SET "name" = \'Programmer\' WHERE "id" = 1 LIMIT 5';
4747
$expectedBinds = [
4848
'id' => 1,
4949
'name' => 'Programmer',
@@ -61,7 +61,7 @@ public function testUpdateWithSet()
6161

6262
$builder->set('name', 'Programmer')->where('id', 1)->update(null, null, null, true);
6363

64-
$expectedSQL = 'UPDATE "jobs" SET "name" = :name: WHERE "id" = :id:';
64+
$expectedSQL = 'UPDATE "jobs" SET "name" = \'Programmer\' WHERE "id" = 1';
6565
$expectedBinds = [
6666
'id' => 1,
6767
'name' => 'Programmer',
@@ -177,7 +177,7 @@ public function testUpdateWithWhereSameColumn()
177177

178178
$builder->update(['name' => 'foobar'], ['name' => 'Programmer'], null, true);
179179

180-
$expectedSQL = 'UPDATE "jobs" SET "name" = :name: WHERE "name" = :name0:';
180+
$expectedSQL = 'UPDATE "jobs" SET "name" = \'foobar\' WHERE "name" = \'Programmer\'';
181181
$expectedBinds = [
182182
'name' => 'foobar',
183183
'name0' => 'Programmer',
@@ -198,7 +198,7 @@ public function testUpdateWithWhereSameColumn2()
198198
->where('name', 'Programmer')
199199
->update(null, null, null, true);
200200

201-
$expectedSQL = 'UPDATE "jobs" SET "name" = :name: WHERE "name" = :name0:';
201+
$expectedSQL = 'UPDATE "jobs" SET "name" = \'foobar\' WHERE "name" = \'Programmer\'';
202202
$expectedBinds = [
203203
'name' => 'foobar',
204204
'name0' => 'Programmer',
@@ -218,7 +218,7 @@ public function testUpdateWithWhereSameColumn3()
218218
$builder->where('name', 'Programmer')
219219
->update(['name' => 'foobar'], null, null, true);
220220

221-
$expectedSQL = 'UPDATE "jobs" SET "name" = :name0: WHERE "name" = :name:';
221+
$expectedSQL = 'UPDATE "jobs" SET "name" = \'foobar\' WHERE "name" = \'Programmer\'';
222222
$expectedBinds = [
223223
'name' => 'Programmer',
224224
'name0' => 'foobar',
@@ -239,7 +239,7 @@ public function testSetWithoutEscape()
239239
->where('id', 2)
240240
->update(null, null, null, true);
241241

242-
$expectedSQL = 'UPDATE "mytable" SET field = field+1 WHERE "id" = :id:';
242+
$expectedSQL = 'UPDATE "mytable" SET field = field+1 WHERE "id" = 2';
243243
$expectedBinds = ['id' => 2];
244244

245245
$this->assertEquals($expectedSQL, str_replace("\n", ' ', $builder->getCompiledUpdate()));

tests/system/Database/Builder/WhereTest.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function testSimpleWhere()
2121
{
2222
$builder = $this->db->table('users');
2323

24-
$expectedSQL = 'SELECT * FROM "users" WHERE "id" = :id:';
24+
$expectedSQL = 'SELECT * FROM "users" WHERE "id" = 3';
2525
$expectedBinds = ['id' => 3];
2626

2727
$builder->where('id', 3);
@@ -35,7 +35,7 @@ public function testWhereNoEscape()
3535
{
3636
$builder = $this->db->table('users');
3737

38-
$expectedSQL = 'SELECT * FROM "users" WHERE id = :id:';
38+
$expectedSQL = 'SELECT * FROM "users" WHERE id = 3';
3939
$expectedBinds = ['id' => 3];
4040

4141
$builder->where('id', 3, false);
@@ -49,7 +49,7 @@ public function testWhereCustomKeyOperator()
4949
{
5050
$builder = $this->db->table('users');
5151

52-
$expectedSQL = 'SELECT * FROM "users" WHERE "id" != :id:';
52+
$expectedSQL = 'SELECT * FROM "users" WHERE "id" != 3';
5353
$expectedBinds = ['id' => 3];
5454

5555
$builder->where('id !=', 3);
@@ -68,7 +68,7 @@ public function testWhereAssociateArray()
6868
'name !=' => 'Accountant',
6969
];
7070

71-
$expectedSQL = 'SELECT * FROM "jobs" WHERE "id" = :id: AND "name" != :name:';
71+
$expectedSQL = 'SELECT * FROM "jobs" WHERE "id" = 2 AND "name" != \'Accountant\'';
7272
$expectedBinds = [
7373
'id' => 2,
7474
'name' => 'Accountant',
@@ -104,7 +104,7 @@ public function testOrWhere()
104104
$builder->where('name !=', 'Accountant')
105105
->orWhere('id >', 3);
106106

107-
$expectedSQL = 'SELECT * FROM "jobs" WHERE "name" != :name: OR "id" > :id:';
107+
$expectedSQL = 'SELECT * FROM "jobs" WHERE "name" != \'Accountant\' OR "id" > 3';
108108
$expectedBinds = [
109109
'name' => 'Accountant',
110110
'id' => 3,
@@ -123,7 +123,7 @@ public function testOrWhereSameColumn()
123123
$builder->where('name', 'Accountant')
124124
->orWhere('name', 'foobar');
125125

126-
$expectedSQL = 'SELECT * FROM "jobs" WHERE "name" = :name: OR "name" = :name0:';
126+
$expectedSQL = 'SELECT * FROM "jobs" WHERE "name" = \'Accountant\' OR "name" = \'foobar\'';
127127
$expectedBinds = [
128128
'name' => 'Accountant',
129129
'name0' => 'foobar',
@@ -141,7 +141,7 @@ public function testWhereIn()
141141

142142
$builder->whereIn('name', ['Politician', 'Accountant']);
143143

144-
$expectedSQL = 'SELECT * FROM "jobs" WHERE "name" IN :name:';
144+
$expectedSQL = 'SELECT * FROM "jobs" WHERE "name" IN (\'Politician\',\'Accountant\')';
145145
$expectedBinds = [
146146
'name' => [
147147
'Politician',
@@ -161,7 +161,7 @@ public function testWhereNotIn()
161161

162162
$builder->whereNotIn('name', ['Politician', 'Accountant']);
163163

164-
$expectedSQL = 'SELECT * FROM "jobs" WHERE "name" NOT IN :name:';
164+
$expectedSQL = 'SELECT * FROM "jobs" WHERE "name" NOT IN (\'Politician\',\'Accountant\')';
165165
$expectedBinds = [
166166
'name' => [
167167
'Politician',
@@ -181,7 +181,7 @@ public function testOrWhereIn()
181181

182182
$builder->where('id', 2)->orWhereIn('name', ['Politician', 'Accountant']);
183183

184-
$expectedSQL = 'SELECT * FROM "jobs" WHERE "id" = :id: OR "name" IN :name:';
184+
$expectedSQL = 'SELECT * FROM "jobs" WHERE "id" = 2 OR "name" IN (\'Politician\',\'Accountant\')';
185185
$expectedBinds = [
186186
'id' => 2,
187187
'name' => [
@@ -202,7 +202,7 @@ public function testOrWhereNotIn()
202202

203203
$builder->where('id', 2)->orWhereNotIn('name', ['Politician', 'Accountant']);
204204

205-
$expectedSQL = 'SELECT * FROM "jobs" WHERE "id" = :id: OR "name" NOT IN :name:';
205+
$expectedSQL = 'SELECT * FROM "jobs" WHERE "id" = 2 OR "name" NOT IN (\'Politician\',\'Accountant\')';
206206
$expectedBinds = [
207207
'id' => 2,
208208
'name' => [

0 commit comments

Comments
 (0)