summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2019-11-12 21:30:49 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2019-11-12 21:30:49 +0000
commitbe2cd2791ea65fb76b193a34752361f1e76d68b2 (patch)
tree796403a5f551a1257178ecd2a2783427775e5dc7
parente7b87f94d01270ff53ab9ce432bcc08eecd116cf (diff)
parent163306cb81e4aa866972b77c3b4f142e3f1dc676 (diff)
downloadsqlalchemy-be2cd2791ea65fb76b193a34752361f1e76d68b2.tar.gz
Merge "Repair Oracle Interval"
-rw-r--r--doc/build/changelog/unreleased_14/4971.rst10
-rw-r--r--lib/sqlalchemy/dialects/oracle/base.py4
-rw-r--r--test/sql/test_types.py36
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)