diff options
| author | casey <casey@cloudera.com> | 2015-02-26 12:32:46 -0800 |
|---|---|---|
| committer | casey <casey@cloudera.com> | 2015-02-26 12:32:46 -0800 |
| commit | e75e35869473832a1eb67772b1adfee2db11b85a (patch) | |
| tree | ad6003130092f9fac951ba29740162cb6931a6d9 | |
| parent | 77e0789aea8918a2fbbc6f20196cd0bcdecccf52 (diff) | |
| download | sqlparse-e75e35869473832a1eb67772b1adfee2db11b85a.tar.gz | |
Recognize escaped backslashes within strings
Previously if a single quoted string ended with an escaped backslash,
parsing would not consider the string to be terminated.
| -rw-r--r-- | sqlparse/lexer.py | 3 | ||||
| -rw-r--r-- | tests/test_split.py | 4 |
2 files changed, 5 insertions, 2 deletions
diff --git a/sqlparse/lexer.py b/sqlparse/lexer.py index 3e9a1a6..5282ad3 100644 --- a/sqlparse/lexer.py +++ b/sqlparse/lexer.py @@ -191,8 +191,7 @@ class Lexer(object): (r'[-]?[0-9]*(\.[0-9]+)?[eE][-]?[0-9]+', tokens.Number.Float), (r'[-]?[0-9]*\.[0-9]+', tokens.Number.Float), (r'[-]?[0-9]+', tokens.Number.Integer), - # TODO: Backslash escapes? - (r"'(''|\\'|[^'])*'", tokens.String.Single), + (r"'(''|\\\\|\\'|[^'])*'", tokens.String.Single), # not a real string literal in ANSI SQL: (r'(""|".*?[^\\]")', tokens.String.Symbol), (r'(?<=[\w\]])(\[[^\]]*?\])', tokens.Punctuation.ArrayIndex), diff --git a/tests/test_split.py b/tests/test_split.py index e4ebf7e..54e8d04 100644 --- a/tests/test_split.py +++ b/tests/test_split.py @@ -22,6 +22,10 @@ class SQLSplitTest(TestCaseBase): self.ndiffAssertEqual(unicode(stmts[0]), self._sql1) self.ndiffAssertEqual(unicode(stmts[1]), sql2) + def test_split_backslash(self): + stmts = sqlparse.parse(r"select '\\'; select '\''; select '\\\'';") + self.assertEqual(len(stmts), 3) + def test_create_function(self): sql = load_file('function.sql') stmts = sqlparse.parse(sql) |
