Skip to content

Commit 6750633

Browse files
author
Jesse Whitehouse
committed
Implement suggest fix from #51 which now passes the integration test provided
Signed-off-by: Jesse Whitehouse <[email protected]>
1 parent aafbdfa commit 6750633

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

src/databricks/sql/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def escape_string(self, item):
146146
# This is good enough when backslashes are literal, newlines are just followed, and the way
147147
# to escape a single quote is to put two single quotes.
148148
# (i.e. only special character is single quote)
149-
return "'{}'".format(item.replace("'", "\\'"))
149+
return "'{}'".format(item.replace('\\','\\\\' ).replace("'", "\\'"))
150150

151151
def escape_sequence(self, item):
152152
l = map(str, map(self.escape_item, item))

tests/unit/test_param_escaper.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,27 +38,39 @@ def test_escape_string_that_includes_special_characters(self):
3838

3939
# Testing for the presence of these characters: '"/\😂
4040

41-
assert pe.escape_string("his name was 'robert palmer'") == "'his name was \'robert palmer\''"
41+
assert pe.escape_string("his name was 'robert palmer'") == r"'his name was \'robert palmer\''"
4242

4343
# These two tests represent the same user input in the several ways it can be written in Python
4444
# Each argument to `escape_string` evaluates to the same bytes. But Python lets us write it differently.
4545
assert pe.escape_string("his name was \"robert palmer\"") == "'his name was \"robert palmer\"'"
4646
assert pe.escape_string('his name was "robert palmer"') == "'his name was \"robert palmer\"'"
4747
assert pe.escape_string('his name was {}'.format('"robert palmer"')) == "'his name was \"robert palmer\"'"
4848

49-
assert pe.escape_string("his name was robert / palmer") == "'his name was robert / palmer'"
49+
assert pe.escape_string("his name was robert / palmer") == r"'his name was robert / palmer'"
5050

5151
# If you need to include a single backslash, use an r-string to prevent Python from raising a
5252
# DeprecationWarning for an invalid escape sequence
53-
assert pe.escape_string(r"his name was robert \/ palmer") == "'his name was robert \\/ palmer'"
54-
assert pe.escape_string("his name was robert \\ palmer") == "'his name was robert \\ palmer'"
55-
assert pe.escape_string("his name was robert \\\\ palmer") == "'his name was robert \\\\ palmer'"
53+
assert pe.escape_string("his name was robert \\/ palmer") == r"'his name was robert \\/ palmer'"
54+
assert pe.escape_string("his name was robert \\ palmer") == r"'his name was robert \\ palmer'"
55+
assert pe.escape_string("his name was robert \\\\ palmer") == r"'his name was robert \\\\ palmer'"
5656

57-
assert pe.escape_string("his name was robert palmer 😂") == "'his name was robert palmer 😂'"
57+
assert pe.escape_string("his name was robert palmer 😂") == r"'his name was robert palmer 😂'"
5858

5959
# Adding the test from PR #56 to prove escape behaviour
6060

61-
assert pe.escape_string("you're") == "'you\'re'"
61+
assert pe.escape_string("you're") == r"'you\'re'"
62+
63+
# Adding this test from #51 to prove escape behaviour when the target string involves repeated SQL escape chars
64+
assert pe.escape_string("cat\\'s meow") == r"'cat\\\'s meow'"
65+
66+
# Tests from the docs: https://docs.databricks.com/sql/language-manual/data-types/string-type.html
67+
68+
assert pe.escape_string('Spark') == "'Spark'"
69+
assert pe.escape_string("O'Connell") == r"'O\'Connell'"
70+
assert pe.escape_string("Some\\nText") == r"'Some\\nText'"
71+
assert pe.escape_string("Some\\\\nText") == r"'Some\\\\nText'"
72+
assert pe.escape_string("서울시") == "'서울시'"
73+
assert pe.escape_string("\\\\") == r"'\\\\'"
6274

6375
def test_escape_date_time(self):
6476
INPUT = datetime(1991,8,3,21,55)

0 commit comments

Comments
 (0)