CAST bind values against SQL Server sys into NVARCHAR

Ensured that the queries used to reflect indexes and view definitions will
explicitly CAST string parameters into NVARCHAR, as many SQL Server drivers
frequently treat string values, particularly those with non-ascii
characters or larger string values, as TEXT which often don't compare
correctly against VARCHAR characters in SQL Server's information schema
tables for some reason.    These CAST operations already take place for
reflection queries against SQL Server ``information_schema.`` tables but
were missing from three additional queries that are against ``sys.``
tables.

Fixes: #4745
Change-Id: I3056533bf1a1e8ef17742879d369ab13f8b704ea
This commit is contained in:
Mike Bayer
2019-06-28 10:41:38 -04:00
parent 502cd9240e
commit 345f2eb05b
3 changed files with 36 additions and 6 deletions
+13
View File
@@ -0,0 +1,13 @@
.. change::
:tags: bug, mssql
:tickets: 4745
Ensured that the queries used to reflect indexes and view definitions will
explicitly CAST string parameters into NVARCHAR, as many SQL Server drivers
frequently treat string values, particularly those with non-ascii
characters or larger string values, as TEXT which often don't compare
correctly against VARCHAR characters in SQL Server's information schema
tables for some reason. These CAST operations already take place for
reflection queries against SQL Server ``information_schema.`` tables but
were missing from three additional queries that are against ``sys.``
tables.
+6 -6
View File
@@ -2426,8 +2426,8 @@ class MSDialect(default.DefaultDialect):
"and ind.is_primary_key=0 and ind.type != 0"
)
.bindparams(
sql.bindparam("tabname", tablename, sqltypes.String()),
sql.bindparam("schname", owner, sqltypes.String()),
sql.bindparam("tabname", tablename, ischema.CoerceUnicode()),
sql.bindparam("schname", owner, ischema.CoerceUnicode()),
)
.columns(name=sqltypes.Unicode())
)
@@ -2451,8 +2451,8 @@ class MSDialect(default.DefaultDialect):
"and sch.name=:schname"
)
.bindparams(
sql.bindparam("tabname", tablename, sqltypes.String()),
sql.bindparam("schname", owner, sqltypes.String()),
sql.bindparam("tabname", tablename, ischema.CoerceUnicode()),
sql.bindparam("schname", owner, ischema.CoerceUnicode()),
)
.columns(name=sqltypes.Unicode())
)
@@ -2477,8 +2477,8 @@ class MSDialect(default.DefaultDialect):
"views.schema_id=sch.schema_id and "
"views.name=:viewname and sch.name=:schname"
).bindparams(
sql.bindparam("viewname", viewname, sqltypes.String()),
sql.bindparam("schname", owner, sqltypes.String()),
sql.bindparam("viewname", viewname, ischema.CoerceUnicode()),
sql.bindparam("schname", owner, ischema.CoerceUnicode()),
)
)
+17
View File
@@ -208,6 +208,23 @@ class ReflectionTest(fixtures.TestBase, ComparesTables, AssertsCompiledSQL):
],
)
@testing.provide_metadata
def test_table_name_that_is_greater_than_16_chars(self):
metadata = self.metadata
Table(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
metadata,
Column("id", Integer, primary_key=True),
Column("foo", Integer),
Index("foo_idx", "foo"),
)
metadata.create_all()
t = Table(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ", MetaData(), autoload_with=testing.db
)
eq_(t.name, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
@testing.provide_metadata
def test_db_qualified_items(self):
metadata = self.metadata