summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Ungureanu <udan1107@gmail.com>2015-08-16 02:48:03 +0300
committerDan Ungureanu <udan1107@gmail.com>2015-08-16 02:48:03 +0300
commit2c1124c25a74191f4c3bf095238a0a732bfd8a9e (patch)
tree30ca07e0d1b37a0a567d6be5fabe9bffe2d8a594
parent3cbebbe741f4bab1ce4790daa34d4cdd8bf36a25 (diff)
downloadsql-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.php6
-rw-r--r--src/Components/PartitionDefinition.php26
-rw-r--r--src/Statements/CreateStatement.php6
-rw-r--r--tests/Builder/CreateStatementTest.php28
-rw-r--r--tests/Components/ArrayObjTest.php17
-rw-r--r--tests/Components/PartitionDefinitionTest.php24
-rw-r--r--tests/Parser/CreateStatementTest.php1
-rw-r--r--tests/data/parser/parseCreateTable4.in21
-rw-r--r--tests/data/parser/parseCreateTable4.out61
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