summaryrefslogtreecommitdiffstats
path: root/src/Statement.php
diff options
context:
space:
mode:
authorDeven Bansod <devenbansod.bits@gmail.com>2016-09-13 15:25:04 +0530
committerDeven Bansod <devenbansod.bits@gmail.com>2016-09-13 15:25:04 +0530
commit0b6743bdee44f8e12d02c9122a2f7bb124cfa293 (patch)
tree766378a800bfc4246faee0bee1c0d020ec2f652f /src/Statement.php
parent98c2a72dd19542d80dcee63eb50c199e5f9a2935 (diff)
downloadsql-parser-0b6743bdee44f8e12d02c9122a2f7bb124cfa293.zip
sql-parser-0b6743bdee44f8e12d02c9122a2f7bb124cfa293.tar.gz
sql-parser-0b6743bdee44f8e12d02c9122a2f7bb124cfa293.tar.bz2
Stop SelectStatement parsing and revert back in case of ON DUPLICATE KEY
Fix parsing of INSERT INTO ... SELECT .... ON DUPLICATE KEY Fix #78 Signed-off-by: Deven Bansod <devenbansod.bits@gmail.com>
Diffstat (limited to 'src/Statement.php')
-rw-r--r--src/Statement.php25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/Statement.php b/src/Statement.php
index 2b81a84..5dfcf3a 100644
--- a/src/Statement.php
+++ b/src/Statement.php
@@ -254,6 +254,31 @@ abstract class Statement
break;
}
+ $lastIdx = $list->idx;
+
+ // ON DUPLICATE KEY UPDATE ...
+ // has to be parsed in parent statement (INSERT or REPLACE)
+ // so look for it and break
+ if (get_class($this) === 'SqlParser\Statements\SelectStatement'
+ && $token->value === 'ON'
+ ) {
+ ++$list->idx; // Skip ON
+
+ // look for ON DUPLICATE KEY UPDATE
+ $first = $list->getNextOfType(Token::TYPE_KEYWORD);
+ $second = $list->getNextOfType(Token::TYPE_KEYWORD);
+ $third = $list->getNextOfType(Token::TYPE_KEYWORD);
+
+ if ($first->value === 'DUPLICATE'
+ && $second->value === 'KEY'
+ && $third->value === 'UPDATE'
+ ) {
+ $list->idx = $lastIdx;
+ break;
+ }
+ }
+ $list->idx = $lastIdx;
+
/**
* The name of the class that is used for parsing.
*