]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fixed E notation problem in mssql. Closes #1216.
authorMichael Trier <mtrier@gmail.com>
Sat, 8 Nov 2008 06:37:45 +0000 (06:37 +0000)
committerMichael Trier <mtrier@gmail.com>
Sat, 8 Nov 2008 06:37:45 +0000 (06:37 +0000)
CHANGES
lib/sqlalchemy/databases/mssql.py
test/dialect/mssql.py

diff --git a/CHANGES b/CHANGES
index 681e7ed525ea24a160a7a6f71bf32affdc7ba6ae..19f93fcae96d1c51783874b1e9c0793fd8a2652b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -14,6 +14,9 @@ CHANGES
       binary expression need to be translated to use the
       IN and NOT IN syntax.
 
+    - Fixed E Notation issue that prevented the ability to
+      insert decimal values less than 1E-6. [ticket:1216]
+
 0.5.0rc3
 ========
 - features
index 3291098282c42b2ef1a6b876279da20cc4ef3ab9..73c9137883320bed8bd76425acad403acf8391dc 100644 (file)
@@ -69,7 +69,14 @@ class MSNumeric(sqltypes.Numeric):
                 # Not sure that this exception is needed
                 return value
             else:
-                return str(value)
+                if value._exp < 6:
+                    value = ((value < 0 and '-' or '')
+                        + '0.'
+                        + '0' * -(value._exp+1)
+                        + value._int)
+                    return value
+                else:
+                    return str(value)
         return process
 
     def get_col_spec(self):
index 26fc752430dc2aafe14b3d381f4f42e2abac9ccc..1927de3f3ef767294cfeb7384619f8991303bbc3 100755 (executable)
@@ -366,5 +366,39 @@ class ParseConnectTest(TestBase, AssertsCompiledSQL):
         connection = dialect.create_connect_args(u)
         self.assertEquals([['DRIVER={SQL Server};Server=hostspec;Database=database;UID=username;PWD=password;foo=bar;LANGUAGE=us_english'], {}], connection)
 
+class TypesTest(TestBase):
+    __only_on__ = 'mssql'
+
+    def setUpAll(self):
+        global numeric_table, metadata
+        metadata = MetaData(testing.db)
+        numeric_table = Table('numeric_table', metadata,
+            Column('id', Integer, Sequence('numeric_id_seq', optional=True), primary_key=True),
+            Column('numericcol', Numeric(asdecimal=False))
+        )
+        metadata.create_all()
+
+    def tearDownAll(self):
+        metadata.drop_all()
+
+    def tearDown(self):
+        numeric_table.delete().execute()
+
+    def test_decimal_e_notation(self):
+        from decimal import Decimal
+
+        try:
+            numeric_table.insert().execute(numericcol=Decimal('4.1'))
+            numeric_table.insert().execute(numericcol=Decimal('1E-1'))
+            numeric_table.insert().execute(numericcol=Decimal('1E-2'))
+            numeric_table.insert().execute(numericcol=Decimal('1E-3'))
+            numeric_table.insert().execute(numericcol=Decimal('1E-4'))
+            numeric_table.insert().execute(numericcol=Decimal('1E-5'))
+            numeric_table.insert().execute(numericcol=Decimal('1E-6'))
+            numeric_table.insert().execute(numericcol=Decimal('1E-7'))
+            numeric_table.insert().execute(numericcol=Decimal('1E-8'))
+        except:
+            assert False 
+
 if __name__ == "__main__":
     testenv.main()