diff options
-rw-r--r-- | src/Components/ArrayObj.php | 129 | ||||
-rw-r--r-- | src/Components/Condition.php | 39 | ||||
-rw-r--r-- | src/Components/Expression.php | 234 | ||||
-rw-r--r-- | src/Components/SetOperation.php | 2 | ||||
-rw-r--r-- | src/Context.php | 7 | ||||
-rw-r--r-- | src/Statements/AlterStatement.php | 4 | ||||
-rw-r--r-- | src/Utils/Formatter.php | 4 | ||||
-rw-r--r-- | tests/Builder/SelectStatementTest.php | 3 | ||||
-rw-r--r-- | tests/Components/ArrayObjTest.php | 1 | ||||
-rw-r--r-- | tests/data/parser/parseArrayErr2.in | 1 | ||||
-rw-r--r-- | tests/data/parser/parseArrayErr2.out | 1 | ||||
-rw-r--r-- | tests/data/parser/parseCreateTable2.out | 2 | ||||
-rw-r--r-- | tests/data/parser/parseSelect3.out | 2 |
13 files changed, 242 insertions, 187 deletions
diff --git a/src/Components/ArrayObj.php b/src/Components/ArrayObj.php index fb199ea..56c7247 100644 --- a/src/Components/ArrayObj.php +++ b/src/Components/ArrayObj.php @@ -63,20 +63,32 @@ class ArrayObj extends Component $ret = empty($options['type']) ? new ArrayObj() : array(); /** - * The state of the parser. + * The last raw expression. * - * Below are the states of the parser. - * - * 0 -----------------------[ ( ]------------------------> 1 + * @var string $lastRaw + */ + $lastRaw = ''; + + /** + * The last value. * - * 1 ------------------[ array element ]-----------------> 2 + * @var string $lastValue + */ + $lastValue = ''; + + /** + * Counts brackets. * - * 2 ------------------------[ , ]-----------------------> 1 - * 2 ------------------------[ ) ]-----------------------> (END) + * @var int $brackets + */ + $brackets = 0; + + /** + * Last separator (bracket or comma). * - * @var int $state + * @var boolean $isCommaLast */ - $state = 0; + $isCommaLast = false; for (; $list->idx < $list->count; ++$list->idx) { /** @@ -92,49 +104,72 @@ class ArrayObj extends Component } // Skipping whitespaces and comments. - if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) { + if (($token->type === Token::TYPE_WHITESPACE) + || ($token->type === Token::TYPE_COMMENT) + ) { + $lastRaw .= $token->token; + $lastValue = trim($lastValue) .' '; continue; } - if ($state === 0) { - if (($token->type !== Token::TYPE_OPERATOR) || ($token->value !== '(')) { - $parser->error( - __('An opening bracket was expected.'), - $token - ); - break; - } - $state = 1; - } elseif ($state === 1) { - if (($token->type === Token::TYPE_OPERATOR) && ($token->value === ')')) { - // Empty array. - break; - } - if (empty($options['type'])) { - $ret->values[] = $token->value; - $ret->raw[] = $token->token; - } else { - $ret[] = $options['type']::parse( - $parser, - $list, - empty($options['typeOptions']) ? array() : $options['typeOptions'] - ); - } - $state = 2; - } elseif ($state === 2) { - if (($token->type !== Token::TYPE_OPERATOR) || (($token->value !== ',') && ($token->value !== ')'))) { - $parser->error( - __('A comma or a closing bracket was expected'), - $token - ); - break; - } - if ($token->value === ',') { - $state = 1; - } else { // ) - break; + if (($brackets === 0) + && (($token->type !== Token::TYPE_OPERATOR) + || ($token->value !== '(')) + ) { + $parser->error(__('An opening bracket was expected.'), $token); + break; + } + + if ($token->type === Token::TYPE_OPERATOR) { + if ($token->value === '(') { + if (++$brackets === 1) { // 1 is the base level. + continue; + } + } elseif ($token->value === ')') { + if (--$brackets === 0) { // Array ended. + break; + } + } elseif ($token->value === ',') { + if ($brackets === 1) { + $isCommaLast = true; + if (empty($options['type'])) { + $ret->raw[] = trim($lastRaw); + $ret->values[] = trim($lastValue); + $lastRaw = $lastValue = ''; + } + } + continue; } } + + if (empty($options['type'])) { + $lastRaw .= $token->token; + $lastValue .= $token->value; + } else { + $ret[] = $options['type']::parse( + $parser, + $list, + empty($options['typeOptions']) ? array() : $options['typeOptions'] + ); + } + } + + // Handling last element. + // + // This is treated differently to treat the following cases: + // + // => array() + // (,) => array('', '') + // () => array() + // (a,) => array('a', '') + // (a) => array('a') + // + $lastRaw = trim($lastRaw); + if ((empty($options['type'])) + && ((strlen($lastRaw) > 0) || ($isCommaLast)) + ) { + $ret->raw[] = $lastRaw; + $ret->values[] = trim($lastValue); } return $ret; diff --git a/src/Components/Condition.php b/src/Components/Condition.php index 9d7d586..f820c93 100644 --- a/src/Components/Condition.php +++ b/src/Components/Condition.php @@ -30,17 +30,18 @@ class Condition extends Component * * @var array */ - public static $DELIMITERS = array('&&', 'AND', 'OR', 'XOR', '||'); + public static $DELIMITERS = array('&&', '||', 'AND', 'OR', 'XOR'); /** - * Hash map containing reserved keywords that are also operators. + * List of allowed reserved keywords in conditions. * * @var array */ - public static $OPERATORS = array( + public static $ALLOWED_KEYWORDS = array( 'AND' => 1, 'BETWEEN' => 1, 'EXISTS' => 1, + 'IF' => 1, 'IN' => 1, 'IS' => 1, 'LIKE' => 1, @@ -106,6 +107,7 @@ class Condition extends Component /** * Whether there was a `BETWEEN` keyword before or not. + * * It is required to keep track of them because their structure contains * the keyword `AND`, which is also an operator that delimits * expressions. @@ -115,6 +117,7 @@ class Condition extends Component $betweenBefore = false; for (; $list->idx < $list->count; ++$list->idx) { + /** * Token parsed at this moment. * @@ -142,11 +145,12 @@ class Condition extends Component // Conditions are delimited by logical operators. if (in_array($token->value, static::$DELIMITERS, true)) { if (($betweenBefore) && ($token->value === 'AND')) { + // The syntax of keyword `BETWEEN` is hard-coded. $betweenBefore = false; } else { + // The expression ended. $expr->expr = trim($expr->expr); if (!empty($expr->expr)) { - // Adding the condition that is delimited by this operator. $ret[] = $expr; } @@ -155,36 +159,39 @@ class Condition extends Component $expr->isOperator = true; $ret[] = $expr; + // Preparing to parse another condition. $expr = new Condition(); 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)) { if ($token->value === 'BETWEEN') { $betweenBefore = true; } - if (($brackets === 0) && (empty(static::$OPERATORS[$token->value]))) { + if (($brackets === 0) && (empty(static::$ALLOWED_KEYWORDS[$token->value]))) { break; } } + if ($token->type === Token::TYPE_OPERATOR) { + if ($token->value === '(') { + ++$brackets; + } elseif ($token->value === ')') { + --$brackets; + } + } + $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_KEYWORD) + && (!($token->flags & Token::FLAG_KEYWORD_RESERVED))) || ($token->type === Token::TYPE_STRING) || ($token->type === Token::TYPE_SYMBOL) ) { - $expr->identifiers[] = $token->value; + if (!in_array($token->value, $expr->identifiers)) { + $expr->identifiers[] = $token->value; + } } } diff --git a/src/Components/Expression.php b/src/Components/Expression.php index d91d902..a365d32 100644 --- a/src/Components/Expression.php +++ b/src/Components/Expression.php @@ -29,6 +29,15 @@ class Expression extends Component { /** + * List of allowed reserved keywords in expressions. + * + * @var array + */ + private static $ALLOWED_KEYWORDS = array( + 'AS' => 1, 'DUAL' => 1, 'NULL' => 1, 'REGEXP' => 1 + ); + + /** * The name of this database. * * @var string @@ -137,9 +146,9 @@ class Expression extends Component /** * Whether an alias is expected. Is 2 if `AS` keyword was found. * - * @var int $alias + * @var bool $alias */ - $alias = 0; + $alias = false; /** * Counts brackets. @@ -149,17 +158,14 @@ class Expression extends Component $brackets = 0; /** - * Keeps track of the previous token. - * Possible values: - * string, if function was previously found; - * true, if opening bracket was previously found; - * null, in any other case. + * Keeps track of the last two previous tokens. * - * @var string|bool $prev + * @var Token[] $prev */ - $prev = null; + $prev = array(null, null); for (; $list->idx < $list->count; ++$list->idx) { + /** * Token parsed at this moment. * @@ -173,36 +179,48 @@ class Expression extends Component } // Skipping whitespaces and comments. - if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) { - if (($isExpr) && (!$alias)) { + if (($token->type === Token::TYPE_WHITESPACE) + || ($token->type === Token::TYPE_COMMENT) + ) { + if ($isExpr) { $ret->expr .= $token->token; } - if (($alias === 0) && (empty($options['noAlias'])) && (!$isExpr) && (!$dot) && (!empty($ret->expr))) { - $alias = 1; - } continue; } - if (($token->type === Token::TYPE_KEYWORD) - && ($token->flags & Token::FLAG_KEYWORD_RESERVED) - && ($token->value !== 'DUAL') - && ($token->value !== 'NULL') - ) { - // Keywords may be found only between brackets. - if ($brackets === 0) { - if ((empty($options['noAlias'])) && ($token->value === 'AS')) { - $alias = 2; - continue; - } - if (!($token->flags & Token::FLAG_KEYWORD_FUNCTION)) { + if ($token->type === Token::TYPE_KEYWORD) { + if (($brackets > 0) && (empty($ret->subquery)) + && (!empty(Parser::$STATEMENT_PARSERS[$token->value])) + ) { + // A `(` was previously found and this keyword is the + // beginning of a statement, so this is a subquery. + $ret->subquery = $token->value; + } elseif ($token->flags & Token::FLAG_KEYWORD_FUNCTION) { + $isExpr = true; + } elseif (($token->flags & Token::FLAG_KEYWORD_RESERVED) + && ($brackets === 0) + ) { + if (empty(self::$ALLOWED_KEYWORDS[$token->value])) { + // A reserved keyword that is not allowed in the + // expression was found so the expression must have + // ended and a new clause is starting. break; } - } elseif ($prev === true) { - if ((empty($ret->subquery) && (!empty(Parser::$STATEMENT_PARSERS[$token->value])))) { - // A `(` was previously found and this keyword is the - // beginning of a statement, so this is a subquery. - $ret->subquery = $token->value; + if ($token->value === 'AS') { + if (!empty($options['noAlias'])) { + break; + } + if (!empty($ret->alias)) { + $parser->error( + __('An alias was previously found.'), + $token + ); + break; + } + $alias = true; + continue; } + $isExpr = true; } } @@ -210,22 +228,25 @@ class Expression extends Component if ((!empty($options['noBrackets'])) && (($token->value === '(') || ($token->value === ')')) ) { + // No brackets were expected. break; } if ($token->value === '(') { ++$brackets; - if ((empty($ret->function)) && ($prev !== null) && ($prev !== true)) { - // A function name was previously found and now an open - // bracket, so this is a function call. - $ret->function = $prev; + if ((empty($ret->function)) && ($prev[1] !== null) + && (($prev[1]->type === Token::TYPE_NONE) + || ($prev[1]->type === Token::TYPE_SYMBOL) + || (($prev[1]->type === Token::TYPE_KEYWORD) + && ($prev[1]->flags & Token::FLAG_KEYWORD_FUNCTION))) + ) { + $ret->function = $prev[1]->value; } - $isExpr = true; } elseif ($token->value === ')') { --$brackets; if ($brackets === 0) { if (!empty($options['bracketsDelimited'])) { - // The current token is the last brackets, the next - // one will be outside. + // The current token is the last bracket, the next + // one will be outside the expression. $ret->expr .= $token->token; ++$list->idx; break; @@ -236,109 +257,100 @@ class Expression extends Component break; } } elseif ($token->value === ',') { + // Expressions are comma-delimited. if ($brackets === 0) { break; } } } - if (($token->type === Token::TYPE_NUMBER) || ($token->type === Token::TYPE_BOOL) - || (($token->type === Token::TYPE_SYMBOL) && ($token->flags & Token::FLAG_SYMBOL_VARIABLE)) - || (($token->type === Token::TYPE_OPERATOR)) && ($token->value !== '.') + if (($token->type === Token::TYPE_NUMBER) + || ($token->type === Token::TYPE_BOOL) + || (($token->type === Token::TYPE_SYMBOL) + && ($token->flags & Token::FLAG_SYMBOL_VARIABLE)) + || (($token->type === Token::TYPE_OPERATOR) + && ($token->value !== '.')) ) { - // Numbers, booleans and operators are usually part of expressions. + // Numbers, booleans and operators (except dot) are usually part + // of expressions. $isExpr = true; } + // Saving the previous token. + $prev[0] = $prev[1]; + $prev[1] = $token; + if ($alias) { // An alias is expected (the keyword `AS` was previously found). if (!empty($ret->alias)) { $parser->error(__('An alias was previously found.'), $token); + break; } $ret->alias = $token->value; - $alias = 0; - } else { - if (!$isExpr) { - if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '.')) { - // Found a `.` which means we expect a column name and - // the column name we parsed is actually the table name - // and the table name is actually a database name. - if ((!empty($ret->database)) || ($dot)) { - $parser->error(__('Unexpected dot.'), $token); - } - $ret->database = $ret->table; - $ret->table = $ret->column; - $ret->column = null; - $dot = true; - } else { - // We found the name of a column (or table if column - // field should be skipped; used to parse table names). - $field = (!empty($options['skipColumn'])) ? 'table' : 'column'; - if (!empty($ret->$field)) { - // No alias is expected. - if (!empty($options['noAlias'])) { - break; - } - - // Parsing aliases without `AS` keyword and any - // whitespace. - // Example: SELECT 1`foo` - if (($token->type === Token::TYPE_STRING) - || (($token->type === Token::TYPE_SYMBOL) - && ($token->flags & Token::FLAG_SYMBOL_BACKTICK)) - ) { - if (!empty($ret->alias)) { - $parser->error( - __('An alias was previously found.'), - $token - ); - } - $ret->alias = $token->value; - } - } else { - $ret->$field = $token->value; - } - $dot = false; + $alias = false; + } elseif ($isExpr) { + // Handling aliases. + if (/* (empty($ret->alias)) && */ ($brackets === 0) + && (($prev[0] === null) + || ((($prev[0]->type !== Token::TYPE_OPERATOR) + || ($prev[0]->token === ')')) + && (($prev[0]->type !== Token::TYPE_KEYWORD) + || (!($prev[0]->flags & Token::FLAG_KEYWORD_RESERVED))))) + && (($prev[1]->type === Token::TYPE_STRING) + || (($prev[1]->type === Token::TYPE_SYMBOL) + && (!($prev[1]->flags & Token::FLAG_SYMBOL_VARIABLE))) + || ($prev[1]->type === Token::TYPE_NONE)) + ) { + if (!empty($ret->alias)) { + $parser->error(__('An alias was previously found.'), $token); + break; } + $ret->alias = $prev[1]->value; } else { - // Parsing aliases without `AS` keyword. - // Example: SELECT 'foo' `bar` - if (($brackets === 0) && (empty($options['noAlias']))) { - if (($token->type === Token::TYPE_NONE) || ($token->type === Token::TYPE_STRING) - || (($token->type === Token::TYPE_SYMBOL) && ($token->flags & Token::FLAG_SYMBOL_BACKTICK)) - ) { - if (!empty($ret->alias)) { - $parser->error( - __('An alias was previously found.'), - $token - ); - } - $ret->alias = $token->value; - continue; + $ret->expr .= $token->token; + } + } elseif (!$isExpr) { + if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '.')) { + // Found a `.` which means we expect a column name and + // the column name we parsed is actually the table name + // and the table name is actually a database name. + if ((!empty($ret->database)) || ($dot)) { + $parser->error(__('Unexpected dot.'), $token); + } + $ret->database = $ret->table; + $ret->table = $ret->column; + $ret->column = null; + $dot = true; + $ret->expr .= $token->token; + } else { + $field = (!empty($options['skipColumn'])) ? 'table' : 'column'; + if (empty($ret->$field)) { + $ret->$field = $token->value; + $ret->expr .= $token->token; + $dot = false; + } else { + // No alias is expected. + if (!empty($options['noAlias'])) { + break; + } + if (!empty($ret->alias)) { + $parser->error(__('An alias was previously found.'), $token); + break; } + $ret->alias = $token->value; } } - - $ret->expr .= $token->token; - } - - if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_FUNCTION)) { - $prev = strtoupper($token->value); - } elseif (($token->type === Token::TYPE_OPERATOR) || ($token->value === '(')) { - $prev = true; - } else { - $prev = null; } } - if ($alias === 2) { + if ($alias) { $parser->error( __('An alias was expected.'), $list->tokens[$list->idx - 1] ); } - // Whitespaces might be added at the end. + // White-spaces might be added at the end. $ret->expr = trim($ret->expr); if (empty($ret->expr)) { diff --git a/src/Components/SetOperation.php b/src/Components/SetOperation.php index 427f48d..38aa7f6 100644 --- a/src/Components/SetOperation.php +++ b/src/Components/SetOperation.php @@ -92,7 +92,7 @@ class SetOperation extends Component if ($state === 0) { if ($token->token === '=') { $state = 1; - } else if ($token->value !== ',') { + } elseif ($token->value !== ',') { $expr->column .= $token->token; } } elseif ($state === 1) { diff --git a/src/Context.php b/src/Context.php index c753d3c..7637953 100644 --- a/src/Context.php +++ b/src/Context.php @@ -397,9 +397,12 @@ abstract class Context */ public static function isSeparator($str) { - // NOTES: Only ASCII characters may be separators. + // NOTES: Only non alphanumeric ASCII characters may be separators. // `~` is the last printable ASCII character. - return ($str <= '~') && (!ctype_alnum($str)) && ($str !== '_'); + return ($str <= '~') && ($str !== '_') + && (($str < '0') || ($str > '9')) + && (($str < 'a') || ($str > 'z')) + && (($str < 'A') || ($str > 'Z')); } /** diff --git a/src/Statements/AlterStatement.php b/src/Statements/AlterStatement.php index 4da360a..275eae7 100644 --- a/src/Statements/AlterStatement.php +++ b/src/Statements/AlterStatement.php @@ -76,8 +76,8 @@ class AlterStatement extends Statement $parser, $list, array( - 'noAlias' => true, - 'noBrackets' => true, + 'noAlias' => true, + 'noBrackets' => true, ) ); ++$list->idx; // Skipping field. diff --git a/src/Utils/Formatter.php b/src/Utils/Formatter.php index 7ff1346..266440b 100644 --- a/src/Utils/Formatter.php +++ b/src/Utils/Formatter.php @@ -305,8 +305,8 @@ class Formatter && (!$formattedOptions) && (empty(self::$INLINE_CLAUSES[$lastClause])) && (($curr->type !== Token::TYPE_KEYWORD) - || (($curr->type === Token::TYPE_KEYWORD) - && ($curr->flags & Token::FLAG_KEYWORD_FUNCTION))) + || (($curr->type === Token::TYPE_KEYWORD) + && ($curr->flags & Token::FLAG_KEYWORD_FUNCTION))) ) { $formattedOptions = true; $lineEnded = true; diff --git a/tests/Builder/SelectStatementTest.php b/tests/Builder/SelectStatementTest.php index 6aa9624..c36150a 100644 --- a/tests/Builder/SelectStatementTest.php +++ b/tests/Builder/SelectStatementTest.php @@ -24,7 +24,8 @@ class SelectStatementTest extends TestCase ); } - public function testBuilderUnion() { + public function testBuilderUnion() + { $parser = new Parser('SELECT 1 UNION SELECT 2'); $stmt = $parser->statements[0]; diff --git a/tests/Components/ArrayObjTest.php b/tests/Components/ArrayObjTest.php index 00321ed..c71ab37 100644 --- a/tests/Components/ArrayObjTest.php +++ b/tests/Components/ArrayObjTest.php @@ -50,7 +50,6 @@ class ArrayObjTest extends TestCase { return array( array('parser/parseArrayErr1'), - array('parser/parseArrayErr2'), array('parser/parseArrayErr3'), ); } diff --git a/tests/data/parser/parseArrayErr2.in b/tests/data/parser/parseArrayErr2.in deleted file mode 100644 index b29b07a..0000000 --- a/tests/data/parser/parseArrayErr2.in +++ /dev/null @@ -1 +0,0 @@ -SELECT * FROM foo PARTITION (bar baz) WHERE id > 0;
\ No newline at end of file diff --git a/tests/data/parser/parseArrayErr2.out b/tests/data/parser/parseArrayErr2.out deleted file mode 100644 index df120dd..0000000 --- a/tests/data/parser/parseArrayErr2.out +++ /dev/null @@ -1 +0,0 @@ -a:4:{s:5:"query";s:51:"SELECT * FROM foo PARTITION (bar baz) WHERE id > 0;";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:51:"SELECT * FROM foo PARTITION (bar baz) WHERE id > 0;";s:3:"len";i:51;s:4:"last";i:51;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:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";r:8;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:31:"SqlParser\Components\Expression":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:31:"SqlParser\Components\Expression":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:29:"SqlParser\Components\ArrayObj":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:30:"SqlParser\Components\Condition":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:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:22;}}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:2:{i:0;a:3:{i:0;s:41:"A comma or a closing bracket was expected";i:1;r:88;i:2;i:0;}i:1;a:3:{i:0;s:17:"Unexpected token.";i:1;r:94;i:2;i:0;}}}}
\ No newline at end of file diff --git a/tests/data/parser/parseCreateTable2.out b/tests/data/parser/parseCreateTable2.out index 2d2ecf1..11cbc37 100644 --- a/tests/data/parser/parseCreateTable2.out +++ b/tests/data/parser/parseCreateTable2.out @@ -43,4 +43,4 @@ a:4:{s:5:"query";s:940:"CREATE TABLE `payment` ( ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:524;}i:126;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"CONSTRAINT";s:5:"value";s:10:"CONSTRAINT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:527;}i:127;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:537;}i:128;O:15:"SqlParser\Token":5:{s:5:"token";s:21:"`fk_payment_customer`";s:5:"value";s:19:"fk_payment_customer";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:538;}i:129;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:559;}i:130;O:15:"SqlParser\Token":5:{s:5:"token";s:11:"FOREIGN KEY";s:5:"value";s:11:"FOREIGN KEY";s:4:"type";i:1;s:5:"flags";i:23;s:8:"position";i:560;}i:131;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:571;}i:132;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:572;}i:133;O:15:"SqlParser\Token":5:{s:5:"token";s:13:"`customer_id`";s:5:"value";s:11:"customer_id";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:573;}i:134;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:586;}i:135;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:587;}i:136;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"REFERENCES";s:5:"value";s:10:"REFERENCES";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:588;}i:137;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:598;}i:138;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"`customer`";s:5:"value";s:8:"customer";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:599;}i:139;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:609;}i:140;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:610;}i:141;O:15:"SqlParser\Token":5:{s:5:"token";s:13:"`customer_id`";s:5:"value";s:11:"customer_id";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:611;}i:142;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:624;}i:143;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:625;}i:144;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"ON UPDATE";s:5:"value";s:9:"ON UPDATE";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:626;}i:145;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:635;}i:146;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"CASCADE";s:5:"value";s:7:"CASCADE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:636;}i:147;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:643;}i:148;O:15:"SqlParser\Token":5:{s:5:"token";s:3:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:644;}i:149;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"CONSTRAINT";s:5:"value";s:10:"CONSTRAINT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:647;}i:150;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:657;}i:151;O:15:"SqlParser\Token":5:{s:5:"token";s:19:"`fk_payment_rental`";s:5:"value";s:17:"fk_payment_rental";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:658;}i:152;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:677;}i:153;O:15:"SqlParser\Token":5:{s:5:"token";s:11:"FOREIGN KEY";s:5:"value";s:11:"FOREIGN KEY";s:4:"type";i:1;s:5:"flags";i:23;s:8:"position";i:678;}i:154;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:689;}i:155;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:690;}i:156;O:15:"SqlParser\Token":5:{s:5:"token";s:11:"`rental_id`";s:5:"value";s:9:"rental_id";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:691;}i:157;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:702;}i:158;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:703;}i:159;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"REFERENCES";s:5:"value";s:10:"REFERENCES";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:704;}i:160;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:714;}i:161;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"`rental`";s:5:"value";s:6:"rental";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:715;}i:162;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:723;}i:163;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:724;}i:164;O:15:"SqlParser\Token":5:{s:5:"token";s:11:"`rental_id`";s:5:"value";s:9:"rental_id";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:725;}i:165;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:736;}i:166;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:737;}i:167;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"ON DELETE";s:5:"value";s:9:"ON DELETE";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:738;}i:168;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:747;}i:169;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"SET NULL";s:5:"value";s:8:"SET NULL";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:748;}i:170;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:756;}i:171;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"ON UPDATE";s:5:"value";s:9:"ON UPDATE";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:757;}i:172;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:766;}i:173;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"CASCADE";s:5:"value";s:7:"CASCADE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:767;}i:174;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:774;}i:175;O:15:"SqlParser\Token":5:{s:5:"token";s:3:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:775;}i:176;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"CONSTRAINT";s:5:"value";s:10:"CONSTRAINT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:778;}i:177;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:788;}i:178;O:15:"SqlParser\Token":5:{s:5:"token";s:18:"`fk_payment_staff`";s:5:"value";s:16:"fk_payment_staff";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:789;}i:179;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:807;}i:180;O:15:"SqlParser\Token":5:{s:5:"token";s:11:"FOREIGN KEY";s:5:"value";s:11:"FOREIGN KEY";s:4:"type";i:1;s:5:"flags";i:23;s:8:"position";i:808;}i:181;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:819;}i:182;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:820;}i:183;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"`staff_id`";s:5:"value";s:8:"staff_id";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:821;}i:184;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:831;}i:185;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:832;}i:186;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"REFERENCES";s:5:"value";s:10:"REFERENCES";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:833;}i:187;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:843;}i:188;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"`staff`";s:5:"value";s:5:"staff";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:844;}i:189;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:851;}i:190;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:852;}i:191;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"`staff_id`";s:5:"value";s:8:"staff_id";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:853;}i:192;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:863;}i:193;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:864;}i:194;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"ON UPDATE";s:5:"value";s:9:"ON UPDATE";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:865;}i:195;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:874;}i:196;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"CASCADE";s:5:"value";s:7:"CASCADE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:875;}i:197;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:882;}i:198;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:883;}i:199;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:884;}i:200;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"ENGINE";s:5:"value";s:6:"ENGINE";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:885;}i:201;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:891;}i:202;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"InnoDB";s:5:"value";s:6:"InnoDB";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:892;}i:203;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:898;}i:204;O:15:"SqlParser\Token":5:{s:5:"token";s:14:"AUTO_INCREMENT";s:5:"value";s:14:"AUTO_INCREMENT";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:899;}i:205;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:913;}i:206;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"16050";s:5:"value";i:16050;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:914;}i:207;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:919;}i:208;O:15:"SqlParser\Token":5:{s:5:"token";s:15:"DEFAULT CHARSET";s:5:"value";s:15:"DEFAULT CHARSET";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:920;}i:209;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:935;}i:210;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"utf8";s:5:"value";s:4:"utf8";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:936;}i:211;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:212;s:3:"idx";i:212;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":5:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\CreateStatement":15:{s:4:"name";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:7:"payment";s:6:"column";N;s:4:"expr";s:9:"`payment`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:13:"entityOptions";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:3:{i:1;a:4:{s:4:"name";s:6:"ENGINE";s:6:"equals";b:1;s:4:"expr";s:6:"InnoDB";s:5:"value";s:6:"InnoDB";}i:2;a:4:{s:4:"name";s:14:"AUTO_INCREMENT";s:6:"equals";b:1;s:4:"expr";s:5:"16050";s:5:"value";s:5:"16050";}i:4;a:4:{s:4:"name";s:15:"DEFAULT CHARSET";s:6:"equals";b:1;s:4:"expr";s:4:"utf8";s:5:"value";s:4:"utf8";}}}s:6:"fields";a:14:{i:0;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:10:"payment_id";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:8:"SMALLINT";s:10:"parameters";a:1:{i:0;i:5;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:4;s:8:"UNSIGNED";}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:1;s:8:"NOT NULL";i:3;s:14:"AUTO_INCREMENT";}}}i:1;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:11:"customer_id";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:8:"SMALLINT";s:10:"parameters";a:1:{i:0;i:5;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:4;s:8:"UNSIGNED";}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:8:"NOT NULL";}}}i:2;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:8:"staff_id";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:7:"TINYINT";s:10:"parameters";a:1:{i:0;i:3;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:4;s:8:"UNSIGNED";}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:8:"NOT NULL";}}}i:3;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:9:"rental_id";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:3:"INT";s:10:"parameters";a:1:{i:0;i:11;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:2;a:3:{s:4:"name";s:7:"DEFAULT";s:4:"expr";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"NULL";s:4:"expr";s:4:"NULL";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"value";s:4:"NULL";}}}}i:4;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:6:"amount";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:7:"DECIMAL";s:10:"parameters";a:2:{i:0;i:5;i:1;i:2;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:8:"NOT NULL";}}}i:5;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:12:"payment_date";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:8:"DATETIME";s:10:"parameters";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:8:"NOT NULL";}}}i:6;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:11:"last_update";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:9:"TIMESTAMP";s:10:"parameters";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:3:{i:1;s:8:"NOT NULL";i:2;a:3:{s:4:"name";s:7:"DEFAULT";s:4:"expr";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:17:"CURRENT_TIMESTAMP";s:4:"expr";s:17:"CURRENT_TIMESTAMP";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"value";s:17:"CURRENT_TIMESTAMP";}i:7;a:4:{s:4:"name";s:9:"ON UPDATE";s:6:"equals";b:0;s:4:"expr";s:17:"CURRENT_TIMESTAMP";s:5:"value";s:17:"CURRENT_TIMESTAMP";}}}}i:7;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:10:"payment_id";}}s:4:"type";s:11:"PRIMARY KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:8;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";s:15:"idx_fk_staff_id";s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:8:"staff_id";}}s:4:"type";s:3:"KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:9;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";s:18:"idx_fk_customer_id";s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:11:"customer_id";}}s:4:"type";s:3:"KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:10;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";s:17:"fk_payment_rental";s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:9:"rental_id";}}s:4:"type";s:3:"KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:11;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:19:"fk_payment_customer";s:12:"isConstraint";b:1;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:11:"customer_id";}}s:4:"type";s:11:"FOREIGN KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";O:30:"SqlParser\Components\Reference":3:{s:5:"table";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:8:"customer";s:6:"column";N;s:4:"expr";s:10:"`customer`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"columns";a:1:{i:0;s:11:"customer_id";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;a:4:{s:4:"name";s:9:"ON UPDATE";s:6:"equals";b:0;s:4:"expr";s:7:"CASCADE";s:5:"value";s:7:"CASCADE";}}}}s:7:"options";N;}i:12;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:17:"fk_payment_rental";s:12:"isConstraint";b:1;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:9:"rental_id";}}s:4:"type";s:11:"FOREIGN KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";O:30:"SqlParser\Components\Reference":3:{s:5:"table";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"rental";s:6:"column";N;s:4:"expr";s:8:"`rental`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"columns";a:1:{i:0;s:9:"rental_id";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:2;a:4:{s:4:"name";s:9:"ON DELETE";s:6:"equals";b:0;s:4:"expr";s:8:"SET NULL";s:5:"value";s:8:"SET NULL";}i:3;a:4:{s:4:"name";s:9:"ON UPDATE";s:6:"equals";b:0;s:4:"expr";s:7:"CASCADE";s:5:"value";s:7:"CASCADE";}}}}s:7:"options";N;}i:13;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:16:"fk_payment_staff";s:12:"isConstraint";b:1;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:8:"staff_id";}}s:4:"type";s:11:"FOREIGN KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";O:30:"SqlParser\Components\Reference":3:{s:5:"table";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:5:"staff";s:6:"column";N;s:4:"expr";s:7:"`staff`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"columns";a:1:{i:0;s:8:"staff_id";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;a:4:{s:4:"name";s:9:"ON UPDATE";s:6:"equals";b:0;s:4:"expr";s:7:"CASCADE";s:5:"value";s:7:"CASCADE";}}}}s:7:"options";N;}}s:11:"partitionBy";N;s:13:"partitionsNum";N;s:14:"subpartitionBy";N;s:16:"subpartitionsNum";N;s:10:"partitions";N;s:5:"table";N;s:6:"return";N;s:10:"parameters";N;s:4:"body";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:6;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:211;}}s:8:"brackets";i:0;}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";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:882;}i:198;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:883;}i:199;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:884;}i:200;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"ENGINE";s:5:"value";s:6:"ENGINE";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:885;}i:201;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:891;}i:202;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"InnoDB";s:5:"value";s:6:"InnoDB";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:892;}i:203;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:898;}i:204;O:15:"SqlParser\Token":5:{s:5:"token";s:14:"AUTO_INCREMENT";s:5:"value";s:14:"AUTO_INCREMENT";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:899;}i:205;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:913;}i:206;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"16050";s:5:"value";i:16050;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:914;}i:207;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:919;}i:208;O:15:"SqlParser\Token":5:{s:5:"token";s:15:"DEFAULT CHARSET";s:5:"value";s:15:"DEFAULT CHARSET";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:920;}i:209;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:935;}i:210;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"utf8";s:5:"value";s:4:"utf8";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:936;}i:211;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:212;s:3:"idx";i:212;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":5:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\CreateStatement":15:{s:4:"name";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:7:"payment";s:6:"column";N;s:4:"expr";s:9:"`payment`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:13:"entityOptions";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:3:{i:1;a:4:{s:4:"name";s:6:"ENGINE";s:6:"equals";b:1;s:4:"expr";s:6:"InnoDB";s:5:"value";s:6:"InnoDB";}i:2;a:4:{s:4:"name";s:14:"AUTO_INCREMENT";s:6:"equals";b:1;s:4:"expr";s:5:"16050";s:5:"value";s:5:"16050";}i:4;a:4:{s:4:"name";s:15:"DEFAULT CHARSET";s:6:"equals";b:1;s:4:"expr";s:4:"utf8";s:5:"value";s:4:"utf8";}}}s:6:"fields";a:14:{i:0;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:10:"payment_id";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:8:"SMALLINT";s:10:"parameters";a:1:{i:0;s:1:"5";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:4;s:8:"UNSIGNED";}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:1;s:8:"NOT NULL";i:3;s:14:"AUTO_INCREMENT";}}}i:1;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:11:"customer_id";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:8:"SMALLINT";s:10:"parameters";a:1:{i:0;s:1:"5";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:4;s:8:"UNSIGNED";}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:8:"NOT NULL";}}}i:2;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:8:"staff_id";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:7:"TINYINT";s:10:"parameters";a:1:{i:0;s:1:"3";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:4;s:8:"UNSIGNED";}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:8:"NOT NULL";}}}i:3;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:9:"rental_id";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:3:"INT";s:10:"parameters";a:1:{i:0;s:2:"11";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:2;a:3:{s:4:"name";s:7:"DEFAULT";s:4:"expr";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:4:"NULL";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"value";s:4:"NULL";}}}}i:4;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:6:"amount";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:7:"DECIMAL";s:10:"parameters";a:2:{i:0;s:1:"5";i:1;s:1:"2";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:8:"NOT NULL";}}}i:5;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:12:"payment_date";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:8:"DATETIME";s:10:"parameters";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:8:"NOT NULL";}}}i:6;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:11:"last_update";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:9:"TIMESTAMP";s:10:"parameters";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:3:{i:1;s:8:"NOT NULL";i:2;a:3:{s:4:"name";s:7:"DEFAULT";s:4:"expr";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:17:"CURRENT_TIMESTAMP";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"value";s:17:"CURRENT_TIMESTAMP";}i:7;a:4:{s:4:"name";s:9:"ON UPDATE";s:6:"equals";b:0;s:4:"expr";s:17:"CURRENT_TIMESTAMP";s:5:"value";s:17:"CURRENT_TIMESTAMP";}}}}i:7;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:10:"payment_id";}}s:4:"type";s:11:"PRIMARY KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:8;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";s:15:"idx_fk_staff_id";s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:8:"staff_id";}}s:4:"type";s:3:"KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:9;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";s:18:"idx_fk_customer_id";s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:11:"customer_id";}}s:4:"type";s:3:"KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:10;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";s:17:"fk_payment_rental";s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:9:"rental_id";}}s:4:"type";s:3:"KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:11;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:19:"fk_payment_customer";s:12:"isConstraint";b:1;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:11:"customer_id";}}s:4:"type";s:11:"FOREIGN KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";O:30:"SqlParser\Components\Reference":3:{s:5:"table";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:8:"customer";s:6:"column";N;s:4:"expr";s:10:"`customer`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"columns";a:1:{i:0;s:11:"customer_id";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;a:4:{s:4:"name";s:9:"ON UPDATE";s:6:"equals";b:0;s:4:"expr";s:7:"CASCADE";s:5:"value";s:7:"CASCADE";}}}}s:7:"options";N;}i:12;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:17:"fk_payment_rental";s:12:"isConstraint";b:1;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:9:"rental_id";}}s:4:"type";s:11:"FOREIGN KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";O:30:"SqlParser\Components\Reference":3:{s:5:"table";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"rental";s:6:"column";N;s:4:"expr";s:8:"`rental`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"columns";a:1:{i:0;s:9:"rental_id";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:2;a:4:{s:4:"name";s:9:"ON DELETE";s:6:"equals";b:0;s:4:"expr";s:8:"SET NULL";s:5:"value";s:8:"SET NULL";}i:3;a:4:{s:4:"name";s:9:"ON UPDATE";s:6:"equals";b:0;s:4:"expr";s:7:"CASCADE";s:5:"value";s:7:"CASCADE";}}}}s:7:"options";N;}i:13;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:16:"fk_payment_staff";s:12:"isConstraint";b:1;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:8:"staff_id";}}s:4:"type";s:11:"FOREIGN KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";O:30:"SqlParser\Components\Reference":3:{s:5:"table";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:5:"staff";s:6:"column";N;s:4:"expr";s:7:"`staff`";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:7:"columns";a:1:{i:0;s:8:"staff_id";}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:3;a:4:{s:4:"name";s:9:"ON UPDATE";s:6:"equals";b:0;s:4:"expr";s:7:"CASCADE";s:5:"value";s:7:"CASCADE";}}}}s:7:"options";N;}}s:11:"partitionBy";N;s:13:"partitionsNum";N;s:14:"subpartitionBy";N;s:16:"subpartitionsNum";N;s:10:"partitions";N;s:5:"table";N;s:6:"return";N;s:10:"parameters";N;s:4:"body";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:6;s:5:"TABLE";}}s:5:"first";i:0;s:4:"last";i:211;}}s:8:"brackets";i:0;}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}
\ No newline at end of file diff --git a/tests/data/parser/parseSelect3.out b/tests/data/parser/parseSelect3.out index 7d66486..9fe1cd2 100644 --- a/tests/data/parser/parseSelect3.out +++ b/tests/data/parser/parseSelect3.out @@ -4,4 +4,4 @@ WHERE right_tbl.id IS NULL;";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict"; FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;";s:3:"len";i:109;s:4:"last";i:109;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:37:{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:8:"left_tbl";s:5:"value";s:8:"left_tbl";s:4:"type";i:0;s:5:"flags";i:0;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:2;s:5:"flags";i:16;s:8:"position";i:15;}i:4;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:16;}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:17;}i:6;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:18;}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:22;}i:8;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"left_tbl";s:5:"value";s:8:"left_tbl";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:23;}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:31;}i:10;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"LEFT JOIN";s:5:"value";s:9:"LEFT JOIN";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:32;}i:11;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:41;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"right_tbl";s:5:"value";s:9:"right_tbl";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:42;}i:13;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:51;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"ON";s:5:"value";s:2:"ON";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:52;}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:54;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"left_tbl";s:5:"value";s:8:"left_tbl";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:55;}i:17;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: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:64;}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:66;}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:67;}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:68;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"right_tbl";s:5:"value";s:9:"right_tbl";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:69;}i:23;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:78;}i:24;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:79;}i:25;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:26;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:82;}i:27;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:28;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"right_tbl";s:5:"value";s:9:"right_tbl";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:88;}i:29;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:30;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:98;}i:31;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:100;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"IS";s:5:"value";s:2:"IS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:101;}i:33;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:103;}i:34;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"NULL";s:5:"value";s:4:"NULL";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:104;}i:35;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:108;}i:36;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:37;s:3:"idx";i:37;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";r:8;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:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:8:"left_tbl";s:6:"column";N;s:4:"expr";s:10:"left_tbl.*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:8:"left_tbl";s:6:"column";N;s:4:"expr";s:8:"left_tbl";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";a:1:{i:0;O:30:"SqlParser\Components\Condition":3:{s:11:"identifiers";a:2:{i:0;s:9:"right_tbl";i:1;s:2:"id";}s:10:"isOperator";b:0;s:4:"expr";s:20:"right_tbl.id IS NULL";}}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";a:1:{i:0;O:32:"SqlParser\Components\JoinKeyword":3:{s:4:"type";s:4:"LEFT";s:4:"expr";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:9:"right_tbl";s:6:"column";N;s:4:"expr";s:9:"right_tbl";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:2:"on";a:1:{i:0;O:30:"SqlParser\Components\Condition":3:{s:11:"identifiers";a:4:{i:0;s:8:"left_tbl";i:1;s:2:"id";i:2;s:9:"right_tbl";i:3;s:2:"id";}s:10:"isOperator";b:0;s:4:"expr";s:26:"left_tbl.id = right_tbl.id";}}}}s:5:"union";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:34;}}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";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:26;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:82;}i:27;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:28;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"right_tbl";s:5:"value";s:9:"right_tbl";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:88;}i:29;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:30;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:98;}i:31;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:100;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"IS";s:5:"value";s:2:"IS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:101;}i:33;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:103;}i:34;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"NULL";s:5:"value";s:4:"NULL";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:104;}i:35;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:108;}i:36;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:37;s:3:"idx";i:37;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":5:{s:4:"list";r:8;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:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:8:"left_tbl";s:6:"column";N;s:4:"expr";s:10:"left_tbl.*";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:4:"from";a:1:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:8:"left_tbl";s:6:"column";N;s:4:"expr";s:8:"left_tbl";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";a:1:{i:0;O:30:"SqlParser\Components\Condition":3:{s:11:"identifiers";a:2:{i:0;s:9:"right_tbl";i:1;s:2:"id";}s:10:"isOperator";b:0;s:4:"expr";s:20:"right_tbl.id IS NULL";}}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";a:1:{i:0;O:32:"SqlParser\Components\JoinKeyword":3:{s:4:"type";s:4:"LEFT";s:4:"expr";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:9:"right_tbl";s:6:"column";N;s:4:"expr";s:9:"right_tbl";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:2:"on";a:1:{i:0;O:30:"SqlParser\Components\Condition":3:{s:11:"identifiers";a:3:{i:0;s:8:"left_tbl";i:1;s:2:"id";i:2;s:9:"right_tbl";}s:10:"isOperator";b:0;s:4:"expr";s:26:"left_tbl.id = right_tbl.id";}}}}s:5:"union";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:34;}}s:8:"brackets";i:0;}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}
\ No newline at end of file |