From b9d231869d7e39decabdec12478e359c4dcb95ee Mon Sep 17 00:00:00 2001 From: zeeeeeb <5767468+zeeeeeb@users.noreply.github.com> Date: Sat, 12 Feb 2022 14:00:02 -0500 Subject: Implement generic Double and related fixed types Added :class:`.Double`, :class:`.DOUBLE`, :class:`.DOUBLE_PRECISION` datatypes to the base ``sqlalchemy.`` module namespace, for explicit use of double/double precision as well as generic "double" datatypes. Use :class:`.Double` for generic support that will resolve to DOUBLE/DOUBLE PRECISION/FLOAT as needed for different backends. Implemented DDL and reflection support for ``FLOAT`` datatypes which include an explicit "binary_precision" value. Using the Oracle-specific :class:`_oracle.FLOAT` datatype, the new parameter :paramref:`_oracle.FLOAT.binary_precision` may be specified which will render Oracle's precision for floating point types directly. This value is interpreted during reflection. Upon reflecting back a ``FLOAT`` datatype, the datatype returned is one of :class:`_types.DOUBLE_PRECISION` for a ``FLOAT`` for a precision of 126 (this is also Oracle's default precision for ``FLOAT``), :class:`_types.REAL` for a precision of 63, and :class:`_oracle.FLOAT` for a custom precision, as per Oracle documentation. As part of this change, the generic :paramref:`_sqltypes.Float.precision` value is explicitly rejected when generating DDL for Oracle, as this precision cannot be accurately converted to "binary precision"; instead, an error message encourages the use of :meth:`_sqltypes.TypeEngine.with_variant` so that Oracle's specific form of precision may be chosen exactly. This is a backwards-incompatible change in behavior, as the previous "precision" value was silently ignored for Oracle. Fixes: #5465 Closes: #7674 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7674 Pull-request-sha: 5c68419e5aee2e27bf21a8ac9eb5950d196c77e5 Change-Id: I831f4af3ee3b23fde02e8f6393c83e23dd7cd34d --- lib/sqlalchemy/dialects/postgresql/base.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'lib/sqlalchemy/dialects/postgresql/base.py') diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index 698ea277f..e265cd0f7 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -1449,6 +1449,7 @@ from ...types import BIGINT from ...types import BOOLEAN from ...types import CHAR from ...types import DATE +from ...types import DOUBLE_PRECISION from ...types import FLOAT from ...types import INTEGER from ...types import NUMERIC @@ -1575,10 +1576,6 @@ class BYTEA(sqltypes.LargeBinary): __visit_name__ = "BYTEA" -class DOUBLE_PRECISION(sqltypes.Float): - __visit_name__ = "DOUBLE_PRECISION" - - class INET(sqltypes.TypeEngine): __visit_name__ = "INET" @@ -2896,8 +2893,8 @@ class PGTypeCompiler(compiler.GenericTypeCompiler): else: return "FLOAT(%(precision)s)" % {"precision": type_.precision} - def visit_DOUBLE_PRECISION(self, type_, **kw): - return "DOUBLE PRECISION" + def visit_double(self, type_, **kw): + return self.visit_DOUBLE_PRECISION(type, **kw) def visit_BIGINT(self, type_, **kw): return "BIGINT" -- cgit v1.2.1