diff options
Diffstat (limited to 'src/Components/RenameOperation.php')
-rw-r--r-- | src/Components/RenameOperation.php | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/src/Components/RenameOperation.php b/src/Components/RenameOperation.php index 3350437..fc73331 100644 --- a/src/Components/RenameOperation.php +++ b/src/Components/RenameOperation.php @@ -53,6 +53,13 @@ class RenameOperation extends Component $expr = new RenameOperation(); /** + * Whether an operation was parsed or not. To be a valid parsing, at + * least one operation must be parsed after each comma. + * @var bool $parsed + */ + $parsed = false; + + /** * The state of the parser. * * Below are the states of the parser. @@ -87,29 +94,7 @@ class RenameOperation extends Component continue; } - if (($token->type === Token::TYPE_KEYWORD) && ($token->flags & Token::FLAG_KEYWORD_RESERVED)) { - if (($state === 1) && ($token->value === 'TO')) { - $state = 2; - continue; - } - - // No other keyword is expected. - break; - } - - if ($token->type === Token::TYPE_OPERATOR) { - if (($state === 3) && ($token->value === ',')) { - $ret[] = $expr; - $expr = new RenameOperation(); - $state = 0; - continue; - } - - // No other operator is expected. - break; - } - - if ($state == 0) { + if ($state === 0) { $expr->old = Expression::parse( $parser, $list, @@ -119,8 +104,18 @@ class RenameOperation extends Component 'skipColumn' => true, ) ); + if (empty($expr->old)) { + $parser->error('Expected old table name.', $token); + } $state = 1; - } elseif ($state == 2) { + } elseif ($state === 1) { + if (($token->type === Token::TYPE_KEYWORD) && ($token->value === 'TO')) { + $state = 2; + } else { + $parser->error('Expected `TO` keyword.', $token); + break; + } + } elseif ($state === 2) { $expr->new = Expression::parse( $parser, $list, @@ -130,9 +125,26 @@ class RenameOperation extends Component 'noAlias' => true, ) ); + if (empty($expr->new)) { + $parser->error('Expected new table name.', $token); + } $state = 3; + $parsed = true; + } elseif ($state === 3) { + if (($token->type === Token::TYPE_OPERATOR) && ($token->value === ',')) { + $ret[] = $expr; + $expr = new RenameOperation(); + $state = 0; + // Found a comma, looking for another operation. + $parsed = false; + } else { + break; + } } + } + if (!$parsed) { + $parser->error('Expected a rename operation.', $list->tokens[$list->idx - 1]); } // Last iteration was not saved. |