diff --git a/src/Components/SetOperation.php b/src/Components/SetOperation.php index 78abbd2c2..2faf0c611 100644 --- a/src/Components/SetOperation.php +++ b/src/Components/SetOperation.php @@ -10,6 +10,7 @@ use PhpMyAdmin\SqlParser\TokensList; use function implode; +use function in_array; use function is_array; use function trim; @@ -63,7 +64,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = * Below are the states of the parser. * * 0 ---------------------[ col_name ]--------------------> 0 - * 0 ------------------------[ = ]------------------------> 1 + * 0 ---------------------[ = or := ]---------------------> 1 * 1 -----------------------[ value ]---------------------> 1 * 1 ------------------------[ , ]------------------------> 0 * @@ -104,7 +105,7 @@ public static function parse(Parser $parser, TokensList $list, array $options = } if ($state === 0) { - if ($token->token === '=') { + if (in_array($token->token, ['=', ':='], true)) { $state = 1; } elseif ($token->value !== ',') { $expr->column .= $token->token; diff --git a/tests/Parser/SetStatementTest.php b/tests/Parser/SetStatementTest.php index 4fe72c523..e0ce2a427 100644 --- a/tests/Parser/SetStatementTest.php +++ b/tests/Parser/SetStatementTest.php @@ -32,6 +32,7 @@ public function setProvider(): array ['parser/parseSetError1'], ['parser/parseInsertIntoSet'], ['parser/parseSetVariable'], + ['parser/parseSetVariable2'], ['parser/parseSetGlobalVariable'], ]; } diff --git a/tests/data/parser/parseSetVariable2.in b/tests/data/parser/parseSetVariable2.in new file mode 100644 index 000000000..a1e851a2d --- /dev/null +++ b/tests/data/parser/parseSetVariable2.in @@ -0,0 +1 @@ +SET @foo := 1 diff --git a/tests/data/parser/parseSetVariable2.out b/tests/data/parser/parseSetVariable2.out new file mode 100644 index 000000000..73d10f04f --- /dev/null +++ b/tests/data/parser/parseSetVariable2.out @@ -0,0 +1,133 @@ +{ + "query": "SET @foo := 1\n", + "lexer": { + "@type": "PhpMyAdmin\\SqlParser\\Lexer", + "str": "SET @foo := 1\n", + "len": 14, + "last": 14, + "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": "@foo", + "value": "foo", + "keyword": null, + "type": 8, + "flags": 1, + "position": 4 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": " ", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 8 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": ":=", + "value": ":=", + "keyword": null, + "type": 2, + "flags": 8, + "position": 9 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": " ", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 11 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "1", + "value": 1, + "keyword": null, + "type": 6, + "flags": 0, + "position": 12 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "\n", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 13 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": null, + "value": null, + "keyword": null, + "type": 9, + "flags": 0, + "position": null + } + ], + "count": 9, + "idx": 9 + }, + "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": "@foo", + "value": "1" + } + ], + "first": 0, + "last": 7 + } + ], + "brackets": 0, + "strict": false, + "errors": [] + }, + "errors": { + "lexer": [], + "parser": [] + } +} \ No newline at end of file