summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES3
-rw-r--r--lib/sqlalchemy/databases/mssql.py9
-rwxr-xr-xtest/dialect/mssql.py34
3 files changed, 45 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 681e7ed52..19f93fcae 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 329109828..73c913788 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 26fc75243..1927de3f3 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()