From: Michael Trier Date: Sat, 8 Nov 2008 06:37:45 +0000 (+0000) Subject: Fixed E notation problem in mssql. Closes #1216. X-Git-Tag: rel_0_5rc4~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=17980ba83c9e492f156e9c027ce62990e5f9d6fa;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Fixed E notation problem in mssql. Closes #1216. --- diff --git a/CHANGES b/CHANGES index 681e7ed525..19f93fcae9 100644 --- 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 diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py index 3291098282..73c9137883 100644 --- a/lib/sqlalchemy/databases/mssql.py +++ b/lib/sqlalchemy/databases/mssql.py @@ -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): diff --git a/test/dialect/mssql.py b/test/dialect/mssql.py index 26fc752430..1927de3f3e 100755 --- a/test/dialect/mssql.py +++ b/test/dialect/mssql.py @@ -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()