summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2019-10-09 16:05:34 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2019-10-09 17:17:17 -0400
commit19aa98d4cf270f9d55361f686967f57535ac22c1 (patch)
tree24268faa95947cb73bcb0960bed73f45f3c778e4 /lib/sqlalchemy
parentcab08ea1834ac519f124789b835afa6832972b1c (diff)
downloadsqlalchemy-19aa98d4cf270f9d55361f686967f57535ac22c1.tar.gz
Repair Oracle compat version check; dont warn if failed
Fixed regression in Oracle dialect that was inadvertently using max identifier length of 128 characters on Oracle server 12.2 and greater even though the stated contract for the remainder of the 1.3 series is that this value stays at 30 until version SQLAlchemy 1.4. Also repaired issues with the retrieval of the "compatibility" version, and removed the warning emitted when the "v$parameter" view was not accessible as this was causing user confusion. Fixes: #4898 Change-Id: Ieb7b3e093610896c5aa12d0789b63262e0ecf9d8
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/dialects/oracle/base.py50
1 files changed, 25 insertions, 25 deletions
diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py
index d0facb956..48b90f7e9 100644
--- a/lib/sqlalchemy/dialects/oracle/base.py
+++ b/lib/sqlalchemy/dialects/oracle/base.py
@@ -84,10 +84,12 @@ To assist with this change and others, Oracle includes the concept of a
actual server version in order to assist with migration of Oracle databases,
and may be configured within the Oracle server itself. This compatibility
version is retrieved using the query ``SELECT value FROM v$parameter WHERE
-name = 'compatible';``. The SQLAlchemy Oracle dialect
-will use this query upon first connect in order to determine the effective
-compatibility version of the server, which determines what the maximum allowed
-identifier length is for the server.
+name = 'compatible';``. The SQLAlchemy Oracle dialect, when tasked with
+determining the default max identifier length, will attempt to use this query
+upon first connect in order to determine the effective compatibility version of
+the server, which determines what the maximum allowed identifier length is for
+the server. If the table is not available, the server version information is
+used instead.
As of SQLAlchemy 1.4, the default max identifier length for the Oracle dialect
is 128 characters. Upon first connect, the compatibility version is detected
@@ -1226,11 +1228,6 @@ class OracleDialect(default.DefaultDialect):
supports_unicode_binds = False
max_identifier_length = 128
- # this should be set to
- # "SELECT value FROM v$parameter WHERE name = 'compatible'"
- # upon connect.
- _compat_server_version_info = None
-
supports_simple_order_by_label = False
cte_follows_insert = True
@@ -1293,12 +1290,6 @@ class OracleDialect(default.DefaultDialect):
def initialize(self, connection):
super(OracleDialect, self).initialize(connection)
- _compat_server_version_info = self._get_compat_server_version_info(
- connection
- )
- if _compat_server_version_info is not None:
- self._compat_server_version_info = _compat_server_version_info
-
self.implicit_returning = self.__dict__.get(
"implicit_returning", self.server_version_info > (10,)
)
@@ -1308,18 +1299,24 @@ class OracleDialect(default.DefaultDialect):
self.colspecs.pop(sqltypes.Interval)
self.use_ansi = False
- def _get_compat_server_version_info(self, connection):
+ def _get_effective_compat_server_version_info(self, connection):
+ # dialect does not need compat levels below 12.2, so don't query
+ # in those cases
+
+ if self.server_version_info < (12, 2):
+ return self.server_version_info
try:
- return connection.execute(
+ compat = connection.execute(
"SELECT value FROM v$parameter WHERE name = 'compatible'"
).scalar()
- except exc.DBAPIError as err:
- util.warn("Could not determine compatibility version: %s" % err)
-
- @property
- def _effective_compat_server_version_info(self):
- if self._compat_server_version_info is not None:
- return self._compat_server_version_info
+ except exc.DBAPIError:
+ compat = None
+
+ if compat:
+ try:
+ return tuple(int(x) for x in compat.split("."))
+ except:
+ return self.server_version_info
else:
return self.server_version_info
@@ -1344,7 +1341,10 @@ class OracleDialect(default.DefaultDialect):
pass
def _check_max_identifier_length(self, connection):
- if self._effective_compat_server_version_info < (12, 2):
+ if self._get_effective_compat_server_version_info(connection) < (
+ 12,
+ 2,
+ ):
return 30
else:
# use the default