From 80b39d9e31caee4e65aa4d8cdff0f129b7f93f77 Mon Sep 17 00:00:00 2001 From: Fawzi Abdulfattah Date: Thu, 19 Jan 2023 21:38:14 +0200 Subject: [PATCH] Adding guard checks before checking keyword Signed-off-by: Fawzi Abdulfattah --- src/Parser.php | 2 +- tests/data/parser/parseAnalyzeError1.in | 1 + tests/data/parser/parseAnalyzeError1.out | 421 +++++++++++++++++++++++ tests/data/parser/parseAnalyzeError2.in | 1 + tests/data/parser/parseAnalyzeError2.out | 403 ++++++++++++++++++++++ 5 files changed, 827 insertions(+), 1 deletion(-) create mode 100644 tests/data/parser/parseAnalyzeError1.in create mode 100644 tests/data/parser/parseAnalyzeError1.out create mode 100644 tests/data/parser/parseAnalyzeError2.in create mode 100644 tests/data/parser/parseAnalyzeError2.out diff --git a/src/Parser.php b/src/Parser.php index 775e49586..29470c4d3 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -480,7 +480,7 @@ public function parse() // 2 - Explain statement, in case of MariaDB https://mariadb.com/kb/en/explain-analyze/ // We need to point case 2 to use the EXPLAIN Parser. $statementName = 'EXPLAIN'; - if ($first->keyword === 'TABLE' || $second->keyword === 'TABLE') { + if (($first && $first->keyword === 'TABLE') || ($second && $second->keyword === 'TABLE')) { $statementName = 'ANALYZE'; } diff --git a/tests/data/parser/parseAnalyzeError1.in b/tests/data/parser/parseAnalyzeError1.in new file mode 100644 index 000000000..f9f848bb1 --- /dev/null +++ b/tests/data/parser/parseAnalyzeError1.in @@ -0,0 +1 @@ +ANALYZE NO_WRITE_TO_BINLOG \ No newline at end of file diff --git a/tests/data/parser/parseAnalyzeError1.out b/tests/data/parser/parseAnalyzeError1.out new file mode 100644 index 000000000..c624fadb0 --- /dev/null +++ b/tests/data/parser/parseAnalyzeError1.out @@ -0,0 +1,421 @@ +{ + "query": "ANALYZE NO_WRITE_TO_BINLOG", + "lexer": { + "@type": "PhpMyAdmin\\SqlParser\\Lexer", + "PARSER_METHODS": [ + "parseDelimiter", + "parseWhitespace", + "parseNumber", + "parseComment", + "parseOperator", + "parseBool", + "parseString", + "parseSymbol", + "parseKeyword", + "parseLabel", + "parseUnknown" + ], + "KEYWORD_NAME_INDICATORS": [ + "FROM", + "SET", + "WHERE" + ], + "OPERATOR_NAME_INDICATORS": [ + ",", + "." + ], + "str": "ANALYZE NO_WRITE_TO_BINLOG", + "len": 26, + "last": 26, + "list": { + "@type": "PhpMyAdmin\\SqlParser\\TokensList", + "tokens": [ + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "ANALYZE", + "value": "ANALYZE", + "keyword": "ANALYZE", + "type": 1, + "flags": 3, + "position": 0 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": " ", + "value": " ", + "keyword": null, + "type": 3, + "flags": 0, + "position": 7 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "NO_WRITE_TO_BINLOG", + "value": "NO_WRITE_TO_BINLOG", + "keyword": "NO_WRITE_TO_BINLOG", + "type": 1, + "flags": 3, + "position": 8 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": null, + "value": null, + "keyword": null, + "type": 9, + "flags": 0, + "position": null + } + ], + "count": 4, + "idx": 4 + }, + "DEFAULT_DELIMITER": ";", + "delimiter": ";", + "delimiterLen": 1, + "strict": false, + "errors": [] + }, + "parser": { + "@type": "PhpMyAdmin\\SqlParser\\Parser", + "STATEMENT_PARSERS": { + "DESCRIBE": "PhpMyAdmin\\SqlParser\\Statements\\ExplainStatement", + "DESC": "PhpMyAdmin\\SqlParser\\Statements\\ExplainStatement", + "EXPLAIN": "PhpMyAdmin\\SqlParser\\Statements\\ExplainStatement", + "FLUSH": "", + "GRANT": "", + "HELP": "", + "SET PASSWORD": "", + "STATUS": "", + "USE": "", + "ANALYZE": "PhpMyAdmin\\SqlParser\\Statements\\AnalyzeStatement", + "BACKUP": "PhpMyAdmin\\SqlParser\\Statements\\BackupStatement", + "CHECK": "PhpMyAdmin\\SqlParser\\Statements\\CheckStatement", + "CHECKSUM": "PhpMyAdmin\\SqlParser\\Statements\\ChecksumStatement", + "OPTIMIZE": "PhpMyAdmin\\SqlParser\\Statements\\OptimizeStatement", + "REPAIR": "PhpMyAdmin\\SqlParser\\Statements\\RepairStatement", + "RESTORE": "PhpMyAdmin\\SqlParser\\Statements\\RestoreStatement", + "SET": "PhpMyAdmin\\SqlParser\\Statements\\SetStatement", + "SHOW": "PhpMyAdmin\\SqlParser\\Statements\\ShowStatement", + "ALTER": "PhpMyAdmin\\SqlParser\\Statements\\AlterStatement", + "CREATE": "PhpMyAdmin\\SqlParser\\Statements\\CreateStatement", + "DROP": "PhpMyAdmin\\SqlParser\\Statements\\DropStatement", + "RENAME": "PhpMyAdmin\\SqlParser\\Statements\\RenameStatement", + "TRUNCATE": "PhpMyAdmin\\SqlParser\\Statements\\TruncateStatement", + "CALL": "PhpMyAdmin\\SqlParser\\Statements\\CallStatement", + "DELETE": "PhpMyAdmin\\SqlParser\\Statements\\DeleteStatement", + "DO": "", + "HANDLER": "", + "INSERT": "PhpMyAdmin\\SqlParser\\Statements\\InsertStatement", + "LOAD DATA": "PhpMyAdmin\\SqlParser\\Statements\\LoadStatement", + "REPLACE": "PhpMyAdmin\\SqlParser\\Statements\\ReplaceStatement", + "SELECT": "PhpMyAdmin\\SqlParser\\Statements\\SelectStatement", + "UPDATE": "PhpMyAdmin\\SqlParser\\Statements\\UpdateStatement", + "WITH": "PhpMyAdmin\\SqlParser\\Statements\\WithStatement", + "DEALLOCATE": "", + "EXECUTE": "", + "PREPARE": "", + "BEGIN": "PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement", + "COMMIT": "PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement", + "ROLLBACK": "PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement", + "START TRANSACTION": "PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement", + "PURGE": "PhpMyAdmin\\SqlParser\\Statements\\PurgeStatement", + "LOCK": "PhpMyAdmin\\SqlParser\\Statements\\LockStatement", + "UNLOCK": "PhpMyAdmin\\SqlParser\\Statements\\LockStatement" + }, + "KEYWORD_PARSERS": { + "PARTITION BY": [], + "SUBPARTITION BY": [], + "_OPTIONS": { + "class": "PhpMyAdmin\\SqlParser\\Components\\OptionsArray", + "field": "options" + }, + "_END_OPTIONS": { + "class": "PhpMyAdmin\\SqlParser\\Components\\OptionsArray", + "field": "end_options" + }, + "INTERSECT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "EXCEPT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "UNION": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "UNION ALL": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "UNION DISTINCT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "ALTER": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Expression", + "field": "table", + "options": { + "parseField": "table" + } + }, + "ANALYZE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "BACKUP": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "CALL": { + "class": "PhpMyAdmin\\SqlParser\\Components\\FunctionCall", + "field": "call" + }, + "CHECK": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "CHECKSUM": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "CROSS JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "DROP": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "fields", + "options": { + "parseField": "table" + } + }, + "FORCE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\IndexHint", + "field": "index_hints" + }, + "FROM": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "from", + "options": { + "field": "table" + } + }, + "GROUP BY": { + "class": "PhpMyAdmin\\SqlParser\\Components\\GroupKeyword", + "field": "group" + }, + "HAVING": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Condition", + "field": "having" + }, + "IGNORE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\IndexHint", + "field": "index_hints" + }, + "INTO": { + "class": "PhpMyAdmin\\SqlParser\\Components\\IntoKeyword", + "field": "into" + }, + "JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "LEFT JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "LEFT OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "ON": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Expression", + "field": "table", + "options": { + "parseField": "table" + } + }, + "RIGHT JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "RIGHT OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "INNER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "FULL JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "FULL OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL LEFT JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL RIGHT JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL LEFT OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL RIGHT OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "STRAIGHT_JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "LIMIT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Limit", + "field": "limit" + }, + "OPTIMIZE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "ORDER BY": { + "class": "PhpMyAdmin\\SqlParser\\Components\\OrderKeyword", + "field": "order" + }, + "PARTITION": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ArrayObj", + "field": "partition" + }, + "PROCEDURE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\FunctionCall", + "field": "procedure" + }, + "RENAME": { + "class": "PhpMyAdmin\\SqlParser\\Components\\RenameOperation", + "field": "renames" + }, + "REPAIR": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "RESTORE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "SET": { + "class": "PhpMyAdmin\\SqlParser\\Components\\SetOperation", + "field": "set" + }, + "SELECT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "expr" + }, + "TRUNCATE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Expression", + "field": "table", + "options": { + "parseField": "table" + } + }, + "UPDATE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "USE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\IndexHint", + "field": "index_hints" + }, + "VALUE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Array2d", + "field": "values" + }, + "VALUES": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Array2d", + "field": "values" + }, + "WHERE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Condition", + "field": "where" + } + }, + "list": { + "@type": "@1" + }, + "statements": [ + { + "@type": "PhpMyAdmin\\SqlParser\\Statements\\ExplainStatement", + "OPTIONS": { + "EXTENDED": 1, + "PARTITIONS": 1, + "FORMAT": [ + 1, + "var" + ] + }, + "bodyParser": null, + "statementAlias": "ANALYZE", + "connectionId": null, + "explainedTable": null, + "CLAUSES": [], + "END_OPTIONS": [], + "options": { + "@type": "PhpMyAdmin\\SqlParser\\Components\\OptionsArray", + "options": [] + }, + "first": 0, + "last": 2 + } + ], + "brackets": 0, + "strict": false, + "errors": [] + }, + "errors": { + "lexer": [], + "parser": [ + [ + "Unexpected token.", + { + "@type": "@4" + }, + 0 + ] + ] + } +} \ No newline at end of file diff --git a/tests/data/parser/parseAnalyzeError2.in b/tests/data/parser/parseAnalyzeError2.in new file mode 100644 index 000000000..b8f450db6 --- /dev/null +++ b/tests/data/parser/parseAnalyzeError2.in @@ -0,0 +1 @@ +ANALYZE \ No newline at end of file diff --git a/tests/data/parser/parseAnalyzeError2.out b/tests/data/parser/parseAnalyzeError2.out new file mode 100644 index 000000000..8a5ae609d --- /dev/null +++ b/tests/data/parser/parseAnalyzeError2.out @@ -0,0 +1,403 @@ +{ + "query": "ANALYZE", + "lexer": { + "@type": "PhpMyAdmin\\SqlParser\\Lexer", + "PARSER_METHODS": [ + "parseDelimiter", + "parseWhitespace", + "parseNumber", + "parseComment", + "parseOperator", + "parseBool", + "parseString", + "parseSymbol", + "parseKeyword", + "parseLabel", + "parseUnknown" + ], + "KEYWORD_NAME_INDICATORS": [ + "FROM", + "SET", + "WHERE" + ], + "OPERATOR_NAME_INDICATORS": [ + ",", + "." + ], + "str": "ANALYZE", + "len": 7, + "last": 7, + "list": { + "@type": "PhpMyAdmin\\SqlParser\\TokensList", + "tokens": [ + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": "ANALYZE", + "value": "ANALYZE", + "keyword": "ANALYZE", + "type": 1, + "flags": 3, + "position": 0 + }, + { + "@type": "PhpMyAdmin\\SqlParser\\Token", + "token": null, + "value": null, + "keyword": null, + "type": 9, + "flags": 0, + "position": null + } + ], + "count": 2, + "idx": 2 + }, + "DEFAULT_DELIMITER": ";", + "delimiter": ";", + "delimiterLen": 1, + "strict": false, + "errors": [] + }, + "parser": { + "@type": "PhpMyAdmin\\SqlParser\\Parser", + "STATEMENT_PARSERS": { + "DESCRIBE": "PhpMyAdmin\\SqlParser\\Statements\\ExplainStatement", + "DESC": "PhpMyAdmin\\SqlParser\\Statements\\ExplainStatement", + "EXPLAIN": "PhpMyAdmin\\SqlParser\\Statements\\ExplainStatement", + "FLUSH": "", + "GRANT": "", + "HELP": "", + "SET PASSWORD": "", + "STATUS": "", + "USE": "", + "ANALYZE": "PhpMyAdmin\\SqlParser\\Statements\\AnalyzeStatement", + "BACKUP": "PhpMyAdmin\\SqlParser\\Statements\\BackupStatement", + "CHECK": "PhpMyAdmin\\SqlParser\\Statements\\CheckStatement", + "CHECKSUM": "PhpMyAdmin\\SqlParser\\Statements\\ChecksumStatement", + "OPTIMIZE": "PhpMyAdmin\\SqlParser\\Statements\\OptimizeStatement", + "REPAIR": "PhpMyAdmin\\SqlParser\\Statements\\RepairStatement", + "RESTORE": "PhpMyAdmin\\SqlParser\\Statements\\RestoreStatement", + "SET": "PhpMyAdmin\\SqlParser\\Statements\\SetStatement", + "SHOW": "PhpMyAdmin\\SqlParser\\Statements\\ShowStatement", + "ALTER": "PhpMyAdmin\\SqlParser\\Statements\\AlterStatement", + "CREATE": "PhpMyAdmin\\SqlParser\\Statements\\CreateStatement", + "DROP": "PhpMyAdmin\\SqlParser\\Statements\\DropStatement", + "RENAME": "PhpMyAdmin\\SqlParser\\Statements\\RenameStatement", + "TRUNCATE": "PhpMyAdmin\\SqlParser\\Statements\\TruncateStatement", + "CALL": "PhpMyAdmin\\SqlParser\\Statements\\CallStatement", + "DELETE": "PhpMyAdmin\\SqlParser\\Statements\\DeleteStatement", + "DO": "", + "HANDLER": "", + "INSERT": "PhpMyAdmin\\SqlParser\\Statements\\InsertStatement", + "LOAD DATA": "PhpMyAdmin\\SqlParser\\Statements\\LoadStatement", + "REPLACE": "PhpMyAdmin\\SqlParser\\Statements\\ReplaceStatement", + "SELECT": "PhpMyAdmin\\SqlParser\\Statements\\SelectStatement", + "UPDATE": "PhpMyAdmin\\SqlParser\\Statements\\UpdateStatement", + "WITH": "PhpMyAdmin\\SqlParser\\Statements\\WithStatement", + "DEALLOCATE": "", + "EXECUTE": "", + "PREPARE": "", + "BEGIN": "PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement", + "COMMIT": "PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement", + "ROLLBACK": "PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement", + "START TRANSACTION": "PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement", + "PURGE": "PhpMyAdmin\\SqlParser\\Statements\\PurgeStatement", + "LOCK": "PhpMyAdmin\\SqlParser\\Statements\\LockStatement", + "UNLOCK": "PhpMyAdmin\\SqlParser\\Statements\\LockStatement" + }, + "KEYWORD_PARSERS": { + "PARTITION BY": [], + "SUBPARTITION BY": [], + "_OPTIONS": { + "class": "PhpMyAdmin\\SqlParser\\Components\\OptionsArray", + "field": "options" + }, + "_END_OPTIONS": { + "class": "PhpMyAdmin\\SqlParser\\Components\\OptionsArray", + "field": "end_options" + }, + "INTERSECT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "EXCEPT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "UNION": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "UNION ALL": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "UNION DISTINCT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\UnionKeyword", + "field": "union" + }, + "ALTER": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Expression", + "field": "table", + "options": { + "parseField": "table" + } + }, + "ANALYZE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "BACKUP": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "CALL": { + "class": "PhpMyAdmin\\SqlParser\\Components\\FunctionCall", + "field": "call" + }, + "CHECK": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "CHECKSUM": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "CROSS JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "DROP": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "fields", + "options": { + "parseField": "table" + } + }, + "FORCE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\IndexHint", + "field": "index_hints" + }, + "FROM": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "from", + "options": { + "field": "table" + } + }, + "GROUP BY": { + "class": "PhpMyAdmin\\SqlParser\\Components\\GroupKeyword", + "field": "group" + }, + "HAVING": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Condition", + "field": "having" + }, + "IGNORE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\IndexHint", + "field": "index_hints" + }, + "INTO": { + "class": "PhpMyAdmin\\SqlParser\\Components\\IntoKeyword", + "field": "into" + }, + "JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "LEFT JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "LEFT OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "ON": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Expression", + "field": "table", + "options": { + "parseField": "table" + } + }, + "RIGHT JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "RIGHT OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "INNER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "FULL JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "FULL OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL LEFT JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL RIGHT JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL LEFT OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "NATURAL RIGHT OUTER JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "STRAIGHT_JOIN": { + "class": "PhpMyAdmin\\SqlParser\\Components\\JoinKeyword", + "field": "join" + }, + "LIMIT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Limit", + "field": "limit" + }, + "OPTIMIZE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "ORDER BY": { + "class": "PhpMyAdmin\\SqlParser\\Components\\OrderKeyword", + "field": "order" + }, + "PARTITION": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ArrayObj", + "field": "partition" + }, + "PROCEDURE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\FunctionCall", + "field": "procedure" + }, + "RENAME": { + "class": "PhpMyAdmin\\SqlParser\\Components\\RenameOperation", + "field": "renames" + }, + "REPAIR": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "RESTORE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "SET": { + "class": "PhpMyAdmin\\SqlParser\\Components\\SetOperation", + "field": "set" + }, + "SELECT": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "expr" + }, + "TRUNCATE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Expression", + "field": "table", + "options": { + "parseField": "table" + } + }, + "UPDATE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\ExpressionArray", + "field": "tables", + "options": { + "parseField": "table" + } + }, + "USE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\IndexHint", + "field": "index_hints" + }, + "VALUE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Array2d", + "field": "values" + }, + "VALUES": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Array2d", + "field": "values" + }, + "WHERE": { + "class": "PhpMyAdmin\\SqlParser\\Components\\Condition", + "field": "where" + } + }, + "list": { + "@type": "@1" + }, + "statements": [ + { + "@type": "PhpMyAdmin\\SqlParser\\Statements\\ExplainStatement", + "OPTIONS": { + "EXTENDED": 1, + "PARTITIONS": 1, + "FORMAT": [ + 1, + "var" + ] + }, + "bodyParser": null, + "statementAlias": "ANALYZE", + "connectionId": null, + "explainedTable": null, + "CLAUSES": [], + "END_OPTIONS": [], + "options": { + "@type": "PhpMyAdmin\\SqlParser\\Components\\OptionsArray", + "options": [] + }, + "first": 0, + "last": 1 + } + ], + "brackets": 0, + "strict": false, + "errors": [] + }, + "errors": { + "lexer": [], + "parser": [ + [ + "Unexpected token.", + { + "@type": "@3" + }, + 0 + ] + ] + } +} \ No newline at end of file