From aa3f354b63b65ffe099b940e5105892eb96f2b8d Mon Sep 17 00:00:00 2001 From: Grieve Date: Tue, 5 Nov 2024 18:37:48 +0800 Subject: [PATCH 1/2] fix(mssql): handle special characters --- ibis/backends/mssql/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ibis/backends/mssql/__init__.py b/ibis/backends/mssql/__init__.py index b682bdfce65a..c640f58e8001 100644 --- a/ibis/backends/mssql/__init__.py +++ b/ibis/backends/mssql/__init__.py @@ -176,13 +176,17 @@ def do_connect( self.con = pyodbc.connect( user=user, server=f"{host},{port}", - password=password, + password=self._escape_special_characters(password), driver=driver, **kwargs, ) self._post_connect() + @staticmethod + def _escape_special_characters(value: str) -> str: + return "{" + value.replace("}", "}}") + "}" + @util.experimental @classmethod def from_connection(cls, con: pyodbc.Connection) -> Backend: From eecabe5714ea9d8b302a1e38b64e231559db241a Mon Sep 17 00:00:00 2001 From: Grieve Date: Wed, 6 Nov 2024 18:03:04 +0800 Subject: [PATCH 2/2] test(mssql): add test case --- ibis/backends/mssql/tests/test_client.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ibis/backends/mssql/tests/test_client.py b/ibis/backends/mssql/tests/test_client.py index b11030dfe875..5db3665027d9 100644 --- a/ibis/backends/mssql/tests/test_client.py +++ b/ibis/backends/mssql/tests/test_client.py @@ -300,3 +300,14 @@ def test_create_temp_table(con, temp): assert t.columns == ("a",) finally: con.drop_table(name) + + +def test_escape_special_characters(): + test_func = ibis.backends.mssql.Backend._escape_special_characters + assert test_func("1bis_Testing!") == "{1bis_Testing!}" + assert test_func("{1bis_Testing!") == "{{1bis_Testing!}" + assert test_func("1bis_Testing!}") == "{1bis_Testing!}}}" + assert test_func("{1bis_Testing!}") == "{{1bis_Testing!}}}" + assert test_func("1bis}Testing!") == "{1bis}}Testing!}" + assert test_func("{R;3G1/8Al2AniRye") == "{{R;3G1/8Al2AniRye}" + assert test_func("{R;3G1/8Al2AniRye}") == "{{R;3G1/8Al2AniRye}}}"