summaryrefslogtreecommitdiffstats
path: root/src/Components
diff options
context:
space:
mode:
Diffstat (limited to 'src/Components')
-rw-r--r--src/Components/Array2d.php11
-rw-r--r--src/Components/Expression.php18
-rw-r--r--src/Components/ExpressionArray.php35
-rw-r--r--src/Components/RenameOperation.php12
4 files changed, 46 insertions, 30 deletions
diff --git a/src/Components/Array2d.php b/src/Components/Array2d.php
index 117ad75..64dea40 100644
--- a/src/Components/Array2d.php
+++ b/src/Components/Array2d.php
@@ -37,13 +37,6 @@ class Array2d extends Component
$ret = array();
/**
- * Whether an array was parsed or not. To be a valid parsing, at least
- * one array must be parsed after each comma.
- * @var bool $parsed
- */
- $parsed = false;
-
- /**
* The number of values in each set.
* @var int
*/
@@ -95,14 +88,12 @@ class Array2d extends Component
$parser->error("{$count} values were expected, but found {$arrCount}.", $token);
}
$ret[] = $arr;
- $parsed = true;
$state = 1;
} else {
break;
}
} elseif ($state === 1) {
if ($token->value === ',') {
- $parsed = false;
$state = 0;
} else {
break;
@@ -110,7 +101,7 @@ class Array2d extends Component
}
}
- if (!$parsed) {
+ if ($state === 0) {
$parser->error(
'An opening bracket followed by a set of values was expected.',
$list->tokens[$list->idx]
diff --git a/src/Components/Expression.php b/src/Components/Expression.php
index 964ceb9..45413be 100644
--- a/src/Components/Expression.php
+++ b/src/Components/Expression.php
@@ -239,6 +239,9 @@ class Expression extends Component
if ($alias) {
// An alias is expected (the keyword `AS` was previously found).
+ if (!empty($ret->alias)) {
+ $parser->error('An alias was previously found.', $token);
+ }
$ret->alias = $token->value;
$alias = 0;
} else {
@@ -265,12 +268,18 @@ class Expression extends Component
break;
}
- // Parsing aliases without `AS` keyword and any whitespace.
+ // 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 {
@@ -285,6 +294,11 @@ class Expression extends Component
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;
}
@@ -301,8 +315,8 @@ class Expression extends Component
} else {
$prev = null;
}
-
}
+
if ($alias === 2) {
$parser->error('An alias was expected.', $list->tokens[$list->idx - 1]);
}
diff --git a/src/Components/ExpressionArray.php b/src/Components/ExpressionArray.php
index d62f34c..afabc3a 100644
--- a/src/Components/ExpressionArray.php
+++ b/src/Components/ExpressionArray.php
@@ -38,6 +38,20 @@ class ExpressionArray extends Component
$expr = null;
+ /**
+ * The state of the parser.
+ *
+ * Below are the states of the parser.
+ *
+ * 0 ----------------------[ array ]---------------------> 1
+ *
+ * 1 ------------------------[ , ]------------------------> 0
+ * 1 -----------------------[ else ]----------------------> -1
+ *
+ * @var int
+ */
+ $state = 0;
+
for (; $list->idx < $list->count; ++$list->idx) {
/**
* Token parsed at this moment.
@@ -60,20 +74,27 @@ class ExpressionArray extends Component
break;
}
- if (($token->type === Token::TYPE_OPERATOR) && ($token->value === ',')) {
- $ret[] = $expr;
- } else {
+ if ($state === 0) {
$expr = Expression::parse($parser, $list, $options);
if ($expr === null) {
break;
}
+ $ret[] = $expr;
+ $state = 1;
+ } elseif ($state === 1) {
+ if ($token->value === ',') {
+ $state = 0;
+ } else {
+ break;
+ }
}
-
}
- // Last iteration was not processed.
- if ($expr !== null) {
- $ret[] = $expr;
+ if ($state === 0) {
+ $parser->error(
+ 'An expression was expected.',
+ $list->tokens[$list->idx]
+ );
}
--$list->idx;
diff --git a/src/Components/RenameOperation.php b/src/Components/RenameOperation.php
index 9a91f81..6bd9bbb 100644
--- a/src/Components/RenameOperation.php
+++ b/src/Components/RenameOperation.php
@@ -53,13 +53,6 @@ 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.
@@ -129,21 +122,18 @@ class RenameOperation extends Component
$parser->error('The new name of the table was expected.', $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) {
+ if ($state !== 3) {
$parser->error('A rename operation was expected.', $list->tokens[$list->idx - 1]);
}