diff options
author | Dan Ungureanu <udan1107@gmail.com> | 2015-07-02 01:22:45 +0300 |
---|---|---|
committer | Dan Ungureanu <udan1107@gmail.com> | 2015-07-02 01:22:45 +0300 |
commit | fe199733111d7fa2eef929df39c39ee50bb55d89 (patch) | |
tree | 2094d7d916d3e27634a4bdcbb927f726830f8463 | |
parent | 532ada6c8ed9eade76341dc39c99f209192d77e5 (diff) | |
download | sql-parser-fe199733111d7fa2eef929df39c39ee50bb55d89.zip sql-parser-fe199733111d7fa2eef929df39c39ee50bb55d89.tar.gz sql-parser-fe199733111d7fa2eef929df39c39ee50bb55d89.tar.bz2 |
Improved WHERE keyword parser and query's utilities.
-rw-r--r-- | src/Fragments/WhereKeyword.php | 51 | ||||
-rw-r--r-- | src/Utils/Query.php | 83 | ||||
-rw-r--r-- | tests/Utils/QueryTest.php | 6 | ||||
-rw-r--r-- | tests/data/parseArrayErr2.out | 2 | ||||
-rw-r--r-- | tests/data/parseDelete.out | 2 | ||||
-rw-r--r-- | tests/data/parseSelect.out | 2 | ||||
-rw-r--r-- | tests/data/parseSelectErr1.out | 2 | ||||
-rw-r--r-- | tests/data/parseUpdate2.out | 2 |
8 files changed, 82 insertions, 68 deletions
diff --git a/src/Fragments/WhereKeyword.php b/src/Fragments/WhereKeyword.php index 0710738..f5bec24 100644 --- a/src/Fragments/WhereKeyword.php +++ b/src/Fragments/WhereKeyword.php @@ -30,7 +30,14 @@ class WhereKeyword extends Fragment * * @var array */ - public static $OPERATORS = array('&&', '(', ')', 'AND', 'OR', 'XOR', '||'); + public static $OPERATORS = array('&&', 'AND', 'OR', 'XOR', '||'); + + /** + * Identifiers recognized. + * + * @var array + */ + public $identifiers = array(); /** * Whether this fragment is an operator. @@ -67,11 +74,13 @@ class WhereKeyword extends Fragment { $ret = array(); + $expr = new WhereKeyword(); + /** - * The condition that was parsed so far. - * @var string + * Counts brackets. + * @var int */ - $tmp = ''; + $brackets = 0; for (; $list->idx < $list->count; ++$list->idx) { @@ -93,10 +102,10 @@ class WhereKeyword extends Fragment // Conditions are delimited by logical operators. if (in_array($token->value, static::$OPERATORS, true)) { - if (!empty(trim($tmp))) { + $expr->expr = trim($expr->expr); + if (!empty($expr->expr)) { // Adding the condition that is delimited by this operator. - $ret[] = new WhereKeyword($tmp); - $tmp = ''; + $ret[] = $expr; } // Adding the operator. @@ -104,21 +113,39 @@ class WhereKeyword extends Fragment $expr->isOperator = true; $ret[] = $expr; + $expr = new WhereKeyword(); continue; } + if ($token->type === Token::TYPE_OPERATOR) { + if ($token->value === '(') { + ++$brackets; + } elseif ($token->value === ')') { + --$brackets; + } + } + // No keyword is expected. if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { - break; + if ($brackets == 0) { + break; + } } - $tmp .= $token->token; - + $expr->expr .= $token->token; + if (($token->type === Token::TYPE_NONE) + || (($token->type === Token::TYPE_KEYWORD) && (!($token->flags & Token::FLAG_KEYWORD_RESERVED))) + || ($token->type === Token::TYPE_STRING) + || ($token->type === Token::TYPE_SYMBOL) + ) { + $expr->identifiers[] = $token->value; + } } // Last iteration was not processed. - if (!empty(trim($tmp))) { - $ret[] = new WhereKeyword($tmp); + $expr->expr = trim($expr->expr); + if (!empty($expr->expr)) { + $ret[] = $expr; } --$list->idx; diff --git a/src/Utils/Query.php b/src/Utils/Query.php index f973744..11a08d0 100644 --- a/src/Utils/Query.php +++ b/src/Utils/Query.php @@ -8,6 +8,7 @@ */ namespace SqlParser\Utils; +use SqlParser\Lexer; use SqlParser\Parser; use SqlParser\Statement; use SqlParser\Token; @@ -407,32 +408,6 @@ class Query } /** - * Gets the type of clause. - * - * @param string $clause The clause. - * - * @return string - */ - public static function getClauseType($clause) - { - $type = ''; - for ($i = 0, $len = strlen($clause); $i < $len; ++$i) { - if ((empty($type)) && (ctype_space($clause[$i]))) { - // Skipping whitespaces if we haven't started determining the - // type. - continue; - } - if (!ctype_alnum($clause[$i])) { - // The type contains only alphanumeric characters. - break; - } - // Adding character. - $type .= $clause[$i]; - } - return $type; - } - - /** * Gets a specific clause. * * @param Statement $statement The parsed query that has to be modified. @@ -475,10 +450,22 @@ class Query $clauses = array_flip(array_keys($statement::$CLAUSES)); /** + * Lexer used for lexing the clause. + * @var Lexer + */ + $lexer = new Lexer($clause); + + /** + * The type of this clause. + * @var string + */ + $clauseType = $lexer->list->getNextOfType(Token::TYPE_KEYWORD)->value; + + /** * The index of this clause. * @var int */ - $clauseIdx = $clauses[static::getClauseType($clause)]; + $clauseIdx = $clauses[$clauseType]; for ($i = $statement->first; $i <= $statement->last; ++$i) { $token = $list->tokens[$i]; @@ -493,16 +480,15 @@ class Query if ($brackets == 0) { // Checking if we changed sections. - if ($token->type === Token::TYPE_KEYWORD) { - if (isset($clauses[$token->value])) { - if ($clauses[$token->value] >= $currIdx) { - $currIdx = $clauses[$token->value]; - if (($skipFirst) && ($currIdx == $clauseIdx)) { - // This token is skipped (not added to the old - // clause) because it will be replaced. - continue; - } - } + if (($token->type === Token::TYPE_KEYWORD) + && (isset($clauses[$token->value])) + && ($clauses[$token->value] >= $currIdx) + ) { + $currIdx = $clauses[$token->value]; + if (($skipFirst) && ($currIdx == $clauseIdx)) { + // This token is skipped (not added to the old + // clause) because it will be replaced. + continue; } } } @@ -526,25 +512,30 @@ class Query * * @param Statement $statement The parsed query that has to be modified. * @param TokensList $list The list of tokens. - * @param string $clause The clause to be replaced. + * @param string $old The type of the clause that should be + * replaced. This can be an entire clause. + * @param string $new The new clause. If this parameter is omitted + * it is considered to be equal with `$old`. * @param bool $onlyType Whether only the type of the clause should * be replaced or the entire clause. * * @return string */ - public static function replaceClause($statement, $list, $clause, $onlyType = false) + public static function replaceClause($statement, $list, $old, $new = null, $onlyType = false) { // TODO: Update the tokens list and the statement. + if ($new === null) { + $new = $old; + } + if ($onlyType) { - return static::getClause($statement, $list, $clause, -1, false) . ' ' . - $clause . ' ' . - static::getCLause($statement, $list, $clause, 0) . ' ' . - static::getClause($statement, $list, $clause, 1, false); + return static::getClause($statement, $list, $old, -1, false) . ' ' . + $new . ' ' . static::getCLause($statement, $list, $old, 0) . ' ' . + static::getClause($statement, $list, $old, 1, false); } - return static::getClause($statement, $list, $clause, -1, false) . ' ' . - $clause . ' ' . - static::getClause($statement, $list, $clause, 1, false); + return static::getClause($statement, $list, $old, -1, false) . ' ' . + $new . ' ' . static::getClause($statement, $list, $old, 1, false); } } diff --git a/tests/Utils/QueryTest.php b/tests/Utils/QueryTest.php index 5bdd57f..918c5b5 100644 --- a/tests/Utils/QueryTest.php +++ b/tests/Utils/QueryTest.php @@ -294,11 +294,6 @@ class QueryTest extends TestCase $this->assertEquals(array(), Query::getAll('')); } - public function testGetClauseType() - { - $this->assertEquals('LIMIT', Query::getClauseType(' LIMIT 0, 10 ')); - } - public function testReplaceClause() { $parser = new Parser('SELECT *, (SELECT 1) FROM film LIMIT 0, 10;'); @@ -321,6 +316,7 @@ class QueryTest extends TestCase $parser->statements[0], $parser->list, 'SELECT SQL_CALC_FOUND_ROWS', + null, true ) ); diff --git a/tests/data/parseArrayErr2.out b/tests/data/parseArrayErr2.out index dcac855..f97f4e0 100644 --- a/tests/data/parseArrayErr2.out +++ b/tests/data/parseArrayErr2.out @@ -1 +1 @@ -a:2:{s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:25:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:7;}i:3;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:8;}i:4;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:9;}i:5;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:13;}i:6;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"foo";s:5:"value";s:3:"foo";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:14;}i:7;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:8;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"PARTITION";s:5:"value";s:9:"PARTITION";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:9;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:27;}i:10;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:28;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"bar";s:5:"value";s:3:"bar";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:29;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:32;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"baz";s:5:"value";s:3:"baz";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:33;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:36;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:37;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:38;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:43;}i:18;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:44;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:46;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:1:">";s:5:"value";s:1:">";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:47;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:48;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"0";s:5:"value";i:0;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:49;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:50;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:25;s:3:"idx";i:25;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";s:3:"foo";s:6:"column";N;s:4:"expr";s:3:"foo";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";O:33:"SqlParser\Fragments\ArrayFragment":2:{s:3:"raw";a:1:{i:0;s:3:"bar";}s:6:"values";a:1:{i:0;s:3:"bar";}}s:5:"where";a:1:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:0;s:4:"expr";s:6:"id > 0";}}s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:22;}}}s:6:"errors";a:1:{i:0;a:3:{i:0;s:32:"Symbols ')' or ',' were expected";i:1;r:83;i:2;i:0;}}}
\ No newline at end of file +a:2:{s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:25:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:7;}i:3;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:8;}i:4;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:9;}i:5;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:13;}i:6;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"foo";s:5:"value";s:3:"foo";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:14;}i:7;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:17;}i:8;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"PARTITION";s:5:"value";s:9:"PARTITION";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:18;}i:9;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:27;}i:10;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:28;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"bar";s:5:"value";s:3:"bar";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:29;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:32;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"baz";s:5:"value";s:3:"baz";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:33;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:36;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:37;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:38;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:43;}i:18;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:44;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:46;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:1:">";s:5:"value";s:1:">";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:47;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:48;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"0";s:5:"value";i:0;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:49;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:50;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:25;s:3:"idx";i:25;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";s:3:"foo";s:6:"column";N;s:4:"expr";s:3:"foo";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";O:33:"SqlParser\Fragments\ArrayFragment":2:{s:3:"raw";a:1:{i:0;s:3:"bar";}s:6:"values";a:1:{i:0;s:3:"bar";}}s:5:"where";a:1:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":3:{s:11:"identifiers";a:1:{i:0;s:2:"id";}s:10:"isOperator";b:0;s:4:"expr";s:6:"id > 0";}}s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:22;}}}s:6:"errors";a:1:{i:0;a:3:{i:0;s:32:"Symbols ')' or ',' were expected";i:1;r:83;i:2;i:0;}}}
\ No newline at end of file diff --git a/tests/data/parseDelete.out b/tests/data/parseDelete.out index 6a41bf8..ca59d07 100644 --- a/tests/data/parseDelete.out +++ b/tests/data/parseDelete.out @@ -4,4 +4,4 @@ a:2:{s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";O:20:"SqlParser\TokensLi ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:41;}i:10;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:42;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:47;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"`id`";s:5:"value";s:2:"id";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:52;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"<";s:5:"value";s:1:"<";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:56;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"3";s:5:"value";i:3;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:57;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:58;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"AND";s:5:"value";s:3:"AND";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:59;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:62;}i:18;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:63;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:64;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:72;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:5:""Dan"";s:5:"value";s:3:"Dan";s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:73;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:78;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"or";s:5:"value";s:2:"OR";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:79;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:25;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:82;}i:26;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:90;}i:27;O:15:"SqlParser\Token":5:{s:5:"token";s:6:""Paul"";s:5:"value";s:4:"Paul";s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:91;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:97;}i:29;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:98;}i:30;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"ORDER BY";s:5:"value";s:8:"ORDER BY";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:99;}i:31;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" - ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:107;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:112;}i:33;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:114;}i:34;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:35;s:3:"idx";i:35;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\DeleteStatement":8:{s:4:"from";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:12:"`test`.users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";a:7:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:0;s:4:"expr";s:6:"`id`<3";}i:1;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:1;s:4:"expr";s:3:"AND";}i:2;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:1;s:4:"expr";s:1:"(";}i:3;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:0;s:4:"expr";s:14:"username="Dan"";}i:4;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:1;s:4:"expr";s:2:"OR";}i:5;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:0;s:4:"expr";s:15:"username="Paul"";}i:6;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:1;s:4:"expr";s:1:")";}}s:5:"order";a:1:{i:0;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:3:"ASC";}}s:5:"limit";N;s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:1:{i:1;s:12:"LOW_PRIORITY";}}s:5:"first";i:0;s:4:"last";i:32;}}}s:6:"errors";a:0:{}}
\ No newline at end of file + ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:107;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:112;}i:33;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:114;}i:34;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:35;s:3:"idx";i:35;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\DeleteStatement":8:{s:4:"from";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:12:"`test`.users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";a:5:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":3:{s:11:"identifiers";a:1:{i:0;s:2:"id";}s:10:"isOperator";b:0;s:4:"expr";s:6:"`id`<3";}i:1;O:32:"SqlParser\Fragments\WhereKeyword":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:1;s:4:"expr";s:3:"AND";}i:2;O:32:"SqlParser\Fragments\WhereKeyword":3:{s:11:"identifiers";a:2:{i:0;s:8:"username";i:1;s:3:"Dan";}s:10:"isOperator";b:0;s:4:"expr";s:15:"(username="Dan"";}i:3;O:32:"SqlParser\Fragments\WhereKeyword":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:1;s:4:"expr";s:2:"OR";}i:4;O:32:"SqlParser\Fragments\WhereKeyword":3:{s:11:"identifiers";a:2:{i:0;s:8:"username";i:1;s:4:"Paul";}s:10:"isOperator";b:0;s:4:"expr";s:16:"username="Paul")";}}s:5:"order";a:1:{i:0;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:3:"ASC";}}s:5:"limit";N;s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:1:{i:1;s:12:"LOW_PRIORITY";}}s:5:"first";i:0;s:4:"last";i:32;}}}s:6:"errors";a:0:{}}
\ No newline at end of file diff --git a/tests/data/parseSelect.out b/tests/data/parseSelect.out index e67c349..cfa48e3 100644 --- a/tests/data/parseSelect.out +++ b/tests/data/parseSelect.out @@ -11,4 +11,4 @@ a:2:{s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";O:20:"SqlParser\TokensLi ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:178;}i:63;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"ORDER BY";s:5:"value";s:8:"ORDER BY";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:179;}i:64;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:187;}i:65;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:192;}i:66;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:200;}i:67;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"DESC";s:5:"value";s:4:"DESC";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:201;}i:68;O:15:"SqlParser\Token":5:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:205;}i:69;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:206;}i:70;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:211;}i:71;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" -";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:213;}i:72;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"LIMIT";s:5:"value";s:5:"LIMIT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:214;}i:73;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:219;}i:74;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"3";s:5:"value";i:3;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:220;}i:75;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:221;}i:76;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"OFFSET";s:5:"value";s:6:"OFFSET";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:222;}i:77;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:228;}i:78;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:229;}i:79;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:230;}i:80;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:81;s:3:"idx";i:81;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:4:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:5:"1 + 2";s:5:"alias";s:6:"result";s:8:"function";N;s:8:"subquery";N;}i:1;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:4:"@idx";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:2;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:3;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";s:8:"username";s:4:"expr";s:21:"test.`users`.username";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:2:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:12:"`test`.users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:1;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";s:5:"posts";s:6:"column";N;s:4:"expr";s:5:"posts";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";O:33:"SqlParser\Fragments\ArrayFragment":2:{s:3:"raw";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}s:6:"values";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}}s:5:"where";a:1:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:0;s:4:"expr";s:6:"id > 0";}}s:5:"group";N;s:6:"having";N;s:5:"order";a:2:{i:0;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:8:"username";s:4:"expr";s:8:"username";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:4:"DESC";}i:1;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:3:"ASC";}}s:5:"limit";O:32:"SqlParser\Fragments\LimitKeyword":2:{s:6:"offset";i:2;s:8:"rowCount";i:3;}s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:2:{i:1;s:3:"ALL";i:3;a:2:{s:4:"name";s:18:"MAX_STATEMENT_TIME";s:5:"value";s:2:"10";}}}s:5:"first";i:0;s:4:"last";i:78;}}}s:6:"errors";a:0:{}}
\ No newline at end of file +";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:213;}i:72;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"LIMIT";s:5:"value";s:5:"LIMIT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:214;}i:73;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:219;}i:74;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"3";s:5:"value";i:3;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:220;}i:75;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:221;}i:76;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"OFFSET";s:5:"value";s:6:"OFFSET";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:222;}i:77;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:228;}i:78;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:229;}i:79;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:230;}i:80;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:81;s:3:"idx";i:81;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:4:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:5:"1 + 2";s:5:"alias";s:6:"result";s:8:"function";N;s:8:"subquery";N;}i:1;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:4:"@idx";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:2;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:3;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";s:8:"username";s:4:"expr";s:21:"test.`users`.username";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:2:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:12:"`test`.users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:1;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";s:5:"posts";s:6:"column";N;s:4:"expr";s:5:"posts";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";O:33:"SqlParser\Fragments\ArrayFragment":2:{s:3:"raw";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}s:6:"values";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}}s:5:"where";a:1:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":3:{s:11:"identifiers";a:1:{i:0;s:2:"id";}s:10:"isOperator";b:0;s:4:"expr";s:6:"id > 0";}}s:5:"group";N;s:6:"having";N;s:5:"order";a:2:{i:0;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:8:"username";s:4:"expr";s:8:"username";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:4:"DESC";}i:1;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:3:"ASC";}}s:5:"limit";O:32:"SqlParser\Fragments\LimitKeyword":2:{s:6:"offset";i:2;s:8:"rowCount";i:3;}s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:2:{i:1;s:3:"ALL";i:3;a:2:{s:4:"name";s:18:"MAX_STATEMENT_TIME";s:5:"value";s:2:"10";}}}s:5:"first";i:0;s:4:"last";i:78;}}}s:6:"errors";a:0:{}}
\ No newline at end of file diff --git a/tests/data/parseSelectErr1.out b/tests/data/parseSelectErr1.out index 49315b1..aa1ae02 100644 --- a/tests/data/parseSelectErr1.out +++ b/tests/data/parseSelectErr1.out @@ -11,4 +11,4 @@ a:2:{s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";O:20:"SqlParser\TokensLi ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:173;}i:60;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"ORDER BY";s:5:"value";s:8:"ORDER BY";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:174;}i:61;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:182;}i:62;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:187;}i:63;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:195;}i:64;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"DESC";s:5:"value";s:4:"DESC";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:196;}i:65;O:15:"SqlParser\Token":5:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:200;}i:66;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:201;}i:67;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:206;}i:68;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" -";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:208;}i:69;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"LIMIT";s:5:"value";s:5:"LIMIT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:209;}i:70;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:214;}i:71;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:215;}i:72;O:15:"SqlParser\Token":5:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:216;}i:73;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:217;}i:74;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"3";s:5:"value";i:3;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:218;}i:75;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:219;}i:76;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:77;s:3:"idx";i:77;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:4:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:5:"1 + 2";s:5:"alias";s:6:"result";s:8:"function";N;s:8:"subquery";N;}i:1;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:4:"@idx";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:2;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:3;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";s:8:"username";s:4:"expr";s:21:"test.`users`.username";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:12:"`test`.users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";O:33:"SqlParser\Fragments\ArrayFragment":2:{s:3:"raw";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}s:6:"values";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}}s:5:"where";a:1:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:0;s:4:"expr";s:6:"id > 0";}}s:5:"group";N;s:6:"having";N;s:5:"order";a:2:{i:0;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:8:"username";s:4:"expr";s:8:"username";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:4:"DESC";}i:1;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:3:"ASC";}}s:5:"limit";O:32:"SqlParser\Fragments\LimitKeyword":2:{s:6:"offset";i:2;s:8:"rowCount";i:3;}s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:3:{i:1;s:3:"ALL";i:3;a:2:{s:4:"name";s:18:"MAX_STATEMENT_TIME";s:5:"value";s:2:"10";}i:13;s:8:"DISTINCT";}}s:5:"first";i:0;s:4:"last";i:74;}}}s:6:"errors";a:2:{i:0;a:3:{i:0;s:33:"This option conflicts with 'ALL'.";i:1;r:29;i:2;i:0;}i:1;a:3:{i:0;s:19:"Alias was expected.";i:1;N;i:2;i:0;}}}
\ No newline at end of file +";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:208;}i:69;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"LIMIT";s:5:"value";s:5:"LIMIT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:209;}i:70;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:214;}i:71;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:215;}i:72;O:15:"SqlParser\Token":5:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:216;}i:73;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:217;}i:74;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"3";s:5:"value";i:3;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:218;}i:75;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:219;}i:76;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:77;s:3:"idx";i:77;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:4:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:5:"1 + 2";s:5:"alias";s:6:"result";s:8:"function";N;s:8:"subquery";N;}i:1;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:4:"@idx";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:2;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:3;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";s:8:"username";s:4:"expr";s:21:"test.`users`.username";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:12:"`test`.users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";O:33:"SqlParser\Fragments\ArrayFragment":2:{s:3:"raw";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}s:6:"values";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}}s:5:"where";a:1:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":3:{s:11:"identifiers";a:1:{i:0;s:2:"id";}s:10:"isOperator";b:0;s:4:"expr";s:6:"id > 0";}}s:5:"group";N;s:6:"having";N;s:5:"order";a:2:{i:0;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:8:"username";s:4:"expr";s:8:"username";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:4:"DESC";}i:1;O:32:"SqlParser\Fragments\OrderKeyword":2:{s:5:"field";O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:3:"ASC";}}s:5:"limit";O:32:"SqlParser\Fragments\LimitKeyword":2:{s:6:"offset";i:2;s:8:"rowCount";i:3;}s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:3:{i:1;s:3:"ALL";i:3;a:2:{s:4:"name";s:18:"MAX_STATEMENT_TIME";s:5:"value";s:2:"10";}i:13;s:8:"DISTINCT";}}s:5:"first";i:0;s:4:"last";i:74;}}}s:6:"errors";a:2:{i:0;a:3:{i:0;s:33:"This option conflicts with 'ALL'.";i:1;r:29;i:2;i:0;}i:1;a:3:{i:0;s:19:"Alias was expected.";i:1;N;i:2;i:0;}}}
\ No newline at end of file diff --git a/tests/data/parseUpdate2.out b/tests/data/parseUpdate2.out index 622351a..9170d32 100644 --- a/tests/data/parseUpdate2.out +++ b/tests/data/parseUpdate2.out @@ -5,4 +5,4 @@ a:2:{s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";O:20:"SqlParser\TokensLi ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:42;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:47;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:49;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"155";s:5:"value";i:155;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:50;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:53;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:54;}i:18;O:15:"SqlParser\Token":5:{s:5:"token";s:5:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:59;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:64;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:73;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:74;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:6:""Paul"";s:5:"value";s:4:"Paul";s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:75;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" -";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:25;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"LIMIT";s:5:"value";s:5:"LIMIT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:26;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:87;}i:27;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"1";s:5:"value";i:1;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:88;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:89;}i:29;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"OFFSET";s:5:"value";s:6:"OFFSET";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:90;}i:30;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:96;}i:31;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:97;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:98;}i:33;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:34;s:3:"idx";i:34;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\UpdateStatement":8:{s:4:"from";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:5:"users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:3:"set";a:2:{i:0;O:30:"SqlParser\Fragments\SetKeyword":2:{s:6:"column";s:8:"username";s:5:"value";s:3:"Dan";}i:1;O:30:"SqlParser\Fragments\SetKeyword":2:{s:6:"column";s:2:"id";s:5:"value";i:155;}}s:5:"where";a:1:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":2:{s:10:"isOperator";b:0;s:4:"expr";s:17:"username = "Paul"";}}s:5:"order";N;s:5:"limit";O:32:"SqlParser\Fragments\LimitKeyword":2:{s:6:"offset";i:2;s:8:"rowCount";i:1;}s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:31;}}}s:6:"errors";a:0:{}}
\ No newline at end of file +";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:25;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"LIMIT";s:5:"value";s:5:"LIMIT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:26;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:87;}i:27;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"1";s:5:"value";i:1;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:88;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:89;}i:29;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"OFFSET";s:5:"value";s:6:"OFFSET";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:90;}i:30;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:96;}i:31;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:97;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:98;}i:33;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:34;s:3:"idx";i:34;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\UpdateStatement":8:{s:4:"from";a:1:{i:0;O:33:"SqlParser\Fragments\FieldFragment":7:{s:8:"database";N;s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:5:"users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:3:"set";a:2:{i:0;O:30:"SqlParser\Fragments\SetKeyword":2:{s:6:"column";s:8:"username";s:5:"value";s:3:"Dan";}i:1;O:30:"SqlParser\Fragments\SetKeyword":2:{s:6:"column";s:2:"id";s:5:"value";i:155;}}s:5:"where";a:1:{i:0;O:32:"SqlParser\Fragments\WhereKeyword":3:{s:11:"identifiers";a:2:{i:0;s:8:"username";i:1;s:4:"Paul";}s:10:"isOperator";b:0;s:4:"expr";s:17:"username = "Paul"";}}s:5:"order";N;s:5:"limit";O:32:"SqlParser\Fragments\LimitKeyword":2:{s:6:"offset";i:2;s:8:"rowCount";i:1;}s:7:"options";O:35:"SqlParser\Fragments\OptionsFragment":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:31;}}}s:6:"errors";a:0:{}}
\ No newline at end of file |