Skip to content

Commit 284e665

Browse files
committed
Fix #226: ignore end of comment string at the end of queries with MySQL-specific commands.
1 parent 9412413 commit 284e665

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

src/Components/Expression.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,8 @@ public static function parse(Parser $parser, TokensList $list, array $options =
222222

223223
// Skipping whitespaces and comments.
224224
if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) {
225-
if ($isExpr) {
225+
// If the token is a closing C comment from a MySQL command, it must be ignored.
226+
if ($isExpr && $token->token !== '*/') {
226227
$ret->expr .= $token->token;
227228
}
228229

tests/Components/ExpressionTest.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,63 @@ public function testBuild(): void
9292
'1 + 2 AS `three`, 1 + 3 AS `four`'
9393
);
9494
}
95+
96+
/**
97+
* @return string[][]
98+
*/
99+
public static function mysqlCommandsProvider(): array
100+
{
101+
return [
102+
[
103+
'/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;',
104+
'SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT',
105+
],
106+
[
107+
'/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;',
108+
'SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS',
109+
],
110+
[
111+
'/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;',
112+
'SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION',
113+
],
114+
[
115+
'/*!40101 SET NAMES utf8 */;',
116+
'SET NAMES utf8',
117+
],
118+
[
119+
'/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;',
120+
'SET @OLD_TIME_ZONE = @@TIME_ZONE',
121+
],
122+
[
123+
"/*!40103 SET TIME_ZONE='+00:00' */;",
124+
"SET TIME_ZONE = '+00:00'",
125+
],
126+
[
127+
'/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;',
128+
'SET @OLD_UNIQUE_CHECKS = @@UNIQUE_CHECKS, UNIQUE_CHECKS = 0',
129+
],
130+
[
131+
'/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;',
132+
'SET @OLD_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0',
133+
],
134+
[
135+
"/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;",
136+
"SET @OLD_SQL_MODE = @@SQL_MODE, SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO'",
137+
],
138+
[
139+
'/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;',
140+
'SET @OLD_SQL_NOTES = @@SQL_NOTES, SQL_NOTES = 0',
141+
],
142+
];
143+
}
144+
145+
/**
146+
* @dataProvider mysqlCommandsProvider
147+
*/
148+
public function testMysqlCommands(string $expr, string $expected): void
149+
{
150+
$parser = new Parser($expr, true);
151+
$parser->parse();
152+
self::assertSame($expected, $parser->statements[0]->build());
153+
}
95154
}

0 commit comments

Comments
 (0)