summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Contexts/ContextMySql50000.php6
-rw-r--r--src/Contexts/ContextMySql50100.php6
-rw-r--r--src/Contexts/ContextMySql50500.php6
-rw-r--r--src/Contexts/ContextMySql50600.php6
-rw-r--r--src/Contexts/ContextMySql50700.php6
-rw-r--r--src/Parser.php6
-rw-r--r--src/Statement.php21
-rw-r--r--src/Statements/SelectStatement.php15
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