diff options
author | Dan Ungureanu <udan1107@gmail.com> | 2015-06-24 19:11:54 +0300 |
---|---|---|
committer | Dan Ungureanu <udan1107@gmail.com> | 2015-06-24 19:11:54 +0300 |
commit | 0868a8636724cb3e1f961ff3246e4734a35e032c (patch) | |
tree | 584afee1b94ab465c6c9d58ce4a96a6ca5bbd7e2 /src | |
parent | 2915c61f6338143e5196373eb0e9978962a74c85 (diff) | |
download | sql-parser-0868a8636724cb3e1f961ff3246e4734a35e032c.zip sql-parser-0868a8636724cb3e1f961ff3246e4734a35e032c.tar.gz sql-parser-0868a8636724cb3e1f961ff3246e4734a35e032c.tar.bz2 |
Simplified parsing process.
Diffstat (limited to 'src')
-rw-r--r-- | src/Contexts/ContextMySql50000.php | 2 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50100.php | 2 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50500.php | 2 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50600.php | 2 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50700.php | 2 | ||||
-rw-r--r-- | src/Parser.php | 90 | ||||
-rw-r--r-- | src/Statement.php | 73 |
7 files changed, 108 insertions, 65 deletions
diff --git a/src/Contexts/ContextMySql50000.php b/src/Contexts/ContextMySql50000.php index f2357f2..63f4ca2 100644 --- a/src/Contexts/ContextMySql50000.php +++ b/src/Contexts/ContextMySql50000.php @@ -159,6 +159,8 @@ class ContextMySql50000 extends Context 'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5, 'DEFAULT CHARACTER SET' => 5, + 'GROUP BY' => 7, 'ORDER BY' => 7, + 'XML' => 9, 'DATE' => 9, 'ENUM' => 9, 'TEXT' => 9, 'TIME' => 9, 'YEAR' => 9, 'ARRAY' => 9, diff --git a/src/Contexts/ContextMySql50100.php b/src/Contexts/ContextMySql50100.php index dcdce84..265979f 100644 --- a/src/Contexts/ContextMySql50100.php +++ b/src/Contexts/ContextMySql50100.php @@ -173,6 +173,8 @@ class ContextMySql50100 extends Context 'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5, 'DEFAULT CHARACTER SET' => 5, + 'GROUP BY' => 7, 'ORDER BY' => 7, + 'XML' => 9, 'DATE' => 9, 'ENUM' => 9, 'TEXT' => 9, 'TIME' => 9, 'YEAR' => 9, 'ARRAY' => 9, diff --git a/src/Contexts/ContextMySql50500.php b/src/Contexts/ContextMySql50500.php index 15e079e..3a5496a 100644 --- a/src/Contexts/ContextMySql50500.php +++ b/src/Contexts/ContextMySql50500.php @@ -176,6 +176,8 @@ class ContextMySql50500 extends Context 'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5, 'DEFAULT CHARACTER SET' => 5, + 'GROUP BY' => 7, 'ORDER BY' => 7, + 'XML' => 9, 'DATE' => 9, 'ENUM' => 9, 'TEXT' => 9, 'TIME' => 9, 'YEAR' => 9, 'ARRAY' => 9, diff --git a/src/Contexts/ContextMySql50600.php b/src/Contexts/ContextMySql50600.php index 1135e52..d9fcf71 100644 --- a/src/Contexts/ContextMySql50600.php +++ b/src/Contexts/ContextMySql50600.php @@ -187,6 +187,8 @@ class ContextMySql50600 extends Context 'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5, 'DEFAULT CHARACTER SET' => 5, + 'GROUP BY' => 7, 'ORDER BY' => 7, + 'XML' => 9, 'DATE' => 9, 'ENUM' => 9, 'TEXT' => 9, 'TIME' => 9, 'YEAR' => 9, 'ARRAY' => 9, diff --git a/src/Contexts/ContextMySql50700.php b/src/Contexts/ContextMySql50700.php index 799ae1b..808de0d 100644 --- a/src/Contexts/ContextMySql50700.php +++ b/src/Contexts/ContextMySql50700.php @@ -192,6 +192,8 @@ class ContextMySql50700 extends Context 'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5, 'DEFAULT CHARACTER SET' => 5, + 'GROUP BY' => 7, 'ORDER BY' => 7, + 'XML' => 9, 'DATE' => 9, 'ENUM' => 9, 'TEXT' => 9, 'TIME' => 9, 'YEAR' => 9, 'ARRAY' => 9, diff --git a/src/Parser.php b/src/Parser.php index 2973a03..a5fe233 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -56,32 +56,70 @@ class Parser */ public static $KEYWORD_PARSERS = array( - // Meta-keywords. - /* - '_ARRAY' => 'SqlParser\\Fragments\\ArrayFragment', - '_CALL' => 'SqlParser\\Fragments\\CallKeyword', - '_CREATE_DEF' => 'SqlParser\\Fragments\\CreateDefFragment', - '_DATA_TYPE' => 'SqlParser\\Fragments\\DataTypeFragment', - '_FIELD' => 'SqlParser\\Fragments\\FieldFragment', - '_FIELD_DEF' => 'SqlParser\\Fragments\\FieldDefFragment', - '_PARAM_DEF' => 'SqlParser\\Fragments\\ParamDefFragment', - '_OPTIONS' => 'SqlParser\\Fragments\\OptionsFragment', - '_RENAME' => 'SqlParser\\Fragments\\RenameKeyword', - '_SELECT' => 'SqlParser\\Fragments\\SelectKeyword', - */ - - 'FROM' => 'SqlParser\\Fragments\\FromKeyword', - 'GROUP' => 'SqlParser\\Fragments\\OrderKeyword', - 'HAVING' => 'SqlParser\\Fragments\\WhereKeyword', - 'INTO' => 'SqlParser\\Fragments\\IntoKeyword', - 'JOIN' => 'SqlParser\\Fragments\\JoinKeyword', - 'LIMIT' => 'SqlParser\\Fragments\\LimitKeyword', - 'ORDER' => 'SqlParser\\Fragments\\OrderKeyword', - 'PARTITION' => 'SqlParser\\Fragments\\ArrayFragment', - 'SET' => 'SqlParser\\Fragments\\SetKeyword', - 'VALUE' => 'SqlParser\\Fragments\\ValuesKeyword', - 'VALUES' => 'SqlParser\\Fragments\\ValuesKeyword', - 'WHERE' => 'SqlParser\\Fragments\\WhereKeyword', + 'CALL' => array( + 'class' => 'SqlParser\\Fragments\\CallKeyword', + 'field' => 'call', + ), + 'FROM' => array( + 'class' => 'SqlParser\\Fragments\\FromKeyword', + 'field' => 'from', + ), + 'GROUP BY' => array( + 'class' => 'SqlParser\\Fragments\\OrderKeyword', + 'field' => 'group', + ), + 'HAVING' => array( + 'class' => 'SqlParser\\Fragments\\WhereKeyword', + 'field' => 'having', + ), + 'INTO' => array( + 'class' => 'SqlParser\\Fragments\\IntoKeyword', + 'field' => 'into', + ), + 'JOIN' => array( + 'class' => 'SqlParser\\Fragments\\JoinKeyword', + 'field' => 'join', + ), + 'LIMIT' => array( + 'class' => 'SqlParser\\Fragments\\LimitKeyword', + 'field' => 'limit', + ), + 'ORDER BY' => array( + 'class' => 'SqlParser\\Fragments\\OrderKeyword', + 'field' => 'order', + ), + 'PARTITION' => array( + 'class' => 'SqlParser\\Fragments\\ArrayFragment', + 'field' => 'partition', + ), + 'RENAME' => array( + 'class' => 'SqlParser\\Fragments\\RenameKeyword', + 'field' => 'renames', + ), + 'SET' => array( + 'class' => 'SqlParser\\Fragments\\SetKeyword', + 'field' => 'set', + ), + 'SELECT' => array( + 'class' => 'SqlParser\\Fragments\\SelectKeyword', + 'field' => 'expr', + ), + 'UPDATE' => array( + 'class' => 'SqlParser\\Fragments\\FromKeyword', + 'field' => 'from', + ), + 'VALUE' => array( + 'class' => 'SqlParser\\Fragments\\ValuesKeyword', + 'field' => 'values', + ), + 'VALUES' => array( + 'class' => 'SqlParser\\Fragments\\ValuesKeyword', + 'field' => 'values', + ), + 'WHERE' => array( + 'class' => 'SqlParser\\Fragments\\WhereKeyword', + 'field' => 'where', + ), ); diff --git a/src/Statement.php b/src/Statement.php index 13002f4..edbb19e 100644 --- a/src/Statement.php +++ b/src/Statement.php @@ -50,6 +50,15 @@ abstract class Statement */ public function parse(Parser $parser, TokensList $list) { + + /** + * Whether otpions were parsed or not. + * For statements that do not have any options this is set to `true` by + * default. + * @var bool + */ + $parsedOptions = isset(static::$OPTIONS) ? false : true; + for (; $list->idx < $list->count; ++$list->idx) { /** @@ -75,12 +84,29 @@ abstract class Statement */ $class = null; + /** + * The name of the field where the result of the parsing is stored. + * @var string + */ + $field = null; + if (!empty(Parser::$KEYWORD_PARSERS[$token->value])) { - $class = Parser::$KEYWORD_PARSERS[$token->value]; - } elseif (!empty(Parser::$STATEMENT_PARSERS[$token->value])) { - // The keyword we are processing right now is the beginning of a - // statement and they are usually handled differently. - } else { + $class = Parser::$KEYWORD_PARSERS[$token->value]['class']; + $field = Parser::$KEYWORD_PARSERS[$token->value]['field']; + } + + if (!empty(Parser::$STATEMENT_PARSERS[$token->value])) { + if (!$parsedOptions) { + ++$list->idx; // Skipping keyword. + $this->options = OptionsFragment::parse( + $parser, $list, + static::$OPTIONS + ); + $parsedOptions = true; + } + } else if ($class === null) { + // There is no parser for this keyword and isn't the beggining + // of a statement (so no options) either. $parser->error( 'Unrecognized keyword "' . $token->value . '".', $token @@ -88,26 +114,8 @@ abstract class Statement continue; } - /** - * The name of the field where the result is stored. - * @var string - */ - $field = strtolower($token->value); - - // Parsing options. - if (($class == null) && (isset(static::$OPTIONS))) { - ++$list->idx; // Skipping keyword. - $this->options = OptionsFragment::parse( - $parser, $list, - static::$OPTIONS - ); - } - - // Keyword specific code. - if ($token->value === 'CALL') { - ++$list->idx; - $this->call = CallKeyword::parse($parser, $list); - } elseif ($token->value === 'CREATE') { + // Special cases. + if ($token->value === 'CREATE') { ++$list->idx; $this->name = CreateDefFragment::parse($parser, $list); if ($this->options->has('TABLE')) { @@ -158,23 +166,10 @@ abstract class Statement } $class = null; // The statement has been processed here. } - } elseif (($token->value === 'GROUP') - || ($token->value === 'ORDER') - ) { - $list->getNextOfTypeAndValue(Token::TYPE_KEYWORD, 'BY'); - } elseif ($token->value === 'RENAME') { + } else if ($token->value === 'RENAME') { $list->getNextOfTypeAndValue(Token::TYPE_KEYWORD, 'TABLE'); - ++$list->idx; - $this->renames = RenameKeyword::parse($parser, $list); - } elseif ($token->value === 'SELECT') { - ++$list->idx; // Skipping last option. - $this->expr = SelectKeyword::parse($parser, $list); - } elseif ($token->value === 'UPDATE') { - ++$list->idx; // Skipping last option. - $this->from = FromKeyword::parse($parser, $list); } - // Finally, processing the keyword (if possible). if ($class !== null) { ++$list->idx; // Skipping keyword. $this->$field = $class::parse($parser, $list, array()); |