diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Contexts/ContextMySql50000.php | 6 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50100.php | 6 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50500.php | 6 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50600.php | 6 | ||||
-rw-r--r-- | src/Contexts/ContextMySql50700.php | 6 | ||||
-rw-r--r-- | src/Parser.php | 6 | ||||
-rw-r--r-- | src/Statement.php | 21 | ||||
-rw-r--r-- | src/Statements/SelectStatement.php | 15 |
8 files changed, 53 insertions, 19 deletions
diff --git a/src/Contexts/ContextMySql50000.php b/src/Contexts/ContextMySql50000.php index f8afd18..82ec3bd 100644 --- a/src/Contexts/ContextMySql50000.php +++ b/src/Contexts/ContextMySql50000.php @@ -145,8 +145,8 @@ class ContextMySql50000 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, 'NO RELEASE' => 7, - 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, + 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, 'LINEAR HASH' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, @@ -156,7 +156,7 @@ class ContextMySql50000 extends Context 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, 'GENERATED ALWAYS' => 7, 'RIGHT OUTER JOIN' => 7, 'NATURAL LEFT JOIN' => 7, 'START TRANSACTION' => 7, - 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, + 'LOCK IN SHARE MODE' => 7, 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, 'DEFAULT CHARACTER SET' => 7, 'NATURAL LEFT OUTER JOIN' => 7, 'NATURAL RIGHT OUTER JOIN' => 7, 'WITH CONSISTENT SNAPSHOT' => 7, diff --git a/src/Contexts/ContextMySql50100.php b/src/Contexts/ContextMySql50100.php index dd2b677..f63d174 100644 --- a/src/Contexts/ContextMySql50100.php +++ b/src/Contexts/ContextMySql50100.php @@ -159,8 +159,8 @@ class ContextMySql50100 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, 'NO RELEASE' => 7, - 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, + 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, 'LINEAR HASH' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, @@ -170,7 +170,7 @@ class ContextMySql50100 extends Context 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, 'GENERATED ALWAYS' => 7, 'RIGHT OUTER JOIN' => 7, 'NATURAL LEFT JOIN' => 7, 'START TRANSACTION' => 7, - 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, + 'LOCK IN SHARE MODE' => 7, 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, 'DEFAULT CHARACTER SET' => 7, 'NATURAL LEFT OUTER JOIN' => 7, 'NATURAL RIGHT OUTER JOIN' => 7, 'WITH CONSISTENT SNAPSHOT' => 7, diff --git a/src/Contexts/ContextMySql50500.php b/src/Contexts/ContextMySql50500.php index 02acdac..a015dd8 100644 --- a/src/Contexts/ContextMySql50500.php +++ b/src/Contexts/ContextMySql50500.php @@ -163,8 +163,8 @@ class ContextMySql50500 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, 'NO RELEASE' => 7, - 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, + 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, 'LINEAR HASH' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, @@ -174,7 +174,7 @@ class ContextMySql50500 extends Context 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, 'GENERATED ALWAYS' => 7, 'RIGHT OUTER JOIN' => 7, 'NATURAL LEFT JOIN' => 7, 'START TRANSACTION' => 7, - 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, + 'LOCK IN SHARE MODE' => 7, 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, 'DEFAULT CHARACTER SET' => 7, 'NATURAL LEFT OUTER JOIN' => 7, 'NATURAL RIGHT OUTER JOIN' => 7, 'WITH CONSISTENT SNAPSHOT' => 7, diff --git a/src/Contexts/ContextMySql50600.php b/src/Contexts/ContextMySql50600.php index 1143978..94655ae 100644 --- a/src/Contexts/ContextMySql50600.php +++ b/src/Contexts/ContextMySql50600.php @@ -169,8 +169,8 @@ class ContextMySql50600 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, 'NO RELEASE' => 7, - 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, + 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, 'LINEAR HASH' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, @@ -180,7 +180,7 @@ class ContextMySql50600 extends Context 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, 'GENERATED ALWAYS' => 7, 'RIGHT OUTER JOIN' => 7, 'NATURAL LEFT JOIN' => 7, 'START TRANSACTION' => 7, - 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, + 'LOCK IN SHARE MODE' => 7, 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, 'DEFAULT CHARACTER SET' => 7, 'NATURAL LEFT OUTER JOIN' => 7, 'NATURAL RIGHT OUTER JOIN' => 7, 'WITH CONSISTENT SNAPSHOT' => 7, diff --git a/src/Contexts/ContextMySql50700.php b/src/Contexts/ContextMySql50700.php index 04f410b..9f83e0f 100644 --- a/src/Contexts/ContextMySql50700.php +++ b/src/Contexts/ContextMySql50700.php @@ -175,8 +175,8 @@ class ContextMySql50700 extends Context 'AND CHAIN' => 7, 'FULL JOIN' => 7, 'IF EXISTS' => 7, 'LEFT JOIN' => 7, 'LESS THAN' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7, 'UNION ALL' => 7, - 'CROSS JOIN' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, 'NO RELEASE' => 7, - 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, + 'CROSS JOIN' => 7, 'FOR UPDATE' => 7, 'INNER JOIN' => 7, 'LINEAR KEY' => 7, + 'NO RELEASE' => 7, 'OR REPLACE' => 7, 'RIGHT JOIN' => 7, 'LINEAR HASH' => 7, 'AND NO CHAIN' => 7, 'FOR EACH ROW' => 7, 'NATURAL JOIN' => 7, 'PARTITION BY' => 7, 'SET PASSWORD' => 7, 'SQL SECURITY' => 7, @@ -186,7 +186,7 @@ class ContextMySql50700 extends Context 'INDEX DIRECTORY' => 7, 'LEFT OUTER JOIN' => 7, 'SUBPARTITION BY' => 7, 'GENERATED ALWAYS' => 7, 'RIGHT OUTER JOIN' => 7, 'NATURAL LEFT JOIN' => 7, 'START TRANSACTION' => 7, - 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, + 'LOCK IN SHARE MODE' => 7, 'NATURAL RIGHT JOIN' => 7, 'SELECT TRANSACTION' => 7, 'DEFAULT CHARACTER SET' => 7, 'NATURAL LEFT OUTER JOIN' => 7, 'NATURAL RIGHT OUTER JOIN' => 7, 'WITH CONSISTENT SNAPSHOT' => 7, diff --git a/src/Parser.php b/src/Parser.php index d98e8dc..ddefc7e 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -111,6 +111,12 @@ class Parser 'class' => 'SqlParser\\Components\\OptionsArray', 'field' => 'options', ), + '_END_OPTIONS' => array( + 'class' => 'SqlParser\\Components\\OptionsArray', + 'field' => 'end_options', + ), + + 'UNION' => array( 'class' => 'SqlParser\\Components\\UnionKeyword', 'field' => 'union', diff --git a/src/Statement.php b/src/Statement.php index b4769ef..fd169df 100644 --- a/src/Statement.php +++ b/src/Statement.php @@ -352,10 +352,23 @@ abstract class Statement $parsedOptions = true; } } elseif ($class === null) { - // There is no parser for this keyword and isn't the beginning - // of a statement (so no options) either. - $parser->error(__('Unrecognized keyword.'), $token); - continue; + // Handle special end options in Select statement + // See Statements\SelectStatement::$END_OPTIONS + if (get_class($this) === 'SqlParser\Statements\SelectStatement' + && ($token->value === 'FOR UPDATE' + || $token->value === 'LOCK IN SHARE MODE') + ) { + $this->end_options = OptionsArray::parse( + $parser, + $list, + static::$END_OPTIONS + ); + } else { + // There is no parser for this keyword and isn't the beginning + // of a statement (so no options) either. + $parser->error(__('Unrecognized keyword.'), $token); + continue; + } } $this->before($parser, $list, $token); diff --git a/src/Statements/SelectStatement.php b/src/Statements/SelectStatement.php index 8ff0b45..624a0c5 100644 --- a/src/Statements/SelectStatement.php +++ b/src/Statements/SelectStatement.php @@ -74,6 +74,11 @@ class SelectStatement extends Statement 'SQL_CALC_FOUND_ROWS' => 9, ); + public static $END_OPTIONS = array( + 'FOR UPDATE' => 1, + 'LOCK IN SHARE MODE' => 1 + ); + /** * The clauses of this statement, in order. * @@ -111,6 +116,7 @@ class SelectStatement extends Statement 'LIMIT' => array('LIMIT', 3), 'PROCEDURE' => array('PROCEDURE', 3), 'UNION' => array('UNION', 1), + '_END_OPTIONS' => array('_END_OPTIONS', 1) // These are available only when `UNION` is present. // 'ORDER BY' => array('ORDER BY', 3), // 'LIMIT' => array('LIMIT', 3), @@ -201,6 +207,15 @@ class SelectStatement extends Statement public $union = array(); /** + * The end options of this query. + * + * @var OptionsArray + * + * @see static::$END_OPTIONS + */ + public $end_options; + + /** * Gets the clauses of this statement. * * @return array |