diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 224690cc29..25a8d4c190 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -6,6 +6,20 @@ .. changelog:: :version: 0.8.1 + .. change:: + :tags: bug, mssql + :tickets: 2355 + + Part of a longer series of fixes needed for pyodbc+ + mssql, a CAST to NVARCHAR(max) has been added to the bound + parameter for the table name and schema name in all information schema + queries to avoid the issue of comparing NVARCHAR to NTEXT, + which seems to be rejected by the ODBC driver in some cases, + such as FreeTDS (0.91 only?) plus unicode bound parameters being passed. + The issue seems to be specific to the SQL Server information + schema tables and the workaround is harmless for those cases + where the problem doesn't exist in the first place. + .. change:: :tags: bug, sql :tickets: 2691 diff --git a/lib/sqlalchemy/dialects/mssql/information_schema.py b/lib/sqlalchemy/dialects/mssql/information_schema.py index 35ce2450e0..80e59d323e 100644 --- a/lib/sqlalchemy/dialects/mssql/information_schema.py +++ b/lib/sqlalchemy/dialects/mssql/information_schema.py @@ -8,6 +8,7 @@ from ... import Table, MetaData, Column from ...types import String, Unicode, Integer, TypeDecorator +from ... import cast ischema = MetaData() @@ -22,6 +23,9 @@ class CoerceUnicode(TypeDecorator): # end Py2K return value + def bind_expression(self, bindvalue): + return cast(bindvalue, Unicode) + schemata = Table("SCHEMATA", ischema, Column("CATALOG_NAME", CoerceUnicode, key="catalog_name"), Column("SCHEMA_NAME", CoerceUnicode, key="schema_name"), diff --git a/test/dialect/test_mssql.py b/test/dialect/test_mssql.py index 0dfda9015c..f1cd3fe85b 100644 --- a/test/dialect/test_mssql.py +++ b/test/dialect/test_mssql.py @@ -1949,7 +1949,7 @@ class TypeRoundTripTest(fixtures.TestBase, AssertsExecutionResults, ComparesTabl engine.execute(tbl.delete()) class MonkeyPatchedBinaryTest(fixtures.TestBase): - __only_on__ = 'mssql' + __only_on__ = 'mssql+pymssql' def test_unicode(self): module = __import__('pymssql')