diff options
author | Dan Ungureanu <udan1107@gmail.com> | 2015-08-15 23:41:06 +0300 |
---|---|---|
committer | Dan Ungureanu <udan1107@gmail.com> | 2015-08-15 23:41:06 +0300 |
commit | 7429471b1724f8e324154aee7c6f939c404eb114 (patch) | |
tree | 9520d3f5c3014b31ba78377a10e6aeea8a77728a | |
parent | 7d3b89b73e4ca763c02947163ec592eb03c4a527 (diff) | |
download | sql-parser-7429471b1724f8e324154aee7c6f939c404eb114.zip sql-parser-7429471b1724f8e324154aee7c6f939c404eb114.tar.gz sql-parser-7429471b1724f8e324154aee7c6f939c404eb114.tar.bz2 |
Added missing partition definition.
-rw-r--r-- | src/Components/PartitionDefinition.php | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/Components/PartitionDefinition.php b/src/Components/PartitionDefinition.php new file mode 100644 index 0000000..b94134a --- /dev/null +++ b/src/Components/PartitionDefinition.php @@ -0,0 +1,181 @@ +<?php + +/** + * Parses the create definition of a partition. + * + * Used for parsing `CREATE TABLE` statement. + * + * @package SqlParser + * @subpackage Components + */ +namespace SqlParser\Components; + +use SqlParser\Context; +use SqlParser\Component; +use SqlParser\Parser; +use SqlParser\Token; +use SqlParser\TokensList; + +/** + * Parses the create definition of a partition. + * + * Used for parsing `CREATE TABLE` statement. + * + * @category Components + * @package SqlParser + * @subpackage Components + * @author Dan Ungureanu <udan1107@gmail.com> + * @license http://opensource.org/licenses/GPL-2.0 GNU Public License + */ +class PartitionDefinition extends Component +{ + + /** + * All field options. + * + * @var array + */ + public static $OPTIONS = array( + 'STORAGE' => array(1, 'var'), + 'STORAGE ENGINE' => array(1, 'var'), + 'COMMENT' => array(2, 'var'), + 'DATA DIRECTORY' => array(3, 'var'), + 'INDEX DIRECTORY' => array(4, 'var'), + 'MAX_ROWS' => array(5, 'var'), + 'MIN_ROWS' => array(6, 'var'), + 'TABLESPACE' => array(7, 'var'), + 'NODEGROUP' => array(8, 'var'), + ); + + /** + * Whether this entry is a subpartition or a partition. + * + * @var bool + */ + public $isSubpartition; + + /** + * The name of this partition. + * + * @var string + */ + public $name; + + /** + * The type of this partition (what follows the `VALUES` keyword). + * + * @var string + */ + public $type; + + /** + * The expression used to defined this partition. + * + * @var Expression + */ + public $expr; + + /** + * The subpartitions of this partition. + * + * @var PartitionDefinition[] + */ + public $subpartitions; + + /** + * The options of this field. + * + * @var OptionsArray + */ + public $options; + + /** + * @param Parser $parser The parser that serves as context. + * @param TokensList $list The list of tokens that are being parsed. + * @param array $options Parameters for parsing. + * + * @return PartitionDefinition + */ + public static function parse(Parser $parser, TokensList $list, array $options = array()) + { + $ret = new PartitionDefinition(); + + /** + * The state of the parser. + * + * Below are the states of the parser. + * + * 0 -------------[ PARTITION | SUBPARTITION ]------------> 1 + * + * 1 -----------------------[ name ]----------------------> 2 + * + * 2 ----------------------[ VALUES ]---------------------> 3 + * + * 3 ---------------------[ LESS THAN ]-------------------> 4 + * 3 ------------------------[ IN ]-----------------------> 4 + * + * 4 -----------------------[ expr ]----------------------> 5 + * + * 5 ----------------------[ options ]--------------------> 6 + * + * 6 ------------------[ subpartitions ]------------------> (END) + * + * @var int $state + */ + $state = 0; + + for (; $list->idx < $list->count; ++$list->idx) { + + /** + * Token parsed at this moment. + * + * @var Token $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; + } + + if ($state === 0) { + $ret->isSubpartition = ($token->type === Token::TYPE_KEYWORD) && ($token->value === 'SUBPARTITION'); + $state = 1; + } elseif ($state === 1) { + $ret->name = $token->value; + $state = $ret->isSubpartition ? 5 : 2; + } elseif ($state === 2) { + $state = 3; + } elseif ($state === 3) { + $ret->type = $token->value; + $state = 4; + } elseif ($state === 4) { + $ret->expr = Expression::parse($parser, $list, array('noAlias' => true, 'bracketsDelimited' => true)); + $state = 5; + } elseif ($state === 5) { + $ret->options = OptionsArray::parse($parser, $list, static::$OPTIONS); + $state = 6; + } elseif ($state === 6) { + if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '(')) { + $ret->subpartitions = ArrayObj::parse( + $parser, + $list, + array( + 'type' => 'SqlParser\Components\PartitionDefinition' + ) + ); + } else { + break; + } + } + } + + --$list->idx; + return $ret; + } +} |