diff options
-rw-r--r-- | .travis.yml | 1 | ||||
-rw-r--r-- | composer.json | 3 | ||||
-rw-r--r-- | src/Components/AlterOperation.php | 12 | ||||
-rw-r--r-- | src/Components/PartitionDefinition.php | 2 | ||||
-rw-r--r-- | tests/Builder/CreateStatementTest.php | 25 | ||||
-rw-r--r-- | tests/Parser/AlterStatementTest.php | 1 | ||||
-rw-r--r-- | tests/data/parser/parseAlter2.out | 2 | ||||
-rw-r--r-- | tests/data/parser/parseAlter3.in | 3 | ||||
-rw-r--r-- | tests/data/parser/parseAlter3.out | 7 |
9 files changed, 50 insertions, 6 deletions
diff --git a/.travis.yml b/.travis.yml index fc8a89c..9401b3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ php: - 5.5 - 5.6 - 7.0 + - "7.1.0RC1" - nightly - hhvm diff --git a/composer.json b/composer.json index d3d3f17..d41c1e3 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,8 @@ "source": "https://github.com/phpmyadmin/sql-parser" }, "require": { - "php": ">=5.4.0" + "php": ">=5.4.0", + "ext-mbstring": "*" }, "require-dev": { "phpunit/php-code-coverage": "~2.0 || ~3.0", diff --git a/src/Components/AlterOperation.php b/src/Components/AlterOperation.php index 9db7682..3481e98 100644 --- a/src/Components/AlterOperation.php +++ b/src/Components/AlterOperation.php @@ -220,6 +220,17 @@ class AlterOperation extends Component } elseif (($token->value === ',') && ($brackets === 0)) { break; } + } elseif (!empty(Parser::$STATEMENT_PARSERS[$token->value])) { + // We have reached the end of ALTER operation and suddenly found + // a start to new statement, but have not find a delimiter between them + + if (! ($token->value == 'SET' && $list->tokens[$list->idx - 1]->value == 'CHARACTER')) { + $parser->error( + __('A new statement was found, but no delimiter between it and the previous one.'), + $token + ); + break; + } } $ret->unknown[] = $token; } @@ -233,6 +244,7 @@ class AlterOperation extends Component } --$list->idx; + return $ret; } diff --git a/src/Components/PartitionDefinition.php b/src/Components/PartitionDefinition.php index 06dc5fc..85342d7 100644 --- a/src/Components/PartitionDefinition.php +++ b/src/Components/PartitionDefinition.php @@ -215,7 +215,7 @@ class PartitionDefinition extends Component ? '' : ' ' . PartitionDefinition::build($component->subpartitions); return trim( 'PARTITION ' . $component->name - . (empty($component->type) ? '' : ' VALUES ' . $component->type . ' ' . $component->expr) + . (empty($component->type) ? '' : ' VALUES ' . $component->type . ' ' . $component->expr . ' ') . $component->options . $subpartitions ); } diff --git a/tests/Builder/CreateStatementTest.php b/tests/Builder/CreateStatementTest.php index ecb0d02..cfdad92 100644 --- a/tests/Builder/CreateStatementTest.php +++ b/tests/Builder/CreateStatementTest.php @@ -123,6 +123,7 @@ class CreateStatementTest extends TestCase public function testBuilderPartitions() { + /* Assertion 1 */ $query = 'CREATE TABLE ts (' . "\n" . ' `id` int,' . "\n" . ' `purchased` date' . "\n" @@ -132,21 +133,39 @@ class CreateStatementTest extends TestCase . 'SUBPARTITION BY HASH(TO_DAYS(purchased))' . "\n" . 'SUBPARTITIONS 2' . "\n" . '(' . "\n" - . 'PARTITION p0 VALUES LESS THAN (1990) (' . "\n" + . 'PARTITION p0 VALUES LESS THAN (1990) (' . "\n" . 'SUBPARTITION s0,' . "\n" . 'SUBPARTITION s1' . "\n" . '),' . "\n" - . 'PARTITION p1 VALUES LESS THAN (2000) (' . "\n" + . 'PARTITION p1 VALUES LESS THAN (2000) (' . "\n" . 'SUBPARTITION s2,' . "\n" . 'SUBPARTITION s3' . "\n" . '),' . "\n" - . 'PARTITION p2 VALUES LESS THAN MAXVALUE (' . "\n" + . 'PARTITION p2 VALUES LESS THAN MAXVALUE (' . "\n" . 'SUBPARTITION s4,' . "\n" . 'SUBPARTITION s5' . "\n" . ')' . "\n" . ')'; $parser = new Parser($query); $this->assertEquals($query, $parser->statements[0]->build()); + + /* Assertion 2 */ + $query = 'CREATE TABLE `pma_test` (' . "\n" + . ' `test_id` int(32) NOT NULL,' . "\n" + . ' `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP'. "\n" + . ') ENGINE=InnoDB DEFAULT CHARSET=utf8' . "\n" + . 'PARTITION BY RANGE (test_id)' . "\n" + . '(' . "\n" + . 'PARTITION p0 VALUES LESS THAN (250000) ENGINE=InnoDB,' . "\n" + . 'PARTITION p1 VALUES LESS THAN (500000) ENGINE=InnoDB,' . "\n" + . 'PARTITION p2 VALUES LESS THAN (750000) ENGINE=InnoDB,' . "\n" + . 'PARTITION p3 VALUES LESS THAN (1000000) ENGINE=InnoDB,' . "\n" + . 'PARTITION p4 VALUES LESS THAN (1250000) ENGINE=InnoDB,' . "\n" + . 'PARTITION p5 VALUES LESS THAN (1500000) ENGINE=InnoDB,' . "\n" + . 'PARTITION p6 VALUES LESS THAN MAXVALUE ENGINE=InnoDB' . "\n" + . ')'; + $parser = new Parser($query); + $this->assertEquals($query, $parser->statements[0]->build()); } public function testBuilderView() diff --git a/tests/Parser/AlterStatementTest.php b/tests/Parser/AlterStatementTest.php index e0ca12a..1179b84 100644 --- a/tests/Parser/AlterStatementTest.php +++ b/tests/Parser/AlterStatementTest.php @@ -20,6 +20,7 @@ class AlterStatementTest extends TestCase return array( array('parser/parseAlter'), array('parser/parseAlter2'), + array('parser/parseAlter3'), array('parser/parseAlter4'), ); } diff --git a/tests/data/parser/parseAlter2.out b/tests/data/parser/parseAlter2.out index 80b63ec..189f815 100644 --- a/tests/data/parser/parseAlter2.out +++ b/tests/data/parser/parseAlter2.out @@ -1,4 +1,4 @@ a:4:{s:5:"query";s:84:"ALTER /* */ TABLE /* */ table CONVERT /* */ TO /* */ CHARACTER /* */ SET /* */ utf8;";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:84:"ALTER /* */ TABLE /* */ table CONVERT /* */ TO /* */ CHARACTER /* */ SET /* */ utf8;";s:3:"len";i:84;s:4:"last";i:84;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:29:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"ALTER";s:5:"value";s:5:"ALTER";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:6;}i:3;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"TABLE";s:5:"value";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:12;}i:5;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:18;}i:7;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:23;}i:8;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"table";s:5:"value";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:24;}i:9;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" -";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:29;}i:10;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"CONVERT";s:5:"value";s:7:"CONVERT";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:30;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:37;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:38;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:43;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:44;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:46;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:47;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:52;}i:18;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"CHARACTER";s:5:"value";s:9:"CHARACTER";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:53;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:62;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:63;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:68;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:69;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:73;}i:25;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:78;}i:26;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"utf8";s:5:"value";s:4:"utf8";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:79;}i:27;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:83;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:29;s:3:"idx";i:29;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":5:{s:4:"list";R:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:35:"SqlParser\Statements\AlterStatement":5:{s:5:"table";N;s:7:"altered";a:1:{i:0;O:35:"SqlParser\Components\AlterOperation":3:{s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:2;s:2:"TO";}}s:5:"field";N;s:7:"unknown";a:7:{i:0;r:118;i:1;r:124;i:2;r:136;i:3;r:142;i:4;r:148;i:5;r:160;i:6;r:166;}}}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:3;s:5:"TABLE";i:12;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:27;}}s:8:"brackets";i:0;}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:35:"This option conflicts with "TABLE".";i:1;r:58;i:2;i:0;}}}}
\ No newline at end of file +";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:29;}i:10;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"CONVERT";s:5:"value";s:7:"CONVERT";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:30;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:37;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:38;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:43;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"TO";s:5:"value";s:2:"TO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:44;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:46;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:47;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:52;}i:18;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"CHARACTER";s:5:"value";s:9:"CHARACTER";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:53;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:62;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:63;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:68;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:69;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:73;}i:25;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:78;}i:26;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"utf8";s:5:"value";s:4:"utf8";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:79;}i:27;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:83;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:29;s:3:"idx";i:29;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":5:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:35:"SqlParser\Statements\AlterStatement":5:{s:5:"table";N;s:7:"altered";a:1:{i:0;O:35:"SqlParser\Components\AlterOperation":3:{s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:2;s:2:"TO";}}s:5:"field";N;s:7:"unknown";a:3:{i:0;r:118;i:1;r:124;i:2;r:136;}}}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:3;s:5:"TABLE";i:12;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:27;}}s:8:"brackets";i:0;}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:35:"This option conflicts with "TABLE".";i:1;r:58;i:2;i:0;}i:1;a:3:{i:0;s:76:"A new statement was found, but no delimiter between it and the previous one.";i:1;r:142;i:2;i:0;}}}}
\ No newline at end of file diff --git a/tests/data/parser/parseAlter3.in b/tests/data/parser/parseAlter3.in new file mode 100644 index 0000000..eebf697 --- /dev/null +++ b/tests/data/parser/parseAlter3.in @@ -0,0 +1,3 @@ +ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT + +ALTER TABLE `tbl` CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED NOT NULL
\ No newline at end of file diff --git a/tests/data/parser/parseAlter3.out b/tests/data/parser/parseAlter3.out new file mode 100644 index 0000000..9f383c3 --- /dev/null +++ b/tests/data/parser/parseAlter3.out @@ -0,0 +1,7 @@ +a:4:{s:5:"query";s:153:"ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT + +ALTER TABLE `tbl` CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED NOT NULL";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:153:"ALTER TABLE `tbl` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT + +ALTER TABLE `tbl` CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED NOT NULL";s:3:"len";i:153;s:4:"last";i:153;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:48:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"ALTER";s:5:"value";s:5:"ALTER";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:5;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"TABLE";s:5:"value";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:6;}i:3;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:11;}i:4;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"`tbl`";s:5:"value";s:3:"tbl";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:12;}i:5;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:6;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"CHANGE";s:5:"value";s:6:"CHANGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:7;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:8;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"`uid`";s:5:"value";s:3:"uid";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:25;}i:9;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:30;}i:10;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"`uid`";s:5:"value";s:3:"uid";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:31;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:36;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:37;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:40;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"10";s:5:"value";i:10;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:42;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:45;}i:18;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:46;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"UNSIGNED";s:5:"value";s:8:"UNSIGNED";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:47;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:55;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"NOT NULL";s:5:"value";s:8:"NOT NULL";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:56;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:64;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:14:"AUTO_INCREMENT";s:5:"value";s:14:"AUTO_INCREMENT";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:65;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";s:2:" + +";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:79;}i:25;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"ALTER";s:5:"value";s:5:"ALTER";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:81;}i:26;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:27;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"TABLE";s:5:"value";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:87;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:92;}i:29;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"`tbl`";s:5:"value";s:3:"tbl";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:93;}i:30;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:98;}i:31;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"CHANGE";s:5:"value";s:6:"CHANGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:99;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:105;}i:33;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"`field_1`";s:5:"value";s:7:"field_1";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:106;}i:34;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:115;}i:35;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"`field_2`";s:5:"value";s:7:"field_2";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:116;}i:36;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:125;}i:37;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"INT";s:5:"value";s:3:"INT";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:126;}i:38;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:129;}i:39;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:130;}i:40;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"10";s:5:"value";i:10;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:131;}i:41;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:133;}i:42;O:15:"SqlParser\Token":5:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:134;}i:43;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:135;}i:44;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"UNSIGNED";s:5:"value";s:8:"UNSIGNED";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:136;}i:45;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:144;}i:46;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"NOT NULL";s:5:"value";s:8:"NOT NULL";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:145;}i:47;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:48;s:3:"idx";i:48;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":5:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:35:"SqlParser\Statements\AlterStatement":5:{s:5:"table";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:3:"tbl";s:6:"column";N;s:4:"expr";s:5:"`tbl`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"altered";a:1:{i:0;O:35:"SqlParser\Components\AlterOperation":3:{s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:6:"CHANGE";}}s:5:"field";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:3:"uid";s:4:"expr";s:5:"`uid`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"unknown";a:15:{i:0;r:70;i:1;r:76;i:2;r:82;i:3;r:88;i:4;r:94;i:5;r:100;i:6;r:106;i:7;r:112;i:8;r:118;i:9;r:124;i:10;r:130;i:11;r:136;i:12;r:142;i:13;r:148;i:14;r:154;}}}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:47;}}s:8:"brackets";i:0;}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:76:"A new statement was found, but no delimiter between it and the previous one.";i:1;r:160;i:2;i:0;}}}}
\ No newline at end of file |