]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- apply a similar fix for floats to mssql+pyodbc as we did to firebird
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 28 Dec 2013 22:50:19 +0000 (17:50 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 28 Dec 2013 22:51:51 +0000 (17:51 -0500)
- wrangle through osx+pyodbc+freetds to get at least test_suite to pass again
with mssql+pyodbc. invovled adding some silly requirements

doc/build/changelog/changelog_08.rst
lib/sqlalchemy/dialects/mssql/pyodbc.py
lib/sqlalchemy/testing/requirements.py
lib/sqlalchemy/testing/suite/test_types.py
test/requirements.py

index 96e855ed68ef180901091f1630f3c620defe72e6..497bf7643904af149afce05736e4c31edca78ed8 100644 (file)
         in order of RDB$FIELD_POSITION.
 
     .. change::
-        :tags: bug, firebird
+        :tags: bug, mssql, firebird
         :versions: 0.9.0b2
 
         The "asdecimal" flag used with the :class:`.Float` type will now
-        work with Firebird dialects; previously the decimal conversion was
-        not occurring.
+        work with Firebird as well as the mssql+pyodbc dialects; previously the
+        decimal conversion was not occurring.
 
     .. change::
         :tags: bug, mssql, pymssql
index beb6066f54324562d02ca06d2863d92072ddf88c..a0c0bd2ae6f2c6cbb16e13da4c6e781285c804ec 100644 (file)
@@ -116,8 +116,8 @@ from ...connectors.pyodbc import PyODBCConnector
 from ... import types as sqltypes, util
 import decimal
 
+class _ms_numeric_pyodbc(object):
 
-class _MSNumeric_pyodbc(sqltypes.Numeric):
     """Turns Decimals with adjusted() < 0 or > 7 into strings.
 
     The routines here are needed for older pyodbc versions
@@ -127,7 +127,7 @@ class _MSNumeric_pyodbc(sqltypes.Numeric):
 
     def bind_processor(self, dialect):
 
-        super_process = super(_MSNumeric_pyodbc, self).\
+        super_process = super(_ms_numeric_pyodbc, self).\
                         bind_processor(dialect)
 
         if not dialect._need_decimal_fix:
@@ -180,6 +180,11 @@ class _MSNumeric_pyodbc(sqltypes.Numeric):
                     [str(s) for s in _int][0:value.adjusted() + 1]))
         return result
 
+class _MSNumeric_pyodbc(_ms_numeric_pyodbc, sqltypes.Numeric):
+    pass
+
+class _MSFloat_pyodbc(_ms_numeric_pyodbc, sqltypes.Float):
+    pass
 
 class MSExecutionContext_pyodbc(MSExecutionContext):
     _embedded_scope_identity = False
@@ -238,7 +243,8 @@ class MSDialect_pyodbc(PyODBCConnector, MSDialect):
     colspecs = util.update_copy(
         MSDialect.colspecs,
         {
-            sqltypes.Numeric: _MSNumeric_pyodbc
+            sqltypes.Numeric: _MSNumeric_pyodbc,
+            sqltypes.Float: _MSFloat_pyodbc
         }
     )
 
index 64bc300e0bf22528a16b4b10f253fb23d2b3afe9..055b8ec7085ba86c7cb590c6537860f1de8fef26 100644 (file)
@@ -401,6 +401,16 @@ class SuiteRequirements(Requirements):
         """
         return exclusions.open()
 
+    @property
+    def fetch_null_from_numeric(self):
+        """target backend doesn't crash when you try to select a NUMERIC
+        value that has a value of NULL.
+
+        Added to support Pyodbc bug #351.
+        """
+
+        return exclusions.open()
+
     @property
     def text_type(self):
         """Target database must support an unbounded Text() "
index 4733e66660daed3966ef7abe132f3494cee444b4..e6de6e06c8426bba070dd3c6ea772581c4009f64 100644 (file)
@@ -271,15 +271,31 @@ class NumericTest(fixtures.TestBase):
     def test_numeric_as_decimal(self):
         self._do_test(
             Numeric(precision=8, scale=4),
-            [15.7563, decimal.Decimal("15.7563"), None],
-            [decimal.Decimal("15.7563"), None],
+            [15.7563, decimal.Decimal("15.7563")],
+            [decimal.Decimal("15.7563")],
         )
 
     def test_numeric_as_float(self):
         self._do_test(
             Numeric(precision=8, scale=4, asdecimal=False),
-            [15.7563, decimal.Decimal("15.7563"), None],
-            [15.7563, None],
+            [15.7563, decimal.Decimal("15.7563")],
+            [15.7563],
+        )
+
+    @testing.requires.fetch_null_from_numeric
+    def test_numeric_null_as_decimal(self):
+        self._do_test(
+            Numeric(precision=8, scale=4),
+            [None],
+            [None],
+        )
+
+    @testing.requires.fetch_null_from_numeric
+    def test_numeric_null_as_float(self):
+        self._do_test(
+            Numeric(precision=8, scale=4, asdecimal=False),
+            [None],
+            [None],
         )
 
     @testing.requires.floats_to_four_decimals
index 7bf2c664145fedb65672aa9695c1fa4f331b21c9..21583ec22c4821e0dd181c5b8f86cef0cf91bac3 100644 (file)
@@ -566,9 +566,19 @@ class DefaultRequirements(SuiteRequirements):
                     ("mysql+oursql", None, None, "Floating point error"),
                     ("firebird", None, None,
                         "Firebird still has FP inaccuracy even "
-                        "with only four decimal places")
+                        "with only four decimal places"),
+                    ('mssql+pyodbc', None, None,
+                                'mssql+pyodbc has FP inaccuracy even with '
+                                'only four decimal places '
+                            )
                 ])
 
+    @property
+    def fetch_null_from_numeric(self):
+        return skip_if(
+                    ("mssql+pyodbc", None, None, "crashes due to bug #351"),
+                )
+
     @property
     def python2(self):
         return skip_if(