summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeven Bansod <devenbansod.bits@gmail.com>2018-12-20 17:37:56 +0530
committerDeven Bansod <devenbansod.bits@gmail.com>2018-12-20 17:55:24 +0530
commit37df692dce830d3d30bd60c8165c0c0a05703d38 (patch)
tree687e74c3fe51fc720c95b703d40024ebb1d2da1b
parent5e8dbcf3ff0d1123efd731863083a9af539e5992 (diff)
downloadsql-parser-37df692dce830d3d30bd60c8165c0c0a05703d38.zip
sql-parser-37df692dce830d3d30bd60c8165c0c0a05703d38.tar.gz
sql-parser-37df692dce830d3d30bd60c8165c0c0a05703d38.tar.bz2
Add support for PURGE statements
Fix #207 Signed-off-by: Deven Bansod <devenbansod.bits@gmail.com>
-rw-r--r--src/Parser.php2
-rw-r--r--src/Statements/PurgeStatement.php143
-rw-r--r--tests/Builder/PurgeStatementTest.php22
-rw-r--r--tests/Parser/PurgeStatementTest.php31
-rw-r--r--tests/data/parser/parsePurge.in1
-rw-r--r--tests/data/parser/parsePurge.out1
-rw-r--r--tests/data/parser/parsePurge2.in1
-rw-r--r--tests/data/parser/parsePurge2.out1
-rw-r--r--tests/data/parser/parsePurge3.in1
-rw-r--r--tests/data/parser/parsePurge3.out1
-rw-r--r--tests/data/parser/parsePurge4.in1
-rw-r--r--tests/data/parser/parsePurge4.out1
-rw-r--r--tests/data/parser/parsePurgeErr.in1
-rw-r--r--tests/data/parser/parsePurgeErr.out1
-rw-r--r--tests/data/parser/parsePurgeErr2.in1
-rw-r--r--tests/data/parser/parsePurgeErr2.out1
-rw-r--r--tests/data/parser/parsePurgeErr3.in1
-rw-r--r--tests/data/parser/parsePurgeErr3.out1
18 files changed, 212 insertions, 0 deletions
diff --git a/src/Parser.php b/src/Parser.php
index ab97855..ca756f5 100644
--- a/src/Parser.php
+++ b/src/Parser.php
@@ -86,6 +86,8 @@ class Parser extends Core
'COMMIT' => 'PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement',
'ROLLBACK' => 'PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement',
'START TRANSACTION' => 'PhpMyAdmin\\SqlParser\\Statements\\TransactionStatement',
+
+ 'PURGE' => 'PhpMyAdmin\\SqlParser\\Statements\\PurgeStatement',
);
/**
diff --git a/src/Statements/PurgeStatement.php b/src/Statements/PurgeStatement.php
new file mode 100644
index 0000000..0374813
--- /dev/null
+++ b/src/Statements/PurgeStatement.php
@@ -0,0 +1,143 @@
+<?php
+
+/**
+ * `PURGE` statement.
+ */
+
+namespace PhpMyAdmin\SqlParser\Statements;
+
+use PhpMyAdmin\SqlParser\Components\Expression;
+use PhpMyAdmin\SqlParser\Components\OptionsArray;
+use PhpMyAdmin\SqlParser\Parser;
+use PhpMyAdmin\SqlParser\Statement;
+use PhpMyAdmin\SqlParser\Token;
+use PhpMyAdmin\SqlParser\TokensList;
+
+/**
+ * `PURGE` statement.
+ *
+ * PURGE { BINARY | MASTER } LOGS
+ * { TO 'log_name' | BEFORE datetime_expr }
+ *
+ * @category Statements
+ *
+ * @license https://www.gnu.org/licenses/gpl-2.0.txt GPL-2.0+
+ */
+class PurgeStatement extends Statement
+{
+ /**
+ * The type of logs
+ *
+ * @var String
+ */
+ public $log_type;
+
+ /**
+ * The end option of this query.
+ *
+ * @var String
+ */
+ public $end_option;
+
+ /**
+ * The end expr of this query.
+ *
+ * @var String
+ */
+ public $end_expr;
+
+ /**
+ * @return string
+ */
+ public function build()
+ {
+ $ret = 'PURGE ' . $this->log_type . ' ' . 'LOGS '
+ . ($this->end_option !== null ? ($this->end_option . ' ' . $this->end_expr) : '');
+ return trim($ret);
+ }
+
+ /**
+ * @param Parser $parser the instance that requests parsing
+ * @param TokensList $list the list of tokens to be parsed
+ */
+ public function parse(Parser $parser, TokensList $list)
+ {
+ ++$list->idx; // Skipping `PURGE`.
+
+ /**
+ * The state of the parser.
+ *
+ * @var int
+ */
+ $state = 0;
+
+ for (; $list->idx < $list->count; ++$list->idx) {
+ /**
+ * Token parsed at this moment.
+ *
+ * @var Token
+ */
+ $token = $list->tokens[$list->idx];
+
+ // End of statement.
+ if ($token->type === Token::TYPE_DELIMITER) {
+ break;
+ }
+
+ // Skipping whitespaces and comments.
+ if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) {
+ continue;
+ }
+
+ switch ($state) {
+ case 0:
+ // parse `{ BINARY | MASTER }`
+ $this->log_type = self::parseExpectedKeyword($parser, $token, array('BINARY', 'MASTER'));
+ break;
+ case 1:
+ // parse `LOGS`
+ self::parseExpectedKeyword($parser, $token, array('LOGS'));
+ break;
+ case 2:
+ // parse `{ TO | BEFORE }`
+ $this->end_option = self::parseExpectedKeyword($parser, $token, array('TO', 'BEFORE'));
+ break;
+ case 3:
+ // parse `expr`
+ $this->end_expr = Expression::parse($parser, $list, array());
+ break;
+ default:
+ $parser->error('Unexpected token.', $token);
+ break;
+ }
+ $state++;
+ $prevToken = $token;
+ }
+
+ // Only one possible end state
+ if ($state != 4) {
+ $parser->error('Unexpected token.', $prevToken);
+ }
+ }
+
+ /**
+ * Parse expected keyword (or throw relevant error)
+ *
+ * @param Parser $parser the instance that requests parsing
+ * @param Token $token token to be parsed
+ * @param Array $expected_keywords array of possibly expected keywords at this point
+ */
+ private static function parseExpectedKeyword($parser, $token, $expected_keywords)
+ {
+ if ($token->type === Token::TYPE_KEYWORD) {
+ if (in_array($token->keyword, $expected_keywords)) {
+ return $token->keyword;
+ } else {
+ $parser->error('Unexpected keyword', $token);
+ }
+ } else {
+ $parser->error('Unexpected token.', $token);
+ }
+ return null;
+ }
+}
diff --git a/tests/Builder/PurgeStatementTest.php b/tests/Builder/PurgeStatementTest.php
new file mode 100644
index 0000000..caa1652
--- /dev/null
+++ b/tests/Builder/PurgeStatementTest.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace PhpMyAdmin\SqlParser\Tests\Builder;
+
+use PhpMyAdmin\SqlParser\Parser;
+use PhpMyAdmin\SqlParser\Tests\TestCase;
+
+class PurgeStatementTest extends TestCase
+{
+ public function testBuilder()
+ {
+ $query = 'PURGE BINARY LOGS TO \'mysql-bin.010\'';
+ $parser = new Parser($query);
+ $stmt = $parser->statements[0];
+ $this->assertEquals($query, $stmt->build());
+
+ $query = 'PURGE BINARY LOGS BEFORE \'2008-04-02 22:46:26\'';
+ $parser = new Parser($query);
+ $stmt = $parser->statements[0];
+ $this->assertEquals($query, $stmt->build());
+ }
+}
diff --git a/tests/Parser/PurgeStatementTest.php b/tests/Parser/PurgeStatementTest.php
new file mode 100644
index 0000000..dd67dc6
--- /dev/null
+++ b/tests/Parser/PurgeStatementTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace PhpMyAdmin\SqlParser\Tests\Parser;
+
+use PhpMyAdmin\SqlParser\Tests\TestCase;
+
+class PurgeStatementTest extends TestCase
+{
+ /**
+ * @dataProvider testPurgeProvider
+ *
+ * @param mixed $test
+ */
+ public function testPurge($test)
+ {
+ $this->runParserTest($test);
+ }
+
+ public function testPurgeProvider()
+ {
+ return array(
+ array('parser/parsePurge'),
+ array('parser/parsePurge2'),
+ array('parser/parsePurge3'),
+ array('parser/parsePurge4'),
+ array('parser/parsePurgeErr'),
+ array('parser/parsePurgeErr2'),
+ array('parser/parsePurgeErr3'),
+ );
+ }
+}
diff --git a/tests/data/parser/parsePurge.in b/tests/data/parser/parsePurge.in
new file mode 100644
index 0000000..e133522
--- /dev/null
+++ b/tests/data/parser/parsePurge.in
@@ -0,0 +1 @@
+PURGE BINARY LOGS TO 'mysql-bin.010'; \ No newline at end of file
diff --git a/tests/data/parser/parsePurge.out b/tests/data/parser/parsePurge.out
new file mode 100644
index 0000000..b21609c
--- /dev/null
+++ b/tests/data/parser/parsePurge.out
@@ -0,0 +1 @@
+a:4:{s:5:"query";s:37:"PURGE BINARY LOGS TO 'mysql-bin.010';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:37:"PURGE BINARY LOGS TO 'mysql-bin.010';";s:3:"len";i:37;s:4:"last";i:37;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:11:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BINARY";s:5:"value";s:6:"BINARY";s:7:"keyword";s:6:"BINARY";s:4:"type";i:1;s:5:"flags";i:43;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:7:"keyword";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:15:"'mysql-bin.010'";s:5:"value";s:13:"mysql-bin.010";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:21;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:36;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:11;s:3:"idx";i:11;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"BINARY";s:10:"end_option";s:2:"TO";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:13:"mysql-bin.010";s:4:"expr";s:15:"'mysql-bin.010'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:9;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file
diff --git a/tests/data/parser/parsePurge2.in b/tests/data/parser/parsePurge2.in
new file mode 100644
index 0000000..a09818a
--- /dev/null
+++ b/tests/data/parser/parsePurge2.in
@@ -0,0 +1 @@
+PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26'; \ No newline at end of file
diff --git a/tests/data/parser/parsePurge2.out b/tests/data/parser/parsePurge2.out
new file mode 100644
index 0000000..7175a1e
--- /dev/null
+++ b/tests/data/parser/parsePurge2.out
@@ -0,0 +1 @@
+a:4:{s:5:"query";s:47:"PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:47:"PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';";s:3:"len";i:47;s:4:"last";i:47;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:11:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BINARY";s:5:"value";s:6:"BINARY";s:7:"keyword";s:6:"BINARY";s:4:"type";i:1;s:5:"flags";i:43;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BEFORE";s:5:"value";s:6:"BEFORE";s:7:"keyword";s:6:"BEFORE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:21:"'2008-04-02 22:46:26'";s:5:"value";s:19:"2008-04-02 22:46:26";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:25;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:46;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:11;s:3:"idx";i:11;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"BINARY";s:10:"end_option";s:6:"BEFORE";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:19:"2008-04-02 22:46:26";s:4:"expr";s:21:"'2008-04-02 22:46:26'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:9;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file
diff --git a/tests/data/parser/parsePurge3.in b/tests/data/parser/parsePurge3.in
new file mode 100644
index 0000000..755ff2b
--- /dev/null
+++ b/tests/data/parser/parsePurge3.in
@@ -0,0 +1 @@
+PURGE MASTER LOGS BEFORE '2008-04-02 22:46:26'; \ No newline at end of file
diff --git a/tests/data/parser/parsePurge3.out b/tests/data/parser/parsePurge3.out
new file mode 100644
index 0000000..d3543e3
--- /dev/null
+++ b/tests/data/parser/parsePurge3.out
@@ -0,0 +1 @@
+a:4:{s:5:"query";s:47:"PURGE MASTER LOGS BEFORE '2008-04-02 22:46:26';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:47:"PURGE MASTER LOGS BEFORE '2008-04-02 22:46:26';";s:3:"len";i:47;s:4:"last";i:47;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:11:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"MASTER";s:5:"value";s:6:"MASTER";s:7:"keyword";s:6:"MASTER";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BEFORE";s:5:"value";s:6:"BEFORE";s:7:"keyword";s:6:"BEFORE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:21:"'2008-04-02 22:46:26'";s:5:"value";s:19:"2008-04-02 22:46:26";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:25;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:46;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:11;s:3:"idx";i:11;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"MASTER";s:10:"end_option";s:6:"BEFORE";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:19:"2008-04-02 22:46:26";s:4:"expr";s:21:"'2008-04-02 22:46:26'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:9;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file
diff --git a/tests/data/parser/parsePurge4.in b/tests/data/parser/parsePurge4.in
new file mode 100644
index 0000000..537e269
--- /dev/null
+++ b/tests/data/parser/parsePurge4.in
@@ -0,0 +1 @@
+PURGE MASTER LOGS TO 'mysql-bin.010'; \ No newline at end of file
diff --git a/tests/data/parser/parsePurge4.out b/tests/data/parser/parsePurge4.out
new file mode 100644
index 0000000..857de00
--- /dev/null
+++ b/tests/data/parser/parsePurge4.out
@@ -0,0 +1 @@
+a:4:{s:5:"query";s:37:"PURGE MASTER LOGS TO 'mysql-bin.010';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:37:"PURGE MASTER LOGS TO 'mysql-bin.010';";s:3:"len";i:37;s:4:"last";i:37;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:11:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"MASTER";s:5:"value";s:6:"MASTER";s:7:"keyword";s:6:"MASTER";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:7:"keyword";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:15:"'mysql-bin.010'";s:5:"value";s:13:"mysql-bin.010";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:21;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:36;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:11;s:3:"idx";i:11;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"MASTER";s:10:"end_option";s:2:"TO";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:13:"mysql-bin.010";s:4:"expr";s:15:"'mysql-bin.010'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:9;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}} \ No newline at end of file
diff --git a/tests/data/parser/parsePurgeErr.in b/tests/data/parser/parsePurgeErr.in
new file mode 100644
index 0000000..8302ca7
--- /dev/null
+++ b/tests/data/parser/parsePurgeErr.in
@@ -0,0 +1 @@
+PURGE LOGS TO 'mysql-bin.010'; \ No newline at end of file
diff --git a/tests/data/parser/parsePurgeErr.out b/tests/data/parser/parsePurgeErr.out
new file mode 100644
index 0000000..0175550
--- /dev/null
+++ b/tests/data/parser/parsePurgeErr.out
@@ -0,0 +1 @@
+a:4:{s:5:"query";s:30:"PURGE LOGS TO 'mysql-bin.010';";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:30:"PURGE LOGS TO 'mysql-bin.010';";s:3:"len";i:30;s:4:"last";i:30;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:9:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:10;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:7:"keyword";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:11;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:13;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:15:"'mysql-bin.010'";s:5:"value";s:13:"mysql-bin.010";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:14;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:29;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:9;s:3:"idx";i:9;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";N;s:10:"end_option";N;s:8:"end_expr";N;s:7:"options";N;s:5:"first";i:0;s:4:"last";i:7;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:4:{i:0;a:3:{i:0;s:18:"Unexpected keyword";i:1;r:23;i:2;i:0;}i:1;a:3:{i:0;s:18:"Unexpected keyword";i:1;r:37;i:2;i:0;}i:2;a:3:{i:0;s:17:"Unexpected token.";i:1;r:51;i:2;i:0;}i:3;a:3:{i:0;s:17:"Unexpected token.";i:1;r:51;i:2;i:0;}}}} \ No newline at end of file
diff --git a/tests/data/parser/parsePurgeErr2.in b/tests/data/parser/parsePurgeErr2.in
new file mode 100644
index 0000000..93c642b
--- /dev/null
+++ b/tests/data/parser/parsePurgeErr2.in
@@ -0,0 +1 @@
+PURGE BINARY LOGS INTO; \ No newline at end of file
diff --git a/tests/data/parser/parsePurgeErr2.out b/tests/data/parser/parsePurgeErr2.out
new file mode 100644
index 0000000..56fa542
--- /dev/null
+++ b/tests/data/parser/parsePurgeErr2.out
@@ -0,0 +1 @@
+a:4:{s:5:"query";s:23:"PURGE BINARY LOGS INTO;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:23:"PURGE BINARY LOGS INTO;";s:3:"len";i:23;s:4:"last";i:23;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:9:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BINARY";s:5:"value";s:6:"BINARY";s:7:"keyword";s:6:"BINARY";s:4:"type";i:1;s:5:"flags";i:43;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"INTO";s:5:"value";s:4:"INTO";s:7:"keyword";s:4:"INTO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:22;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:9;s:3:"idx";i:9;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"BINARY";s:10:"end_option";N;s:8:"end_expr";N;s:7:"options";N;s:5:"first";i:0;s:4:"last";i:7;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:18:"Unexpected keyword";i:1;r:51;i:2;i:0;}i:1;a:3:{i:0;s:17:"Unexpected token.";i:1;r:51;i:2;i:0;}}}} \ No newline at end of file
diff --git a/tests/data/parser/parsePurgeErr3.in b/tests/data/parser/parsePurgeErr3.in
new file mode 100644
index 0000000..9c58ff6
--- /dev/null
+++ b/tests/data/parser/parsePurgeErr3.in
@@ -0,0 +1 @@
+PURGE BINARY LOGS TO 'mysql.bin' INTO; \ No newline at end of file
diff --git a/tests/data/parser/parsePurgeErr3.out b/tests/data/parser/parsePurgeErr3.out
new file mode 100644
index 0000000..0298907
--- /dev/null
+++ b/tests/data/parser/parsePurgeErr3.out
@@ -0,0 +1 @@
+a:4:{s:5:"query";s:38:"PURGE BINARY LOGS TO 'mysql.bin' INTO;";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:38:"PURGE BINARY LOGS TO 'mysql.bin' INTO;";s:3:"len";i:38;s:4:"last";i:38;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:13:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"PURGE";s:5:"value";s:5:"PURGE";s:7:"keyword";s:5:"PURGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"BINARY";s:5:"value";s:6:"BINARY";s:7:"keyword";s:6:"BINARY";s:4:"type";i:1;s:5:"flags";i:43;s:8:"position";i:6;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"LOGS";s:5:"value";s:4:"LOGS";s:7:"keyword";s:4:"LOGS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:7:"keyword";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:20;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:11:"'mysql.bin'";s:5:"value";s:9:"mysql.bin";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:21;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:32;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"INTO";s:5:"value";s:4:"INTO";s:7:"keyword";s:4:"INTO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:33;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:37;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:13;s:3:"idx";i:13;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:46:"PhpMyAdmin\SqlParser\Statements\PurgeStatement":6:{s:8:"log_type";s:6:"BINARY";s:10:"end_option";s:2:"TO";s:8:"end_expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:9:"mysql.bin";s:4:"expr";s:11:"'mysql.bin'";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"options";N;s:5:"first";i:0;s:4:"last";i:11;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:17:"Unexpected token.";i:1;r:79;i:2;i:0;}i:1;a:3:{i:0;s:17:"Unexpected token.";i:1;r:79;i:2;i:0;}}}} \ No newline at end of file