]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Stop converting mssql datetime.time parameters to datetime.datetime
authorGord Thompson <gord@gordthompson.com>
Thu, 21 May 2020 22:20:48 +0000 (16:20 -0600)
committerGord Thompson <gord@gordthompson.com>
Sat, 23 May 2020 13:03:41 +0000 (07:03 -0600)
Fixes: #5339
Change-Id: Ida75422d8c3fdfc7adae68e547d88df49368a693

doc/build/changelog/unreleased_13/5339.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/mssql/base.py
test/dialect/mssql/test_types.py

diff --git a/doc/build/changelog/unreleased_13/5339.rst b/doc/build/changelog/unreleased_13/5339.rst
new file mode 100644 (file)
index 0000000..efff6b2
--- /dev/null
@@ -0,0 +1,7 @@
+.. change::
+    :tags: bug, mssql
+    :tickets: 5339
+
+    Fixed issue where ``datetime.time`` parameters were being converted to
+    ``datetime.datetime``, making them incompatible with comparisons like
+    ``>=`` against an actual :class:`_mssql.TIME` column.
index 228baa84f67afd6fcb5a0716ce8a1e4988dfa1e3..f8ed7697a5c9157250692764ed4ca72580b94225 100644 (file)
@@ -990,7 +990,11 @@ class TIME(sqltypes.TIME):
                     self.__zero_date, value.time()
                 )
             elif isinstance(value, datetime.time):
-                value = datetime.datetime.combine(self.__zero_date, value)
+                """ issue #5339
+                per: https://github.com/mkleehammer/pyodbc/wiki/Tips-and-Tricks-by-Database-Platform#time-columns
+                pass TIME value as string
+                """  # noqa
+                value = str(value)
             return value
 
         return process
index 58faab9109c55180cd0df4dbf5a868e37f54ed63..f0ddc456457d0e8d3705276fe19254b4de02101c 100644 (file)
@@ -56,6 +56,52 @@ from sqlalchemy.testing import pickleable
 from sqlalchemy.util import b
 
 
+class TimeParameterTest(fixtures.TablesTest):
+    __only_on__ = "mssql"
+    __backend__ = True
+
+    @classmethod
+    def define_tables(cls, metadata):
+        Table(
+            "time_t",
+            metadata,
+            Column("id", Integer, primary_key=True, autoincrement=False),
+            Column("time_col", Time),
+        )
+
+    @classmethod
+    def insert_data(cls, connection):
+        time_t = cls.tables.time_t
+        connection.execute(
+            time_t.insert(),
+            [
+                {"id": 1, "time_col": datetime.time(1, 23, 45, 67)},
+                {"id": 2, "time_col": datetime.time(12, 0, 0)},
+                {"id": 3, "time_col": datetime.time(16, 19, 59, 999999)},
+                {"id": 4, "time_col": None},
+            ],
+        )
+
+    @testing.combinations(
+        ("not_null", datetime.time(1, 23, 45, 68), 2),
+        ("null", None, 1),
+        id_="iaa",
+        argnames="time_value, expected_row_count",
+    )
+    def test_time_as_parameter_to_where(
+        self, time_value, expected_row_count, connection
+    ):
+        # issue #5339
+        t = self.tables.time_t
+
+        if time_value is None:
+            qry = t.select().where(t.c.time_col.is_(time_value))
+        else:
+            qry = t.select().where(t.c.time_col >= time_value)
+        result = connection.execute(qry).fetchall()
+        eq_(len(result), expected_row_count)
+
+
 class TimeTypeTest(fixtures.TestBase):
     def test_result_processor_no_microseconds(self):
         expected = datetime.time(12, 34, 56)