From 85b4101a11f3bbb0d6685d6bd5d04e333cfebe51 Mon Sep 17 00:00:00 2001 From: Jan Tvrdik Date: Sun, 23 Jun 2019 12:28:23 +0200 Subject: [PATCH] BaseDriver: fix parsing of SQL with trailing comment without EOL [closes #102] --- src/Drivers/BaseDriver.php | 6 +++++- tests/cases/unit/BaseDriverTest.phpt | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Drivers/BaseDriver.php b/src/Drivers/BaseDriver.php index ff48771..bdcfe89 100644 --- a/src/Drivers/BaseDriver.php +++ b/src/Drivers/BaseDriver.php @@ -71,7 +71,7 @@ public function loadFile($path) $parseOffset = 0; $queries = 0; - $space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\\n]*\\n|--\\n)"; + $space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\\n]*(?:\\n|\\z)|--(?:\\n|\\z))"; $spacesRe = "~\\G{$space}*\\z~"; $delimiter = ';'; $delimiterRe = "~\\G{$space}*DELIMITER\\s+(\\S+)~i"; @@ -106,6 +106,10 @@ public function loadFile($path) $endRe = isset($endReTable[$found]) ? $endReTable[$found] : '(' . (preg_match('~^-- |^#~', $found) ? "\n" : preg_quote($found) . "|\\\\.") . '|\z)s'; while (preg_match($endRe, $content, $match, PREG_OFFSET_CAPTURE, $parseOffset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES $s = $match[0][0]; + if (strlen($s) === 0) { + break 3; + } + $parseOffset = $match[0][1] + strlen($s); if ($s[0] !== '\\') { continue 2; diff --git a/tests/cases/unit/BaseDriverTest.phpt b/tests/cases/unit/BaseDriverTest.phpt index 79a2540..73caaaf 100644 --- a/tests/cases/unit/BaseDriverTest.phpt +++ b/tests/cases/unit/BaseDriverTest.phpt @@ -77,7 +77,24 @@ class BaseDriverTest extends Tester\TestCase "\nCREATE TRIGGER `users_bu` BEFORE UPDATE ON `users` FOR EACH ROW BEGIN SELECT 1; END; ", "\nSELECT 2", ] - ] + ], + [ + '-- ', [], + ], + [ + "--\n", [], + ], + [ + "SELECT 1;\n--", [ + 'SELECT 1' + ], + ], + [ + "SELECT 1;\n--\nSELECT 2;", [ + 'SELECT 1', + "\n--\nSELECT 2", + ], + ], ]; } }