.. changelog::
:version: 0.8.2
+ .. change::
+ :tags: bug, mssql
+ :tickets: 2747
+
+ When querying the information schema on SQL Server 2000, removed
+ a CAST call that was added in 0.8.1 to help with driver issues,
+ which apparently is not compatible on 2000.
+ The CAST remains in place for SQL Server 2005 and greater.
+
.. change::
:tags: bug, mysql
:tickets: 2721
from ... import Table, MetaData, Column
from ...types import String, Unicode, Integer, TypeDecorator
from ... import cast
+from ... import util
+from ...sql import expression
+from ...ext.compiler import compiles
ischema = MetaData()
-
class CoerceUnicode(TypeDecorator):
impl = Unicode
return value
def bind_expression(self, bindvalue):
- return cast(bindvalue, Unicode)
+ return _cast_on_2005(bindvalue)
+
+class _cast_on_2005(expression.ColumnElement):
+ def __init__(self, bindvalue):
+ self.bindvalue = bindvalue
+
+@compiles(_cast_on_2005)
+def _compile(element, compiler, **kw):
+ from . import base
+ if compiler.dialect.server_version_info < base.MS_2005_VERSION:
+ return compiler.process(element.bindvalue, **kw)
+ else:
+ return compiler.process(cast(element.bindvalue, Unicode), **kw)
schemata = Table("SCHEMATA", ischema,
Column("CATALOG_NAME", CoerceUnicode, key="catalog_name"),
fp.close()
return stream
-class InfoCoerceUnicodeTest(fixtures.TestBase):
+from sqlalchemy.dialects.mssql.information_schema import CoerceUnicode, tables
+from sqlalchemy.dialects.mssql import base
+
+class InfoCoerceUnicodeTest(fixtures.TestBase, AssertsCompiledSQL):
def test_info_unicode_coercion(self):
- from sqlalchemy.dialects.mssql.information_schema import CoerceUnicode
dialect = mssql.dialect()
value = CoerceUnicode().bind_processor(dialect)('a string')
assert isinstance(value, unicode)
+ def test_info_unicode_cast_no_2000(self):
+ dialect = mssql.dialect()
+ dialect.server_version_info = base.MS_2000_VERSION
+ stmt = tables.c.table_name == 'somename'
+ self.assert_compile(
+ stmt,
+ "[TABLES_1].[TABLE_NAME] = :TABLE_NAME_1",
+ dialect=dialect
+ )
+
+ def test_info_unicode_cast(self):
+ dialect = mssql.dialect()
+ dialect.server_version_info = base.MS_2005_VERSION
+ stmt = tables.c.table_name == 'somename'
+ self.assert_compile(
+ stmt,
+ "[TABLES_1].[TABLE_NAME] = CAST(:TABLE_NAME_1 AS NVARCHAR(max))",
+ dialect=dialect
+ )
+
class ReflectHugeViewTest(fixtures.TestBase):
__only_on__ = 'mssql'