Skip to content

Commit 240e2c3

Browse files
staabmclxmstaab
andauthored
Prevent syntax error on query with trailling semicolon (#142)
Co-authored-by: Markus Staab <[email protected]>
1 parent cac63a6 commit 240e2c3

File tree

3 files changed

+12
-58
lines changed

3 files changed

+12
-58
lines changed

.phpunit-phpstan-dba.cache

Lines changed: 4 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,64 +2,6 @@
22
'schemaVersion' => 'v3-rename-props',
33
'records' =>
44
array (
5-
'
6-
SELECT email adaid
7-
WHERE gesperrt = \'1\' AND email LIKE \'%@example.com\'
8-
FROM ada
9-
LIMIT 1
10-
' =>
11-
array (
12-
'error' =>
13-
staabm\PHPStanDba\Error::__set_state(array(
14-
'message' => 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL/MariaDB server version for the right syntax to use near \'FROM ada LIMIT 0\' at line 3',
15-
'code' => 1064,
16-
)),
17-
),
18-
'
19-
SELECT email, adaid
20-
FROM ada
21-
WHERE gesperrt = \'1\'
22-
LIMIT \'1\'
23-
' =>
24-
array (
25-
'error' => NULL,
26-
),
27-
'
28-
SELECT email, adaid
29-
FROM ada
30-
WHERE gesperrt = \'1\'
31-
LIMIT \'1\', \'1\'
32-
' =>
33-
array (
34-
'error' => NULL,
35-
),
36-
'
37-
SELECT email, adaid
38-
FROM ada
39-
WHERE gesperrt = \'1\'
40-
LIMIT \'1\', \'1\'
41-
' =>
42-
array (
43-
'error' => NULL,
44-
),
45-
'
46-
SELECT email, adaid
47-
FROM ada
48-
WHERE gesperrt = \'1\' AND email LIKE \'%@example%\'
49-
LIMIT 1
50-
' =>
51-
array (
52-
'error' => NULL,
53-
),
54-
'
55-
SELECT email, adaid
56-
FROM ada
57-
WHERE gesperrt = \'1\' AND email LIKE NULL
58-
LIMIT 1
59-
' =>
60-
array (
61-
'error' => NULL,
62-
),
635
'
646
SELECT email adaid
657
WHERE gesperrt = \'1\' AND email LIKE \'%@example.com\'
@@ -3038,5 +2980,9 @@ Simulated query: SELECT email, adaid, gesperrt, freigabe1u1 FROM ada . WHERE ema
30382980
'code' => 1064,
30392981
)),
30402982
),
2983+
'SELECT email, adaid, gesperrt, freigabe1u1 FROM ada;' =>
2984+
array (
2985+
'error' => NULL,
2986+
),
30412987
),
30422988
);

src/QueryReflection/QuerySimulation.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ public static function simulate(string $queryString): ?string
8686

8787
private static function stripTraillingLimit(string $queryString): ?string
8888
{
89+
$queryString = rtrim($queryString, ';');
90+
8991
// XXX someday we will use a proper SQL parser,
9092
// which would also allow us to support even more complex expressions like SELECT .. LIMIT X, Y FOR UPDATE
9193
return preg_replace('/\s*LIMIT\s+["\']?\d+["\']?\s*(,\s*["\']?\d*["\']?)?\s*$/i', '', $queryString);

tests/data/syntax-error-in-prepared-statement.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,10 @@ public function samePlaceholderMultipleTimes(Connection $connection)
143143
WHERE (gesperrt=:gesperrt AND freigabe1u1=1) OR (gesperrt=:gesperrt AND freigabe1u1=0)';
144144
$connection->preparedQuery($query, [':gesperrt' => 1]);
145145
}
146+
147+
public function noErrorOnTraillingSemicolon(Connection $connection)
148+
{
149+
$query = 'SELECT email, adaid, gesperrt, freigabe1u1 FROM ada;';
150+
$connection->preparedQuery($query, []);
151+
}
146152
}

0 commit comments

Comments
 (0)