]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fix mssql dialect escaping object names containing ']'
authorGord Thompson <gord@gordthompson.com>
Sat, 18 Jul 2020 00:06:41 +0000 (18:06 -0600)
committerGord Thompson <gord@gordthompson.com>
Sat, 18 Jul 2020 12:49:19 +0000 (06:49 -0600)
Fixes: #5467
Change-Id: I054ec219717ba62847a9daf1214e215dd6b70633

doc/build/changelog/unreleased_13/5467.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/mssql/base.py
test/dialect/mssql/test_compiler.py

diff --git a/doc/build/changelog/unreleased_13/5467.rst b/doc/build/changelog/unreleased_13/5467.rst
new file mode 100644 (file)
index 0000000..241bdb7
--- /dev/null
@@ -0,0 +1,6 @@
+.. change::
+    :tags: bug, mssql, sql
+    :tickets: 5467
+
+    Fixed bug where the mssql dialect incorrectly escaped object names that
+    contained ']' character(s).
index c3cc4e425ff08edc5e69cf2152adb6b3e057440c..0ec6cf8a358218289ce2ffa540e6d3d058188030 100644 (file)
@@ -2244,7 +2244,10 @@ class MSIdentifierPreparer(compiler.IdentifierPreparer):
         )
 
     def _escape_identifier(self, value):
-        return value
+        return value.replace("]", "]]")
+
+    def _unescape_identifier(self, value):
+        return value.replace("]]", "]")
 
     def quote_schema(self, schema, force=None):
         """Prepare a quoted table and schema name."""
index 732ff1f552fbbeffdd734fa7ce13c67443e287e7..83a6108882eb8fd926787a0c5f2d73e5e93b915c 100644 (file)
@@ -40,10 +40,23 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL):
         self.assert_compile(sql.false(), "0")
         self.assert_compile(sql.true(), "1")
 
-    def test_select(self):
-        t = table("sometable", column("somecolumn"))
+    @testing.combinations(
+        ("plain", "sometable", "sometable"),
+        ("matched_square_brackets", "colo[u]r", "[colo[u]]r]"),
+        ("unmatched_left_square_bracket", "colo[ur", "[colo[ur]"),
+        ("unmatched_right_square_bracket", "colou]r", "[colou]]r]"),
+        ("double quotes", 'Edwin "Buzz" Aldrin', '[Edwin "Buzz" Aldrin]'),
+        ("dash", "Dash-8", "[Dash-8]"),
+        ("slash", "tl/dr", "[tl/dr]"),
+        ("space", "Red Deer", "[Red Deer]"),
+        ("question mark", "OK?", "[OK?]"),
+        ("percent", "GST%", "[GST%]"),
+        id_="iaa",
+    )
+    def test_identifier_rendering(self, table_name, rendered_name):
+        t = table(table_name, column("somecolumn"))
         self.assert_compile(
-            t.select(), "SELECT sometable.somecolumn FROM sometable"
+            t.select(), "SELECT {0}.somecolumn FROM {0}".format(rendered_name)
         )
 
     def test_select_with_nolock(self):