diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2019-11-12 21:30:49 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2019-11-12 21:30:49 +0000 |
| commit | be2cd2791ea65fb76b193a34752361f1e76d68b2 (patch) | |
| tree | 796403a5f551a1257178ecd2a2783427775e5dc7 | |
| parent | e7b87f94d01270ff53ab9ce432bcc08eecd116cf (diff) | |
| parent | 163306cb81e4aa866972b77c3b4f142e3f1dc676 (diff) | |
| download | sqlalchemy-be2cd2791ea65fb76b193a34752361f1e76d68b2.tar.gz | |
Merge "Repair Oracle Interval"
| -rw-r--r-- | doc/build/changelog/unreleased_14/4971.rst | 10 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/oracle/base.py | 4 | ||||
| -rw-r--r-- | test/sql/test_types.py | 36 |
3 files changed, 29 insertions, 21 deletions
diff --git a/doc/build/changelog/unreleased_14/4971.rst b/doc/build/changelog/unreleased_14/4971.rst new file mode 100644 index 000000000..08e94a09c --- /dev/null +++ b/doc/build/changelog/unreleased_14/4971.rst @@ -0,0 +1,10 @@ +.. change:: + :tags: bug, oracle + :tickets: 4971 + + The :class:`.oracle.INTERVAL` class of the Oracle dialect is now correctly + a subclass of the abstract version of :class:`.Interval` as well as the + correct "emulated" base class, which allows for correct behavior under both + native and non-native modes; previously it was only based on + :class:`.TypeEngine`. + diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index c1e91fb12..fe3d586a4 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -450,12 +450,12 @@ from ... import Computed from ... import exc from ... import schema as sa_schema from ... import sql -from ... import types as sqltypes from ... import util from ...engine import default from ...engine import reflection from ...sql import compiler from ...sql import expression +from ...sql import sqltypes from ...sql import util as sql_util from ...sql import visitors from ...types import BLOB @@ -567,7 +567,7 @@ class DATE(sqltypes.DateTime): return other._type_affinity in (sqltypes.DateTime, sqltypes.Date) -class INTERVAL(sqltypes.TypeEngine): +class INTERVAL(sqltypes.NativeForEmulated, sqltypes._AbstractInterval): __visit_name__ = "INTERVAL" def __init__(self, day_precision=None, second_precision=None): diff --git a/test/sql/test_types.py b/test/sql/test_types.py index 6359728eb..d40d0902f 100644 --- a/test/sql/test_types.py +++ b/test/sql/test_types.py @@ -2857,7 +2857,6 @@ class IntervalTest(fixtures.TestBase, AssertsExecutionResults): def teardown_class(cls): metadata.drop_all() - @testing.fails_on("oracle", "See issue #4971") def test_non_native_adapt(self): interval = Interval(native=False) adapted = interval.dialect_impl(testing.db.dialect) @@ -2865,31 +2864,30 @@ class IntervalTest(fixtures.TestBase, AssertsExecutionResults): assert adapted.native is False eq_(str(adapted), "DATETIME") - @testing.fails_on( - "oracle", - "ORA-01873: the leading precision of the interval is too small", - ) def test_roundtrip(self): small_delta = datetime.timedelta(days=15, seconds=5874) - delta = datetime.timedelta(414) - interval_table.insert().execute( - native_interval=small_delta, - native_interval_args=delta, - non_native_interval=delta, - ) - row = interval_table.select().execute().first() + delta = datetime.timedelta(14) + with testing.db.begin() as conn: + conn.execute( + interval_table.insert(), + native_interval=small_delta, + native_interval_args=delta, + non_native_interval=delta, + ) + row = conn.execute(interval_table.select()).first() eq_(row["native_interval"], small_delta) eq_(row["native_interval_args"], delta) eq_(row["non_native_interval"], delta) - @testing.fails_on( - "oracle", "ORA-00932: inconsistent datatypes: expected NUMBER got DATE" - ) def test_null(self): - interval_table.insert().execute( - id=1, native_inverval=None, non_native_interval=None - ) - row = interval_table.select().execute().first() + with testing.db.begin() as conn: + conn.execute( + interval_table.insert(), + id=1, + native_inverval=None, + non_native_interval=None, + ) + row = conn.execute(interval_table.select()).first() eq_(row["native_interval"], None) eq_(row["native_interval_args"], None) eq_(row["non_native_interval"], None) |
