]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Re-enable setinputsizes for Oracle TIMESTAMP
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 8 Jan 2018 21:05:23 +0000 (16:05 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 8 Jan 2018 21:14:17 +0000 (16:14 -0500)
Fixed regression where the removal of most setinputsizes
rules from cx_Oracle dialect impacted the TIMESTAMP
datatype's ability to retrieve fractional seconds.

Fixes: #4157
Change-Id: Ic53109fd199aea8b9c4da14355e125849b8b198f

doc/build/changelog/unreleased_12/4157.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/oracle/cx_oracle.py
lib/sqlalchemy/testing/requirements.py
lib/sqlalchemy/testing/suite/test_types.py
test/requirements.py

diff --git a/doc/build/changelog/unreleased_12/4157.rst b/doc/build/changelog/unreleased_12/4157.rst
new file mode 100644 (file)
index 0000000..f687652
--- /dev/null
@@ -0,0 +1,9 @@
+.. change::
+    :tags: bug, oracle
+    :tickets: 4157
+
+    Fixed regression where the removal of most setinputsizes
+    rules from cx_Oracle dialect impacted the TIMESTAMP
+    datatype's ability to retrieve fractional seconds.
+
+
index 0288fe898138d316b8cde6ce1d2df2506bdbc105..79fd118af51b9d32d660c7dc8149469a5f3a5a97 100644 (file)
@@ -623,7 +623,7 @@ class OracleDialect_cx_oracle(OracleDialect):
 
             self._include_setinputsizes = {
                 cx_Oracle.NCLOB, cx_Oracle.CLOB, cx_Oracle.LOB,
-                cx_Oracle.BLOB, cx_Oracle.FIXED_CHAR,
+                cx_Oracle.BLOB, cx_Oracle.FIXED_CHAR, cx_Oracle.TIMESTAMP
             }
 
         self._is_cx_oracle_6 = self.cx_oracle_ver >= (6, )
index b89d149d698d702893c937834d7f8422092e55c0..4d9726e2ba5e3d85f74476b25b7f81f7d2363123 100644 (file)
@@ -498,6 +498,13 @@ class SuiteRequirements(Requirements):
 
         return exclusions.open()
 
+    @property
+    def timestamp_microseconds(self):
+        """target dialect supports representation of Python
+        datetime.datetime() with microsecond objects but only
+        if TIMESTAMP is used."""
+        return exclusions.closed()
+
     @property
     def datetime_historic(self):
         """target dialect supports representation of Python
index 83aac28505aad7824e6a5f8d9705544504aae5d5..96efbebbaf2488085663f3fc77dc8b08e01945ee 100644 (file)
@@ -3,7 +3,7 @@
 from .. import fixtures, config
 from ..assertions import eq_
 from ..config import requirements
-from sqlalchemy import Integer, Unicode, UnicodeText, select
+from sqlalchemy import Integer, Unicode, UnicodeText, select, TIMESTAMP
 from sqlalchemy import Date, DateTime, Time, MetaData, String, \
     Text, Numeric, Float, literal, Boolean, cast, null, JSON, and_, type_coerce
 from ..schema import Table, Column
@@ -281,6 +281,12 @@ class DateTimeMicrosecondsTest(_DateFixture, fixtures.TablesTest):
     datatype = DateTime
     data = datetime.datetime(2012, 10, 15, 12, 57, 18, 396)
 
+class TimestampMicrosecondsTest(_DateFixture, fixtures.TablesTest):
+    __requires__ = 'timestamp_microseconds',
+    __backend__ = True
+    datatype = TIMESTAMP
+    data = datetime.datetime(2012, 10, 15, 12, 57, 18, 396)
+
 
 class TimeTest(_DateFixture, fixtures.TablesTest):
     __requires__ = 'time',
@@ -915,5 +921,6 @@ __all__ = ('UnicodeVarcharTest', 'UnicodeTextTest', 'JSONTest',
            'DateTest', 'DateTimeTest', 'TextTest',
            'NumericTest', 'IntegerTest',
            'DateTimeHistoricTest', 'DateTimeCoercedToDateTimeTest',
-           'TimeMicrosecondsTest', 'TimeTest', 'DateTimeMicrosecondsTest',
+           'TimeMicrosecondsTest', 'TimestampMicrosecondsTest', 'TimeTest',
+           'DateTimeMicrosecondsTest',
            'DateHistoricTest', 'StringTest', 'BooleanTest')
index 3cbc5aaada675efa73e7a0d29d671b04116c7934..8e22fd166f7f7c597bbe6b07b4875fb90de9b615 100644 (file)
@@ -696,6 +696,14 @@ class DefaultRequirements(SuiteRequirements):
         return skip_if(['mssql', 'mysql', 'firebird', '+zxjdbc',
                         'oracle', 'sybase'])
 
+    @property
+    def timestamp_microseconds(self):
+        """target dialect supports representation of Python
+        datetime.datetime() with microsecond objects but only
+        if TIMESTAMP is used."""
+
+        return only_on(['oracle'])
+
     @property
     def datetime_historic(self):
         """target dialect supports representation of Python
@@ -1032,4 +1040,4 @@ class DefaultRequirements(SuiteRequirements):
         return only_if(
             lambda config: against(config, "oracle+cx_oracle") and
             config.db.dialect.cx_oracle_ver < (6, )
-        )
\ No newline at end of file
+        )