mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-17 06:07:27 -04:00
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:
+13
@@ -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.
|
||||
@@ -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()),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user