summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGord Thompson <gord@gordthompson.com>2020-05-21 16:20:48 -0600
committerGord Thompson <gord@gordthompson.com>2020-05-23 07:03:41 -0600
commit9a04c2f65754ac7bf93e0f58f68e59b41e43e67e (patch)
tree4af9bc7ddcc6d362903d7b8791b76efa7514429e
parentebceb618efd5a6368c05a78cc3f189f8cab7a42a (diff)
downloadsqlalchemy-9a04c2f65754ac7bf93e0f58f68e59b41e43e67e.tar.gz
Stop converting mssql datetime.time parameters to datetime.datetime
Fixes: #5339 Change-Id: Ida75422d8c3fdfc7adae68e547d88df49368a693
-rw-r--r--doc/build/changelog/unreleased_13/5339.rst7
-rw-r--r--lib/sqlalchemy/dialects/mssql/base.py6
-rw-r--r--test/dialect/mssql/test_types.py46
3 files changed, 58 insertions, 1 deletions
diff --git a/doc/build/changelog/unreleased_13/5339.rst b/doc/build/changelog/unreleased_13/5339.rst
new file mode 100644
index 000000000..efff6b205
--- /dev/null
+++ b/doc/build/changelog/unreleased_13/5339.rst
@@ -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.
diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py
index 228baa84f..f8ed7697a 100644
--- a/lib/sqlalchemy/dialects/mssql/base.py
+++ b/lib/sqlalchemy/dialects/mssql/base.py
@@ -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
diff --git a/test/dialect/mssql/test_types.py b/test/dialect/mssql/test_types.py
index 58faab910..f0ddc4564 100644
--- a/test/dialect/mssql/test_types.py
+++ b/test/dialect/mssql/test_types.py
@@ -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)