Skip to content

Commit 29bab86

Browse files
author
Jesse Whitehouse
committed
Fixes #51 and adds unit tests.
Signed-off-by: Jesse Whitehouse <[email protected]>
1 parent dd25478 commit 29bab86

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

src/databricks/sql/utils.py

+1-1
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("'", "\'"))
150150

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

tests/unit/test_param_escaper.py

+32-6
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,41 @@ def test_escape_string_normal(self):
2424

2525
assert pe.escape_string("golly bob howdy") == "'golly bob howdy'"
2626

27-
def test_escape_string_that_includes_single_quotes(self):
28-
# e.g. INPUT: his name was 'robert palmer'
29-
# e.g. OUTPUT: 'his name was ''robert palmer'''
27+
def test_escape_string_that_includes_special_characters(self):
28+
"""Tests for how special characters are treated.
3029
31-
assert pe.escape_string("his name was 'robert palmer'") == "'his name was ''robert palmer'''"
30+
When passed a string, the `escape_string` method wraps it in single quotes
31+
and escapes any special characters with a back stroke (\)
3232
33-
def test_escape_string_that_includes_special_characters(self):
33+
Example:
34+
35+
IN : his name was 'robert palmer'
36+
OUT: 'his name was \'robert palmer\''
37+
"""
38+
39+
# Testing for the presence of these characters: '"/\😂
40+
41+
assert pe.escape_string("his name was 'robert palmer'") == "'his name was \'robert palmer\''"
42+
43+
# These two tests represent the same user input in the several ways it can be written in Python
44+
# Each argument to `escape_string` evaluates to the same bytes. But Python lets us write it differently.
45+
assert pe.escape_string("his name was \"robert palmer\"") == "'his name was \"robert palmer\"'"
46+
assert pe.escape_string('his name was "robert palmer"') == "'his name was \"robert palmer\"'"
47+
assert pe.escape_string('his name was {}'.format('"robert palmer"')) == "'his name was \"robert palmer\"'"
48+
49+
assert pe.escape_string("his name was robert / palmer") == "'his name was robert / palmer'"
50+
51+
# If you need to include a single backslash, use an r-string to prevent Python from raising a
52+
# 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'"
56+
57+
assert pe.escape_string("his name was robert palmer 😂") == "'his name was robert palmer 😂'"
58+
59+
# Adding the test from PR #56 to prove escape behaviour
3460

35-
assert pe.escape_string("his name was 'robert palmer'") == "'his name was ''robert palmer'''"
61+
assert pe.escape_string("you're") == "'you\'re'"
3662

3763
def test_escape_date_time(self):
3864
INPUT = datetime(1991,8,3,21,55)

0 commit comments

Comments
 (0)