]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
use oracle.INTERVAL for generic interval
authorindivar <indimishra@gmail.com>
Fri, 20 Oct 2023 15:25:38 +0000 (11:25 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 24 Oct 2023 14:46:41 +0000 (10:46 -0400)
Fixed issue in :class:`.Interval` datatype where the Oracle implementation
was not being used for DDL generation, leading to the ``day_precision`` and
``second_precision`` parameters to be ignored, despite being supported by
this dialect.  Pull request courtesy Indivar.

Fixes: #10509
Closes: #10513
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/10513
Pull-request-sha: a3b901978504b1bc726f722fc27ca4827de05274

Change-Id: I074afeeac182567f9104c5175b81c735d87e1352

doc/build/changelog/unreleased_20/10509.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/oracle/types.py
lib/sqlalchemy/sql/sqltypes.py
test/dialect/oracle/test_types.py

diff --git a/doc/build/changelog/unreleased_20/10509.rst b/doc/build/changelog/unreleased_20/10509.rst
new file mode 100644 (file)
index 0000000..2850043
--- /dev/null
@@ -0,0 +1,8 @@
+.. change::
+    :tags: bug, oracle
+    :tickets: 10509
+
+    Fixed issue in :class:`.Interval` datatype where the Oracle implementation
+    was not being used for DDL generation, leading to the ``day_precision`` and
+    ``second_precision`` parameters to be ignored, despite being supported by
+    this dialect.  Pull request courtesy Indivar.
index 62028c767386df9458285c2973b006673c86fbb0..860186195c6fd42d7a41496056162df94b9c5ec3 100644 (file)
@@ -203,6 +203,15 @@ class INTERVAL(sqltypes.NativeForEmulated, sqltypes._AbstractInterval):
             second_precision=interval.second_precision,
         )
 
+    @classmethod
+    def adapt_emulated_to_native(
+        cls, interval: sqltypes.Interval, **kw  # type: ignore[override]
+    ):
+        return INTERVAL(
+            day_precision=interval.day_precision,
+            second_precision=interval.second_precision,
+        )
+
     @property
     def _type_affinity(self):
         return sqltypes.Interval
index 343575f196e763886ee11611c9daa66b42d1a2ad..8f7a818aaee1a2b6da9685f6bd3b3b7a0a4048ee 100644 (file)
@@ -2052,8 +2052,8 @@ class Interval(Emulated, _AbstractInterval, TypeDecorator[dt.timedelta]):
     """A type for ``datetime.timedelta()`` objects.
 
     The Interval type deals with ``datetime.timedelta`` objects.  In
-    PostgreSQL, the native ``INTERVAL`` type is used; for others, the
-    value is stored as a date which is relative to the "epoch"
+    PostgreSQL and Oracle, the native ``INTERVAL`` type is used; for others,
+    the value is stored as a date which is relative to the "epoch"
     (Jan. 1, 1970).
 
     Note that the ``Interval`` type does not currently provide date arithmetic
index a970adc4bacddace0f897faa74c0d2ff46965ebe..7bf05aafafde54b415b93db4a0e06ce72aebba16 100644 (file)
@@ -183,6 +183,10 @@ class DialectTypesTest(fixtures.TestBase, AssertsCompiledSQL):
             oracle.INTERVAL(day_precision=2, second_precision=5),
             "INTERVAL DAY(2) TO SECOND(5)",
         ),
+        (
+            sqltypes.Interval(day_precision=9, second_precision=3),
+            "INTERVAL DAY(9) TO SECOND(3)",
+        ),
     )
     def test_interval(self, type_, expected):
         self.assert_compile(type_, expected)