Skip to content

Commit 7e5bf2a

Browse files
committed
Add dollar-quoting support to MySQL multi-query parser
1 parent c14813e commit 7e5bf2a

2 files changed

Lines changed: 21 additions & 0 deletions

File tree

src/MySqlMultiQueryParser.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ private function getQueryPattern(string $delimiter): string
5252
| \" (*PRUNE) (?: \\\\. | [^\"] )*+ \"
5353
| \` (*PRUNE) (?: [^\`]++ | \`\` )*+ \`
5454
| /\\* (*PRUNE) (?: [^*]++ | \\*(?!/) )*+ \\*/
55+
| (\\$(?:[a-zA-Z_\\x80-\\xFF][\\w\\x80-\\xFF]*+)?\\$) (*PRUNE) (?: [^$]++ | (?!\\g{-1})\\$ )*+ \\g{-1}
5556
| --[^\\n]*+(?:\\n|\\z)
5657
| \\#[^\\n]*+(?:\\n|\\z)
5758
| (?!$delimiterPattern) .

tests/cases/MySqlMultiQueryParserTest.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,21 @@ class MySqlMultiQueryParserTest extends MultiQueryParserTestCase
242242

243243
// Escaped backticks (doubled) inside backtick identifiers
244244
["SELECT `col``name` FROM t;", ["SELECT `col``name` FROM t"]],
245+
246+
// Dollar-quoted strings in JavaScript stored programs
247+
[
248+
'CREATE FUNCTION gcd(a INT, b INT) RETURNS INT NO SQL LANGUAGE JAVASCRIPT AS $mle$ let x = a; let y = b; $mle$;',
249+
['CREATE FUNCTION gcd(a INT, b INT) RETURNS INT NO SQL LANGUAGE JAVASCRIPT AS $mle$ let x = a; let y = b; $mle$'],
250+
],
251+
[
252+
'CREATE FUNCTION js_add(a INT, b INT) RETURNS INT LANGUAGE JAVASCRIPT AS $$ return a + b; $$;',
253+
['CREATE FUNCTION js_add(a INT, b INT) RETURNS INT LANGUAGE JAVASCRIPT AS $$ return a + b; $$'],
254+
],
255+
// Nested dollar-quoted strings with different tags
256+
[
257+
'CREATE FUNCTION nested() RETURNS INT LANGUAGE JAVASCRIPT AS $mle$ let s = $inner$;$inner$; return 1; $mle$;',
258+
['CREATE FUNCTION nested() RETURNS INT LANGUAGE JAVASCRIPT AS $mle$ let s = $inner$;$inner$; return 1; $mle$'],
259+
],
245260
];
246261
}
247262

@@ -297,6 +312,11 @@ class MySqlMultiQueryParserTest extends MultiQueryParserTestCase
297312
["SELECT `col;na", "me` FROM t;"],
298313
["SELECT `col;name` FROM t"],
299314
],
315+
// Dollar-quoted string spanning chunks
316+
[
317+
['CREATE FUNCTION f() RETURNS INT LANGUAGE JAVASCRIPT AS $mle$ let x = 1;', ' return x; $mle$;'],
318+
['CREATE FUNCTION f() RETURNS INT LANGUAGE JAVASCRIPT AS $mle$ let x = 1; return x; $mle$'],
319+
],
300320
];
301321
}
302322
}

0 commit comments

Comments
 (0)