--- /dev/null
+.. 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.
"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())
)
"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())
)
"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()),
)
)
],
)
+ @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