From 166fa166681ed8c924777ebb84a5879b887dff2b Mon Sep 17 00:00:00 2001 From: Nicolai Ehrhardt <245527909+predictor2718@users.noreply.github.com> Date: Mon, 13 Apr 2026 16:30:23 +0200 Subject: [PATCH 1/3] Simplify ON keyword check to only needed case Signed-off-by: Nicolai Ehrhardt <245527909+predictor2718@users.noreply.github.com> --- src/Components/SetOperation.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Components/SetOperation.php b/src/Components/SetOperation.php index 2faf0c611..5a391e9c6 100644 --- a/src/Components/SetOperation.php +++ b/src/Components/SetOperation.php @@ -113,12 +113,21 @@ public static function parse(Parser $parser, TokensList $list, array $options = $commaLastSeenAt = $token; } } elseif ($state === 1) { + // Reserved keywords like ON are valid values in SET statements + // (e.g. SET @@sql_log_bin = ON). Try parsing as expression first, + // and if that fails, accept reserved keywords as literal values. $tmp = Expression::parse( $parser, $list, ['breakOnAlias' => true] ); - if ($tmp === null) { + if ( + $tmp === null + && $token->type === Token::TYPE_KEYWORD + && $token->value === 'ON' + ) { + $tmp = new Expression($token->token); + } elseif ($tmp === null) { $parser->error('Missing expression.', $token); break; } From 0bd40a6b3fd1cc0bc12b3ea0a970873c8dcfc711 Mon Sep 17 00:00:00 2001 From: Nicolai Ehrhardt <245527909+predictor2718@users.noreply.github.com> Date: Mon, 13 Apr 2026 16:49:05 +0200 Subject: [PATCH 2/3] Fix phpcs: place if condition on single line Signed-off-by: Nicolai Ehrhardt <245527909+predictor2718@users.noreply.github.com> --- src/Components/SetOperation.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Components/SetOperation.php b/src/Components/SetOperation.php index 5a391e9c6..d2726180a 100644 --- a/src/Components/SetOperation.php +++ b/src/Components/SetOperation.php @@ -121,11 +121,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = $list, ['breakOnAlias' => true] ); - if ( - $tmp === null - && $token->type === Token::TYPE_KEYWORD - && $token->value === 'ON' - ) { + if ($tmp === null && $token->type === Token::TYPE_KEYWORD && $token->value === 'ON') { $tmp = new Expression($token->token); } elseif ($tmp === null) { $parser->error('Missing expression.', $token); From a204ecd86c39a3f7ec0d6974397b39b278aa7334 Mon Sep 17 00:00:00 2001 From: Nicolai Ehrhardt <245527909+predictor2718@users.noreply.github.com> Date: Tue, 13 Oct 2026 20:29:57 +0200 Subject: [PATCH 3/3] Add test for SET variable = ON (#627) --- tests/Parser/SetStatementTest.php | 1 + tests/data/parser/parseSetVariableOn.in | 1 + tests/data/parser/parseSetVariableOn.out | 192 +++++++++++++++++++++++ 3 files changed, 194 insertions(+) create mode 100644 tests/data/parser/parseSetVariableOn.in create mode 100644 tests/data/parser/parseSetVariableOn.out diff --git a/tests/Parser/SetStatementTest.php b/tests/Parser/SetStatementTest.php index 7c5e3ed17..f36565a6d 100644 --- a/tests/Parser/SetStatementTest.php +++ b/tests/Parser/SetStatementTest.php @@ -34,6 +34,7 @@ public static function setProvider(): array ['parser/parseSetVariable'], ['parser/parseSetVariable2'], ['parser/parseSetGlobalVariable'], + ['parser/parseSetVariableOn'], ]; } } diff --git a/tests/data/parser/parseSetVariableOn.in b/tests/data/parser/parseSetVariableOn.in new file mode 100644 index 000000000..d38b504c7 --- /dev/null +++ b/tests/data/parser/parseSetVariableOn.in @@ -0,0 +1 @@ +SET @@sql_log_bin = ON, autocommit = OFF \ No newline at end of file diff --git a/tests/data/parser/parseSetVariableOn.out b/tests/data/parser/parseSetVariableOn.out new file mode 100644 index 000000000..5d63e765a --- /dev/null +++ b/tests/data/parser/parseSetVariableOn.out @@ -0,0 +1,192 @@ +{ + "query": "SET @@sql_log_bin = ON, autocommit = OFF", + "lexer": { + "@type": "PhpMyAdmin\\SqlParser\\Lexer", + "str": "SET @@sql_log_bin = ON, autocommit = OFF", + "len": 40, + "last": 40, + "list": { + "@type": "PhpMyAdmin\\SqlParser\\TokensList", + "tokens": [ + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "SET", + "value": "SET", + "keyword": "SET", + "type": 1, + "flags": 11, + "position": 0 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": " ", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 3 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "@@sql_log_bin", + "value": "sql_log_bin", + "keyword": null, + "type": 8, + "flags": 9, + "position": 4 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": " ", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 17 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "=", + "value": "=", + "keyword": null, + "type": 2, + "flags": 2, + "position": 18 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": " ", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 19 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "ON", + "value": "ON", + "keyword": "ON", + "type": 1, + "flags": 3, + "position": 20 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": ",", + "value": ",", + "keyword": null, + "type": 2, + "flags": 16, + "position": 22 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": " ", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 23 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "autocommit", + "value": "autocommit", + "keyword": null, + "type": 0, + "flags": 0, + "position": 24 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": " ", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 34 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "=", + "value": "=", + "keyword": null, + "type": 2, + "flags": 2, + "position": 35 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": " ", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 36 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "OFF", + "value": "OFF", + "keyword": null, + "type": 0, + "flags": 0, + "position": 37 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": null, + "value": null, + "keyword": null, + "type": 9, + "flags": 0, + "position": null + } + ], + "count": 15, + "idx": 15 + }, + "delimiter": ";", + "delimiterLen": 1, + "strict": false, + "errors": [] + }, + "parser": { + "@type": "PhpMyAdmin\\SqlParser\\Parser", + "list": { + "@type": "@1" + }, + "statements": [ + { + "@type": "PhpMyAdmin\\SqlParser\\Statements\\SetStatement", + "options": { + "@type": "PhpMyAdmin\\SqlParser\\Components\\OptionsArray", + "options": [] + }, + "end_options": null, + "set": [ + { + "@type": "PhpMyAdmin\\SqlParser\\Components\\SetOperation", + "column": "@@sql_log_bin", + "value": "ON" + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Components\\SetOperation", + "column": "autocommit", + "value": "OFF" + } + ], + "first": 0, + "last": 13 + } + ], + "brackets": 0, + "strict": false, + "errors": [] + }, + "errors": { + "lexer": [], + "parser": [] + } +} \ No newline at end of file