Skip to content

Commit 4a135fa

Browse files
niconoe-williamdes
andcommitted
Fix #226 - Ignore end of comment string at the end of queries with MySQL-specific commands
Co-Authored-By: William Desportes <williamdes@wdes.fr>
1 parent 3569ec1 commit 4a135fa

File tree

4 files changed

+74
-14
lines changed

4 files changed

+74
-14
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
}

tests/Parser/ParserLongExportsTest.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,16 @@ public function testMysqldump(): void
3333
SQL;
3434

3535
$expectedSql = [
36-
'SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT */',
37-
'SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS */',
38-
'SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION */',
36+
'SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT',
37+
'SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS',
38+
'SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION',
3939
'SET NAMES utf8',
40-
'SET @OLD_TIME_ZONE = @@TIME_ZONE */',
40+
'SET @OLD_TIME_ZONE = @@TIME_ZONE',
4141
"SET TIME_ZONE = '+00:00'",
42-
'SET @OLD_UNIQUE_CHECKS = @@UNIQUE_CHECKS, UNIQUE_CHECKS = 0 */',
43-
'SET @OLD_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0 */',
42+
'SET @OLD_UNIQUE_CHECKS = @@UNIQUE_CHECKS, UNIQUE_CHECKS = 0',
43+
'SET @OLD_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0',
4444
"SET @OLD_SQL_MODE = @@SQL_MODE, SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO'",
45-
'SET @OLD_SQL_NOTES = @@SQL_NOTES, SQL_NOTES = 0 */',
45+
'SET @OLD_SQL_NOTES = @@SQL_NOTES, SQL_NOTES = 0',
4646
];
4747

4848
$parser = new Parser($sql, true);
@@ -85,9 +85,9 @@ public function testParsephpMyAdminDump(): void
8585
'SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"',
8686
'SET AUTOCOMMIT = 0',
8787
'SET time_zone = "+00:00"',
88-
'SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT */',
89-
'SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS */',
90-
'SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION */',
88+
'SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT',
89+
'SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS',
90+
'SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION',
9191
'SET NAMES utf8mb4',
9292
], $collectedSetStatements);
9393

tests/data/parser/parsephpMyAdminExport1.out

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4641,7 +4641,7 @@
46414641
{
46424642
"@type": "PhpMyAdmin\\SqlParser\\Components\\SetOperation",
46434643
"column": "@OLD_CHARACTER_SET_CLIENT",
4644-
"value": "@@CHARACTER_SET_CLIENT *\/"
4644+
"value": "@@CHARACTER_SET_CLIENT"
46454645
}
46464646
],
46474647
"first": 44,
@@ -4658,7 +4658,7 @@
46584658
{
46594659
"@type": "PhpMyAdmin\\SqlParser\\Components\\SetOperation",
46604660
"column": "@OLD_CHARACTER_SET_RESULTS",
4661-
"value": "@@CHARACTER_SET_RESULTS *\/"
4661+
"value": "@@CHARACTER_SET_RESULTS"
46624662
}
46634663
],
46644664
"first": 55,
@@ -4675,7 +4675,7 @@
46754675
{
46764676
"@type": "PhpMyAdmin\\SqlParser\\Components\\SetOperation",
46774677
"column": "@OLD_COLLATION_CONNECTION",
4678-
"value": "@@COLLATION_CONNECTION *\/"
4678+
"value": "@@COLLATION_CONNECTION"
46794679
}
46804680
],
46814681
"first": 66,

0 commit comments

Comments
 (0)