summaryrefslogtreecommitdiffstats
path: root/src/Components/RenameOperation.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Components/RenameOperation.php')
-rw-r--r--src/Components/RenameOperation.php60
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.