diff options
author | Michal Čihař <michal@cihar.com> | 2016-03-19 18:19:09 +0100 |
---|---|---|
committer | Michal Čihař <michal@cihar.com> | 2016-03-19 18:19:09 +0100 |
commit | 9d8ae92a7c9e489eac4c7e4fb67b90c4f7a145b2 (patch) | |
tree | f89e1e2a3dc087b494420425ecc4152325764970 /src | |
parent | 09acfe4d548c6209478cc6e7bbf4c3e28c08a1fe (diff) | |
download | sql-parser-9d8ae92a7c9e489eac4c7e4fb67b90c4f7a145b2.zip sql-parser-9d8ae92a7c9e489eac4c7e4fb67b90c4f7a145b2.tar.gz sql-parser-9d8ae92a7c9e489eac4c7e4fb67b90c4f7a145b2.tar.bz2 |
Properly parse CREATE TABLE [AS] SELECT
Fixes https://github.com/phpmyadmin/phpmyadmin/issues/12109
Signed-off-by: Michal Čihař <michal@cihar.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/Statements/CreateStatement.php | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php index 83c856c..3ccf78f 100644 --- a/src/Statements/CreateStatement.php +++ b/src/Statements/CreateStatement.php @@ -19,6 +19,7 @@ use SqlParser\Components\PartitionDefinition; use SqlParser\Components\Expression; use SqlParser\Components\OptionsArray; use SqlParser\Components\ParameterDefinition; +use SqlParser\Statements\SelectStatement; /** * `CREATE` statement. @@ -178,6 +179,15 @@ class CreateStatement extends Statement public $fields; /** + * If `CREATE TABLE ... SELECT` + * + * Used by `CREATE TABLE` + * + * @var SelectStatement + */ + public $select; + + /** * Expression used for partitioning. * * @var string @@ -267,6 +277,11 @@ class CreateStatement extends Statement . OptionsArray::build($this->options) . ' ' . Expression::build($this->name) . ' ' . OptionsArray::build($this->entityOptions); + } elseif ($this->options->has('TABLE') && !is_null($this->select)) { + return 'CREATE ' + . OptionsArray::build($this->options) . ' ' + . Expression::build($this->name) . ' ' + . $this->select->build(); } elseif ($this->options->has('TABLE')) { $partition = ''; @@ -357,12 +372,34 @@ class CreateStatement extends Statement ++$list->idx; // Skipping field. } + /** + * Token parsed at this moment. + * + * @var Token $token + */ + $token = $list->tokens[$list->idx]; + $nextidx = $list->idx + 1; + while ($nextidx < $list->count && $list->tokens[$nextidx]->type == Token::TYPE_WHITESPACE) { + $nextidx++; + } + if ($this->options->has('DATABASE')) { $this->entityOptions = OptionsArray::parse( $parser, $list, static::$DB_OPTIONS ); + } elseif ($this->options->has('TABLE') && ($token->type == Token::TYPE_KEYWORD) && ($token->value == 'SELECT')) { + /* CREATE TABLE ... SELECT */ + $this->select = new SelectStatement($parser, $list); + } elseif ( + $this->options->has('TABLE') && + ($token->type == Token::TYPE_KEYWORD) && ($token->value == 'AS') && + ($list->tokens[$nextidx]->type == Token::TYPE_KEYWORD) && ($list->tokens[$nextidx]->value == 'SELECT') + ) { + /* CREATE TABLE ... AS SELECT */ + $list->idx = $nextidx; + $this->select = new SelectStatement($parser, $list); } elseif ($this->options->has('TABLE')) { $this->fields = CreateDefinition::parse($parser, $list); if (empty($this->fields)) { |