diff options
Diffstat (limited to 'src/Statements/CreateStatement.php')
-rw-r--r-- | src/Statements/CreateStatement.php | 143 |
1 files changed, 123 insertions, 20 deletions
diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php index f13866a..7fd8ef0 100644 --- a/src/Statements/CreateStatement.php +++ b/src/Statements/CreateStatement.php @@ -12,9 +12,10 @@ use SqlParser\Parser; use SqlParser\Statement; use SqlParser\Token; use SqlParser\TokensList; -use SqlParser\Fragments\CreateDefFragment; +use SqlParser\Fragments\ArrayFragment; use SqlParser\Fragments\DataTypeFragment; use SqlParser\Fragments\FieldDefFragment; +use SqlParser\Fragments\FieldFragment; use SqlParser\Fragments\OptionsFragment; use SqlParser\Fragments\ParamDefFragment; @@ -49,38 +50,113 @@ class CreateStatement extends Statement 'USER' => 1, 'VIEW' => 1, + // CREATE TABLE 'TEMPORARY' => 2, 'IF NOT EXISTS' => 3, - 'DEFINER' => array(4, 'var'), + + // CREATE FUNCTION / PROCEDURE and CREATE VIEW + 'DEFINER' => array(2, 'var'), + + // CREATE VIEW + 'OR REPLACE' => array(3, 'var'), + 'ALGORITHM' => array(4, 'var'), + 'DEFINER' => array(5, 'var'), + 'SQL SECURITY' => array(6, 'var'), + ); + + /** + * All table options. + * + * @var array + */ + public static $TABLE_OPTIONS = array( + 'ENGINE' => array(1, 'var'), + 'AUTO_INCREMENT' => array(2, 'var'), + 'AVG_ROW_LENGTH' => array(3, 'var'), + 'DEFAULT CHARACTER SET' => array(4, 'var'), + 'CHARACTER SET' => array(4, 'var'), + 'CHECKSUM' => array(5, 'var'), + 'DEFAULT COLLATE' => array(5, 'var'), + 'COLLATE' => array(6, 'var'), + 'COMMENT' => array(7, 'var'), + 'CONNECTION' => array(8, 'var'), + 'DATA DIRECTORY' => array(9, 'var'), + 'DELAY_KEY_WRITE' => array(10, 'var'), + 'INDEX DIRECTORY' => array(11, 'var'), + 'INSERT_METHOD' => array(12, 'var'), + 'KEY_BLOCK_SIZE' => array(13, 'var'), + 'MAX_ROWS' => array(14, 'var'), + 'MIN_ROWS' => array(15, 'var'), + 'PACK_KEYS' => array(16, 'var'), + 'PASSWORD' => array(17, 'var'), + 'ROW_FORMAT' => array(18, 'var'), + 'TABLESPACE' => array(19, 'var'), + 'STORAGE' => array(20, 'var'), + 'UNION' => array(21, 'var'), + ); + + /** + * All function options. + * + * @var array + */ + public static $FUNC_OPTIONS = array( + 'COMMENT' => array(1, 'var'), + 'LANGUAGE SQL' => 2, + 'DETERMINISTIC' => 3, + 'NOT DETERMINISTIC' => 3, + 'CONSTAINS SQL' => 4, + 'NO SQL' => 4, + 'READS SQL DATA' => 4, + 'MODIFIES SQL DATA' => 4, + 'SQL SEQURITY DEFINER' => array(5, 'var'), ); /** - * The name of the enw table. + * The name of the entity that is created. * - * @var CreateDefFragment + * Used by all `CREATE` statements. + * + * @var FieldFragment */ public $name; /** * The options of the entity (table, procedure, function, etc.). * + * Used by `CREATE TABLE`, `CREATE FUNCTION` and `CREATE PROCEDURE`. + * * @var OptionsFragment * - * @see CreateDefFragment::$TABLE_OPTIONS - * @see CreateDefFragment::$FUNC_OPTIONS + * @see static::$TABLE_OPTIONS + * @see static::$FUNC_OPTIONS */ public $entityOptions; /** - * Field created by this statement. + * If `CREATE TABLE`, a list of fields in the new table. + * If `CREATE VIEW`, a list of columns. * - * @var FieldDefFragment[] + * Used by `CREATE TABLE` and `CREATE VIEW`. + * + * @var FieldDefFragment[]|ArrayFragment */ public $fields; /** + * The `SELECT` statement that defines this view. + * + * Used by `CREATE VIEW`. + * + * @var SelectStatement + */ + public $select; + + /** * The return data type of this routine. * + * Used by `CREATE FUNCTION`. + * * @var DataTypeFragment */ public $return; @@ -88,45 +164,59 @@ class CreateStatement extends Statement /** * The parameters of this routine. * + * Used by `CREATE FUNCTION` and `CREATE PROCEDURE`. + * * @var ParamDefFragment[] */ public $parameters; + /** * The body of this function or procedure. * + * Used by `CREATE FUNCTION` and `CREATE PROCEDURE`. + * * @var Token[] */ public $body; /** - * Function called before the token is processed. - * - * Parsing the `CREATE` statement. - * * @param Parser $parser The instance that requests parsing. * @param TokensList $list The list of tokens to be parsed. - * @param Token $token The token that is being parsed. * * @return void */ - public function before(Parser $parser, TokensList $list, Token $token) + public function parse(Parser $parser, TokensList $list) { - ++$list->idx; - $this->name = CreateDefFragment::parse($parser, $list); + ++$list->idx; // Skipping `CREATE`. + + // Parsing options. + $this->options = OptionsFragment::parse($parser, $list, static::$OPTIONS); + ++$list->idx; // Skipping last option. + + // Parsing the field name. + $this->name = FieldFragment::parse( + $parser, + $list, + array( + 'skipColumn' => true, + 'noBrackets' => true, + 'noAlias' => true, + ) + ); + ++$list->idx; // Skipping field. + if ($this->options->has('TABLE')) { - ++$list->idx; $this->fields = FieldDefFragment::parse($parser, $list); ++$list->idx; $this->entityOptions = OptionsFragment::parse( $parser, $list, - CreateDefFragment::$TABLE_OPTIONS + static::$TABLE_OPTIONS ); } elseif (($this->options->has('PROCEDURE')) || ($this->options->has('FUNCTION')) ) { - ++$list->idx; $this->parameters = ParamDefFragment::parse($parser, $list); if ($this->options->has('FUNCTION')) { $token = $list->getNextOfType(Token::TYPE_KEYWORD); @@ -147,7 +237,7 @@ class CreateStatement extends Statement $this->entityOptions = OptionsFragment::parse( $parser, $list, - CreateDefFragment::$FUNC_OPTIONS + static::$FUNC_OPTIONS ); ++$list->idx; $this->body = array(); @@ -160,6 +250,19 @@ class CreateStatement extends Statement break; } } + } else if ($this->options->has('VIEW')) { + $token = $list->getNext(); + + // Parsing columns list. + if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '(')) { + --$list->idx; // getNext() also goes forward one field. + $this->fields = ArrayFragment::parse($parser, $list); + ++$list->idx; // Skipping last token from the array. + $token = $list->getNext(); + } + + // Parsing the 'SELECT' statement. + $this->select = new SelectStatement($parser, $list); } } } |