]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- A descriptive ValueError is now raised in the event that SQL server
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 30 Nov 2015 17:19:26 +0000 (12:19 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 30 Nov 2015 17:19:26 +0000 (12:19 -0500)
returns an invalid date or time format from a DATE or TIME
column, rather than failing with a NoneType error.  Pull request
courtesy Ed Avis.
pullreq github:206

doc/build/changelog/changelog_10.rst
lib/sqlalchemy/dialects/mssql/base.py
test/dialect/mssql/test_types.py

index be0654b849eda2533269a3dbf561afbd7f489a3f..537f750ca36067192554975e7c876857ae7593e9 100644 (file)
 .. changelog::
     :version: 1.0.10
 
+    .. change::
+        :tags: bug, mssql
+        :versions: 1.1.0b1
+        :pullreq: github:206
+
+        A descriptive ValueError is now raised in the event that SQL server
+        returns an invalid date or time format from a DATE or TIME
+        column, rather than failing with a NoneType error.  Pull request
+        courtesy Ed Avis.
+
     .. change::
         :tags: bug, py3k
         :versions: 1.1.0b1
index 487f21df93353f2d271a911c377eef5b1273f41a..1ee328e83424341d7ad1378b082d7084dff7e5d9 100644 (file)
@@ -533,9 +533,13 @@ class _MSDate(sqltypes.Date):
             if isinstance(value, datetime.datetime):
                 return value.date()
             elif isinstance(value, util.string_types):
+                m = self._reg.match(value)
+                if not m:
+                    raise ValueError(
+                        "could not parse %r as a date value" % (value, ))
                 return datetime.date(*[
                     int(x or 0)
-                    for x in self._reg.match(value).groups()
+                    for x in m.groups()
                 ])
             else:
                 return value
@@ -567,9 +571,13 @@ class TIME(sqltypes.TIME):
             if isinstance(value, datetime.datetime):
                 return value.time()
             elif isinstance(value, util.string_types):
+                m = self._reg.match(value)
+                if not m:
+                    raise ValueError(
+                        "could not parse %r as a time value" % (value, ))
                 return datetime.time(*[
                     int(x or 0)
-                    for x in self._reg.match(value).groups()])
+                    for x in m.groups()])
             else:
                 return value
         return process
index 6c6ff6841b87185e12fba1b44c79c759de36ca54..dad86c60a71bcbebf02a1516445e703e9aa1b837 100644 (file)
@@ -1,5 +1,5 @@
 # -*- encoding: utf-8
-from sqlalchemy.testing import eq_, engines, pickleable
+from sqlalchemy.testing import eq_, engines, pickleable, assert_raises_message
 import datetime
 import os
 from sqlalchemy import Table, Column, MetaData, Float, \
@@ -8,8 +8,8 @@ from sqlalchemy import Table, Column, MetaData, Float, \
     UnicodeText, LargeBinary
 from sqlalchemy import types, schema
 from sqlalchemy.databases import mssql
-from sqlalchemy.dialects.mssql.base import TIME, MS_2005_VERSION, \
-    MS_2008_VERSION
+from sqlalchemy.dialects.mssql.base import TIME, _MSDate
+from sqlalchemy.dialects.mssql.base import MS_2005_VERSION, MS_2008_VERSION
 from sqlalchemy.testing import fixtures, \
     AssertsExecutionResults, ComparesTables
 from sqlalchemy import testing
@@ -34,6 +34,36 @@ class TimeTypeTest(fixtures.TestBase):
         result_processor = mssql_time_type.result_processor(None, None)
         eq_(expected, result_processor(value))
 
+    def test_result_processor_invalid(self):
+        mssql_time_type = TIME()
+        result_processor = mssql_time_type.result_processor(None, None)
+        assert_raises_message(
+            ValueError,
+            "could not parse 'abc' as a time value",
+            result_processor, 'abc'
+        )
+
+
+class MSDateTypeTest(fixtures.TestBase):
+
+    def test_result_processor(self):
+        expected = datetime.date(2000, 1, 2)
+        self._assert_result_processor(expected, '2000-01-02')
+
+    def _assert_result_processor(self, expected, value):
+        mssql_date_type = _MSDate()
+        result_processor = mssql_date_type.result_processor(None, None)
+        eq_(expected, result_processor(value))
+
+    def test_result_processor_invalid(self):
+        mssql_date_type = _MSDate()
+        result_processor = mssql_date_type.result_processor(None, None)
+        assert_raises_message(
+            ValueError,
+            "could not parse 'abc' as a date value",
+            result_processor, 'abc'
+        )
+
 
 class TypeDDLTest(fixtures.TestBase):