diff options
author | Dan Ungureanu <udan1107@gmail.com> | 2015-08-16 02:48:03 +0300 |
---|---|---|
committer | Dan Ungureanu <udan1107@gmail.com> | 2015-08-16 02:48:03 +0300 |
commit | 2c1124c25a74191f4c3bf095238a0a732bfd8a9e (patch) | |
tree | 30ca07e0d1b37a0a567d6be5fabe9bffe2d8a594 | |
parent | 3cbebbe741f4bab1ce4790daa34d4cdd8bf36a25 (diff) | |
download | sql-parser-2c1124c25a74191f4c3bf095238a0a732bfd8a9e.zip sql-parser-2c1124c25a74191f4c3bf095238a0a732bfd8a9e.tar.gz sql-parser-2c1124c25a74191f4c3bf095238a0a732bfd8a9e.tar.bz2 |
Fixed a couple of minor bugs in partition parsing.
'MAXVALUE' can be used for partitions.
The correct class is used for parsing.
Options may be specified for the class that is used for parsing.
Wrote tests.
-rw-r--r-- | src/Components/ArrayObj.php | 6 | ||||
-rw-r--r-- | src/Components/PartitionDefinition.php | 26 | ||||
-rw-r--r-- | src/Statements/CreateStatement.php | 6 | ||||
-rw-r--r-- | tests/Builder/CreateStatementTest.php | 28 | ||||
-rw-r--r-- | tests/Components/ArrayObjTest.php | 17 | ||||
-rw-r--r-- | tests/Components/PartitionDefinitionTest.php | 24 | ||||
-rw-r--r-- | tests/Parser/CreateStatementTest.php | 1 | ||||
-rw-r--r-- | tests/data/parser/parseCreateTable4.in | 21 | ||||
-rw-r--r-- | tests/data/parser/parseCreateTable4.out | 61 |
9 files changed, 180 insertions, 10 deletions
diff --git a/src/Components/ArrayObj.php b/src/Components/ArrayObj.php index 431ed6d..0e0b183 100644 --- a/src/Components/ArrayObj.php +++ b/src/Components/ArrayObj.php @@ -115,7 +115,11 @@ class ArrayObj extends Component $ret->values[] = $token->value; $ret->raw[] = $token->token; } else { - $ret[] = $options['type']::parse($parser, $list); + $ret[] = $options['type']::parse( + $parser, + $list, + empty($options['typeOptions']) ? array() : $options['typeOptions'] + ); } $state = 2; } elseif ($state === 2) { diff --git a/src/Components/PartitionDefinition.php b/src/Components/PartitionDefinition.php index c7546b0..c46252d 100644 --- a/src/Components/PartitionDefinition.php +++ b/src/Components/PartitionDefinition.php @@ -155,7 +155,18 @@ class PartitionDefinition extends Component $ret->type = $token->value; $state = 4; } elseif ($state === 4) { - $ret->expr = Expression::parse($parser, $list, array('noAlias' => true, 'bracketsDelimited' => true)); + if ($token->value === 'MAXVALUE') { + $ret->expr = $token->value; + } else { + $ret->expr = Expression::parse( + $parser, + $list, + array( + 'bracketsDelimited' => true, + 'noAlias' => true, + ) + ); + } $state = 5; } elseif ($state === 5) { $ret->options = OptionsArray::parse($parser, $list, static::$OPTIONS); @@ -166,12 +177,12 @@ class PartitionDefinition extends Component $parser, $list, array( - 'type' => 'SqlParser\Components\PartitionDefinition' + 'type' => 'SqlParser\\Components\\PartitionDefinition' ) ); - } else { - break; + ++$list->idx; } + break; } } @@ -196,11 +207,10 @@ class PartitionDefinition extends Component if ($component->isSubpartition) { return 'SUBPARTITION ' . $component->name; } else { - if (!empty($component->subpartitions)) { - $subpartitions = ' ' . PartitionDefinition::build($component->subpartitions); - } + $subpartitions = empty($component->subpartitions) + ? '' : ' ' . PartitionDefinition::build($component->subpartitions); return 'PARTITION ' . $component->name - . ' VALUES ' . $component->type . $component->expr + . ' VALUES ' . $component->type . ' ' . $component->expr . $subpartitions; } diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php index 0f2e565..bc7cf73 100644 --- a/src/Statements/CreateStatement.php +++ b/src/Statements/CreateStatement.php @@ -421,9 +421,11 @@ class CreateStatement extends Statement $brackets = false; } elseif (($token->type === Token::TYPE_KEYWORD) && ($token->value === 'PARTITIONS')) { $token = $list->getNextOfType(Token::TYPE_NUMBER); + --$list->idx; // `getNextOfType` also advances one position. $this->partitionsNum = $token->value; } elseif (($token->type === Token::TYPE_KEYWORD) && ($token->value === 'SUBPARTITIONS')) { $token = $list->getNextOfType(Token::TYPE_NUMBER); + --$list->idx; // `getNextOfType` also advances one position. $this->subpartitionsNum = $token->value; } elseif (!empty($field)) { @@ -457,7 +459,9 @@ class CreateStatement extends Statement $this->partitions = ArrayObj::parse( $parser, $list, - array('type' => 'SqlParser\Components\PartitionDefinition') + array( + 'type' => 'SqlParser\\Components\\PartitionDefinition' + ) ); } break; diff --git a/tests/Builder/CreateStatementTest.php b/tests/Builder/CreateStatementTest.php index 944cbe4..418a0ba 100644 --- a/tests/Builder/CreateStatementTest.php +++ b/tests/Builder/CreateStatementTest.php @@ -65,6 +65,34 @@ class CreateStatementTest extends TestCase ); } + public function testBuilderPartitions() + { + $query = 'CREATE TABLE ts (' . "\n" + . '`id` INT,' . "\n" + . '`purchased` DATE' . "\n" + . ') ' . "\n" + . 'PARTITION BY RANGE(YEAR(purchased))' . "\n" + . 'PARTITIONS 3' . "\n" + . 'SUBPARTITION BY HASH(TO_DAYS(purchased))' . "\n" + . 'SUBPARTITIONS 2' . "\n" + . '(' . "\n" + . 'PARTITION p0 VALUES LESS THAN (1990) (' . "\n" + . 'SUBPARTITION s0,' . "\n" + . 'SUBPARTITION s1' . "\n" + . '),' . "\n" + . 'PARTITION p1 VALUES LESS THAN (2000) (' . "\n" + . 'SUBPARTITION s2,' . "\n" + . 'SUBPARTITION s3' . "\n" + . '),' . "\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()); + } + public function testBuilderView() { $parser = new Parser( diff --git a/tests/Components/ArrayObjTest.php b/tests/Components/ArrayObjTest.php index 13be866..00321ed 100644 --- a/tests/Components/ArrayObjTest.php +++ b/tests/Components/ArrayObjTest.php @@ -2,6 +2,7 @@ namespace SqlParser\Tests\Components; +use SqlParser\Parser; use SqlParser\Components\ArrayObj; use SqlParser\Tests\TestCase; @@ -21,6 +22,22 @@ class ArrayObjTest extends TestCase $this->assertEquals('(a, b)', ArrayObj::build($component)); } + public function testParseType() + { + $components = ArrayObj::parse( + new Parser(), + $this->getTokensList('(1 + 2, 3 + 4)'), + array( + 'type' => 'SqlParser\\Components\\Expression', + 'typeOptions' => array( + 'noBrackets' => true, + ), + ) + ); + $this->assertEquals($components[0]->expr, '1 + 2'); + $this->assertEquals($components[1]->expr, '3 + 4'); + } + /** * @dataProvider testParseProvider */ diff --git a/tests/Components/PartitionDefinitionTest.php b/tests/Components/PartitionDefinitionTest.php new file mode 100644 index 0000000..9a1819c --- /dev/null +++ b/tests/Components/PartitionDefinitionTest.php @@ -0,0 +1,24 @@ +<?php + +namespace SqlParser\Tests\Components; + +use SqlParser\Parser; +use SqlParser\Components\PartitionDefinition; + +use SqlParser\Tests\TestCase; + +class PartitionDefinitionTest extends TestCase +{ + + public function testParse() + { + $component = PartitionDefinition::parse( + new Parser(), + $this->getTokensList('PARTITION p0 VALUES LESS THAN(1990)') + ); + $this->assertFalse($component->isSubpartition); + $this->assertEquals('p0', $component->name); + $this->assertEquals('LESS THAN', $component->type); + $this->assertEquals('(1990)', $component->expr->expr); + } +} diff --git a/tests/Parser/CreateStatementTest.php b/tests/Parser/CreateStatementTest.php index 4cab8ae..bbbb097 100644 --- a/tests/Parser/CreateStatementTest.php +++ b/tests/Parser/CreateStatementTest.php @@ -26,6 +26,7 @@ class CreateStatementTest extends TestCase array('parser/parseCreateTable'), array('parser/parseCreateTable2'), array('parser/parseCreateTable3'), + array('parser/parseCreateTable4'), array('parser/parseCreateTableErr1'), array('parser/parseCreateTableErr2'), array('parser/parseCreateTrigger'), diff --git a/tests/data/parser/parseCreateTable4.in b/tests/data/parser/parseCreateTable4.in new file mode 100644 index 0000000..1e8552c --- /dev/null +++ b/tests/data/parser/parseCreateTable4.in @@ -0,0 +1,21 @@ +CREATE TABLE ts(id INT, purchased DATE) +PARTITION BY /* comment */ RANGE(YEAR(purchased)) +PARTITIONS 3 +SUBPARTITION BY HASH(TO_DAYS(purchased)) +SUBPARTITIONS 2( +PARTITION p0 +VALUES LESS THAN(1990)( + SUBPARTITION s0, + SUBPARTITION s1 +), +PARTITION p1 +VALUES LESS THAN(2000)( + SUBPARTITION s2, + SUBPARTITION s3 +), +PARTITION p2 +VALUES LESS THAN MAXVALUE( + SUBPARTITION s4, + SUBPARTITION s5 +) +);
\ No newline at end of file diff --git a/tests/data/parser/parseCreateTable4.out b/tests/data/parser/parseCreateTable4.out new file mode 100644 index 0000000..773c6ef --- /dev/null +++ b/tests/data/parser/parseCreateTable4.out @@ -0,0 +1,61 @@ +a:4:{s:5:"query";s:408:"CREATE TABLE ts(id INT, purchased DATE) +PARTITION BY /* comment */ RANGE(YEAR(purchased)) +PARTITIONS 3 +SUBPARTITION BY HASH(TO_DAYS(purchased)) +SUBPARTITIONS 2( +PARTITION p0 +VALUES LESS THAN(1990)( + SUBPARTITION s0, + SUBPARTITION s1 +), +PARTITION p1 +VALUES LESS THAN(2000)( + SUBPARTITION s2, + SUBPARTITION s3 +), +PARTITION p2 +VALUES LESS THAN MAXVALUE( + SUBPARTITION s4, + SUBPARTITION s5 +) +);";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:408:"CREATE TABLE ts(id INT, purchased DATE) +PARTITION BY /* comment */ RANGE(YEAR(purchased)) +PARTITIONS 3 +SUBPARTITION BY HASH(TO_DAYS(purchased)) +SUBPARTITIONS 2( +PARTITION p0 +VALUES LESS THAN(1990)( + SUBPARTITION s0, + SUBPARTITION s1 +), +PARTITION p1 +VALUES LESS THAN(2000)( + SUBPARTITION s2, + SUBPARTITION s3 +), +PARTITION p2 +VALUES LESS THAN MAXVALUE( + SUBPARTITION s4, + SUBPARTITION s5 +) +);";s:3:"len";i:408;s:4:"last";i:408;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:120:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"CREATE";s:5:"value";s:6:"CREATE";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:6;}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:7;}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:12;}i:4;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"ts";s:5:"value";s:2:"ts";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:13;}i:5;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:15;}i:6;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:16;}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:18;}i:8;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:19;}i:9;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:22;}i:10;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:11;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"purchased";s:5:"value";s:9:"purchased";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:24;}i:12;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:33;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"DATE";s:5:"value";s:4:"DATE";s:4:"type";i:1;s:5:"flags";i:41;s:8:"position";i:34;}i:14;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:38;}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:39;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:12:"PARTITION BY";s:5:"value";s:12:"PARTITION BY";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:40;}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:13:"/* comment */";s:5:"value";s:13:"/* comment */";s:4:"type";i:4;s:5:"flags";i:2;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:66;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"RANGE";s:5:"value";s:5:"RANGE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:67;}i:21;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:72;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"YEAR";s:5:"value";s:4:"YEAR";s:4:"type";i:1;s:5:"flags";i:41;s:8:"position";i:73;}i:23;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:77;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"purchased";s:5:"value";s:9:"purchased";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:78;}i:25;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:87;}i:26;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:88;}i:27;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:89;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"PARTITIONS";s:5:"value";s:10:"PARTITIONS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:90;}i:29;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:100;}i:30;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"3";s:5:"value";i:3;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:101;}i:31;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:102;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:15:"SUBPARTITION BY";s:5:"value";s:15:"SUBPARTITION BY";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:103;}i:33;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:118;}i:34;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"HASH";s:5:"value";s:4:"HASH";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:119;}i:35;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:123;}i:36;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"TO_DAYS";s:5:"value";s:7:"TO_DAYS";s:4:"type";i:1;s:5:"flags";i:33;s:8:"position";i:124;}i:37;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:131;}i:38;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"purchased";s:5:"value";s:9:"purchased";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:132;}i:39;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:141;}i:40;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:142;}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:143;}i:42;O:15:"SqlParser\Token":5:{s:5:"token";s:13:"SUBPARTITIONS";s:5:"value";s:13:"SUBPARTITIONS";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:144;}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:157;}i:44;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:158;}i:45;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:159;}i:46;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:160;}i:47;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"PARTITION";s:5:"value";s:9:"PARTITION";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:161;}i:48;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:170;}i:49;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"p0";s:5:"value";s:2:"p0";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:171;}i:50;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:173;}i:51;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"VALUES";s:5:"value";s:6:"VALUES";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:174;}i:52;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:180;}i:53;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"LESS THAN";s:5:"value";s:9:"LESS THAN";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:181;}i:54;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:190;}i:55;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"1990";s:5:"value";i:1990;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:191;}i:56;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:195;}i:57;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:196;}i:58;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" + ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:197;}i:59;O:15:"SqlParser\Token":5:{s:5:"token";s:12:"SUBPARTITION";s:5:"value";s:12:"SUBPARTITION";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:202;}i:60;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:214;}i:61;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"s0";s:5:"value";s:2:"s0";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:215;}i:62;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:217;}i:63;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" + ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:218;}i:64;O:15:"SqlParser\Token":5:{s:5:"token";s:12:"SUBPARTITION";s:5:"value";s:12:"SUBPARTITION";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:223;}i:65;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:235;}i:66;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"s1";s:5:"value";s:2:"s1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:236;}i:67;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:238;}i:68;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:239;}i:69;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:240;}i:70;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:241;}i:71;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"PARTITION";s:5:"value";s:9:"PARTITION";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:242;}i:72;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:251;}i:73;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"p1";s:5:"value";s:2:"p1";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:252;}i:74;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:254;}i:75;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"VALUES";s:5:"value";s:6:"VALUES";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:255;}i:76;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:261;}i:77;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"LESS THAN";s:5:"value";s:9:"LESS THAN";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:262;}i:78;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:271;}i:79;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"2000";s:5:"value";i:2000;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:272;}i:80;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:276;}i:81;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:277;}i:82;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" + ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:278;}i:83;O:15:"SqlParser\Token":5:{s:5:"token";s:12:"SUBPARTITION";s:5:"value";s:12:"SUBPARTITION";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:283;}i:84;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:295;}i:85;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"s2";s:5:"value";s:2:"s2";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:296;}i:86;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:298;}i:87;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" + ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:299;}i:88;O:15:"SqlParser\Token":5:{s:5:"token";s:12:"SUBPARTITION";s:5:"value";s:12:"SUBPARTITION";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:304;}i:89;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:316;}i:90;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"s3";s:5:"value";s:2:"s3";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:317;}i:91;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:319;}i:92;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:320;}i:93;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:321;}i:94;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:322;}i:95;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"PARTITION";s:5:"value";s:9:"PARTITION";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:323;}i:96;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:332;}i:97;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"p2";s:5:"value";s:2:"p2";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:333;}i:98;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:335;}i:99;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"VALUES";s:5:"value";s:6:"VALUES";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:336;}i:100;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:342;}i:101;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"LESS THAN";s:5:"value";s:9:"LESS THAN";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:343;}i:102;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:352;}i:103;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"MAXVALUE";s:5:"value";s:8:"MAXVALUE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:353;}i:104;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:361;}i:105;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" + ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:362;}i:106;O:15:"SqlParser\Token":5:{s:5:"token";s:12:"SUBPARTITION";s:5:"value";s:12:"SUBPARTITION";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:367;}i:107;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:379;}i:108;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"s4";s:5:"value";s:2:"s4";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:380;}i:109;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:382;}i:110;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" + ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:383;}i:111;O:15:"SqlParser\Token":5:{s:5:"token";s:12:"SUBPARTITION";s:5:"value";s:12:"SUBPARTITION";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:388;}i:112;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:400;}i:113;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"s5";s:5:"value";s:2:"s5";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:401;}i:114;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:403;}i:115;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:404;}i:116;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:405;}i:117;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:406;}i:118;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:407;}i:119;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:120;s:3:"idx";i:120;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\CreateStatement":15:{s:4:"name";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:2:"ts";s:6:"column";N;s:4:"expr";s:2:"ts";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:13:"entityOptions";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:6:"fields";a:2:{i:0;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:2:"id";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:3:"INT";s:10:"parameters";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}i:1;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:9:"purchased";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:4:"DATE";s:10:"parameters";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}}s:11:"partitionBy";s:22:"RANGE(YEAR(purchased))";s:13:"partitionsNum";i:3;s:14:"subpartitionBy";s:24:"HASH(TO_DAYS(purchased))";s:16:"subpartitionsNum";i:2;s:10:"partitions";a:3:{i:0;O:40:"SqlParser\Components\PartitionDefinition":6:{s:14:"isSubpartition";b:0;s:4:"name";s:2:"p0";s:4:"type";s:9:"LESS THAN";s:4:"expr";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:6:"(1990)";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:13:"subpartitions";a:2:{i:0;O:40:"SqlParser\Components\PartitionDefinition":6:{s:14:"isSubpartition";b:1;s:4:"name";s:2:"s0";s:4:"type";N;s:4:"expr";N;s:13:"subpartitions";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}i:1;O:40:"SqlParser\Components\PartitionDefinition":6:{s:14:"isSubpartition";b:1;s:4:"name";s:2:"s1";s:4:"type";N;s:4:"expr";N;s:13:"subpartitions";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}i:1;O:40:"SqlParser\Components\PartitionDefinition":6:{s:14:"isSubpartition";b:0;s:4:"name";s:2:"p1";s:4:"type";s:9:"LESS THAN";s:4:"expr";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:6:"(2000)";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:13:"subpartitions";a:2:{i:0;O:40:"SqlParser\Components\PartitionDefinition":6:{s:14:"isSubpartition";b:1;s:4:"name";s:2:"s2";s:4:"type";N;s:4:"expr";N;s:13:"subpartitions";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}i:1;O:40:"SqlParser\Components\PartitionDefinition":6:{s:14:"isSubpartition";b:1;s:4:"name";s:2:"s3";s:4:"type";N;s:4:"expr";N;s:13:"subpartitions";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}i:2;O:40:"SqlParser\Components\PartitionDefinition":6:{s:14:"isSubpartition";b:0;s:4:"name";s:2:"p2";s:4:"type";s:9:"LESS THAN";s:4:"expr";s:8:"MAXVALUE";s:13:"subpartitions";a:2:{i:0;O:40:"SqlParser\Components\PartitionDefinition":6:{s:14:"isSubpartition";b:1;s:4:"name";s:2:"s4";s:4:"type";N;s:4:"expr";N;s:13:"subpartitions";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}i:1;O:40:"SqlParser\Components\PartitionDefinition":6:{s:14:"isSubpartition";b:1;s:4:"name";s:2:"s5";s:4:"type";N;s:4:"expr";N;s:13:"subpartitions";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}}s:5:"table";N;s:6:"return";N;s:10:"parameters";N;s:4:"body";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:6;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:117;}}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}
\ No newline at end of file |