From: Mike Bayer Date: Mon, 8 Jan 2018 21:05:23 +0000 (-0500) Subject: Re-enable setinputsizes for Oracle TIMESTAMP X-Git-Tag: rel_1_2_1~8^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=80a2241ec03efdd8ea34101ee981a3b9e9ae58c1;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Re-enable setinputsizes for Oracle TIMESTAMP 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 --- diff --git a/doc/build/changelog/unreleased_12/4157.rst b/doc/build/changelog/unreleased_12/4157.rst new file mode 100644 index 0000000000..f687652fd9 --- /dev/null +++ b/doc/build/changelog/unreleased_12/4157.rst @@ -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. + + diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py index 0288fe8981..79fd118af5 100644 --- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py @@ -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, ) diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py index b89d149d69..4d9726e2ba 100644 --- a/lib/sqlalchemy/testing/requirements.py +++ b/lib/sqlalchemy/testing/requirements.py @@ -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 diff --git a/lib/sqlalchemy/testing/suite/test_types.py b/lib/sqlalchemy/testing/suite/test_types.py index 83aac28505..96efbebbaf 100644 --- a/lib/sqlalchemy/testing/suite/test_types.py +++ b/lib/sqlalchemy/testing/suite/test_types.py @@ -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') diff --git a/test/requirements.py b/test/requirements.py index 3cbc5aaada..8e22fd166f 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -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 + )