summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDan Ungureanu <udan1107@gmail.com>2015-06-24 19:11:54 +0300
committerDan Ungureanu <udan1107@gmail.com>2015-06-24 19:11:54 +0300
commit0868a8636724cb3e1f961ff3246e4734a35e032c (patch)
tree584afee1b94ab465c6c9d58ce4a96a6ca5bbd7e2 /src
parent2915c61f6338143e5196373eb0e9978962a74c85 (diff)
downloadsql-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.php2
-rw-r--r--src/Contexts/ContextMySql50100.php2
-rw-r--r--src/Contexts/ContextMySql50500.php2
-rw-r--r--src/Contexts/ContextMySql50600.php2
-rw-r--r--src/Contexts/ContextMySql50700.php2
-rw-r--r--src/Parser.php90
-rw-r--r--src/Statement.php73
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());