diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-10-09 16:05:34 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-10-09 17:17:17 -0400 |
| commit | 19aa98d4cf270f9d55361f686967f57535ac22c1 (patch) | |
| tree | 24268faa95947cb73bcb0960bed73f45f3c778e4 /lib/sqlalchemy | |
| parent | cab08ea1834ac519f124789b835afa6832972b1c (diff) | |
| download | sqlalchemy-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.py | 50 |
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 |
