diff --git a/src/Components/SetOperation.php b/src/Components/SetOperation.php index 2faf0c61..d2726180 100644 --- a/src/Components/SetOperation.php +++ b/src/Components/SetOperation.php @@ -113,12 +113,17 @@ 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; } diff --git a/tests/Parser/SetStatementTest.php b/tests/Parser/SetStatementTest.php index 7c5e3ed1..f36565a6 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 00000000..d38b504c --- /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 00000000..5d63e765 --- /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