summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Ungureanu <udan1107@gmail.com>2015-07-24 23:40:09 +0300
committerDan Ungureanu <udan1107@gmail.com>2015-07-25 00:02:57 +0300
commit997d824f8e066a64b121e60f6631e53c44fbb28f (patch)
tree7af902ff8684106df73f7cc8a928c1324f87eed4
parentde326a433bcb827360f7c4c8b0ea57e92d6f3a18 (diff)
downloadsql-parser-997d824f8e066a64b121e60f6631e53c44fbb28f.zip
sql-parser-997d824f8e066a64b121e60f6631e53c44fbb28f.tar.gz
sql-parser-997d824f8e066a64b121e60f6631e53c44fbb28f.tar.bz2
Using the usual parsing method for transactions.
-rw-r--r--src/Parser.php3
-rw-r--r--src/Statement.php9
-rw-r--r--src/Statements/TransactionStatement.php6
-rw-r--r--tests/data/parser/parseTransactionErr1.out2
4 files changed, 11 insertions, 9 deletions
diff --git a/src/Parser.php b/src/Parser.php
index 36b6aec..249291c 100644
--- a/src/Parser.php
+++ b/src/Parser.php
@@ -436,6 +436,9 @@ namespace SqlParser {
$this->statements[] = $statement;
} elseif ($statement->type === TransactionStatement::TYPE_END) {
if ($lastTransaction === null) {
+ // Even though an error occurred, the query is being
+ // saved.
+ $this->statements[] = $statement;
$this->error(
__('No transaction was previously started.'),
$token
diff --git a/src/Statement.php b/src/Statement.php
index ea433c6..07d73d6 100644
--- a/src/Statement.php
+++ b/src/Statement.php
@@ -188,7 +188,7 @@ abstract class Statement
* default.
* @var bool $parsedOptions
*/
- $parsedOptions = !empty(static::$OPTIONS) ? false : true;
+ $parsedOptions = empty(static::$OPTIONS);
for (; $list->idx < $list->count; ++$list->idx) {
/**
@@ -257,7 +257,10 @@ abstract class Statement
}
$parsedBeginning = true;
if (!$parsedOptions) {
- ++$list->idx; // Skipping keyword.
+ if (empty(static::$OPTIONS[$token->value])) {
+ // Skipping keyword because if it is not a option.
+ ++$list->idx;
+ }
$this->options = OptionsArray::parse(
$parser,
$list,
@@ -276,7 +279,7 @@ abstract class Statement
// Parsing this keyword.
if ($class !== null) {
- ++$list->idx; // Skipping keyword.
+ ++$list->idx; // Skipping keyword or last option.
$this->$field = $class::parse($parser, $list, $options);
}
diff --git a/src/Statements/TransactionStatement.php b/src/Statements/TransactionStatement.php
index e7a13de..d7c9dbf 100644
--- a/src/Statements/TransactionStatement.php
+++ b/src/Statements/TransactionStatement.php
@@ -88,11 +88,7 @@ class TransactionStatement extends Statement
*/
public function parse(Parser $parser, TokensList $list)
{
- $this->options = OptionsArray::parse(
- $parser,
- $list,
- static::$OPTIONS
- );
+ parent::parse($parser, $list);
// Checks the type of this query.
if (($this->options->has('START TRANSACTION'))
diff --git a/tests/data/parser/parseTransactionErr1.out b/tests/data/parser/parseTransactionErr1.out
index 42f19b8..acebd9b 100644
--- a/tests/data/parser/parseTransactionErr1.out
+++ b/tests/data/parser/parseTransactionErr1.out
@@ -1 +1 @@
-a:4:{s:5:"query";s:7:"COMMIT;";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:7:"COMMIT;";s:3:"len";i:7;s:4:"last";i:7;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:3:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"COMMIT";s:5:"value";s:6:"COMMIT";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:0;}i:1;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:3;s:3:"idx";i:3;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:38:"No transaction was previously started.";i:1;r:10;i:2;i:0;}}}} \ No newline at end of file
+a:4:{s:5:"query";s:7:"COMMIT;";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:7:"COMMIT;";s:3:"len";i:7;s:4:"last";i:7;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:3:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"COMMIT";s:5:"value";s:6:"COMMIT";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:0;}i:1;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:3;s:3:"idx";i:3;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:41:"SqlParser\Statements\TransactionStatement":6:{s:4:"type";i:2;s:10:"statements";N;s:3:"end";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:6:"COMMIT";}}s:5:"first";i:0;s:4:"last";i:0;}}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:1:{i:0;a:3:{i:0;s:38:"No transaction was previously started.";i:1;r:10;i:2;i:0;}}}} \ No newline at end of file