diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-03-02 15:08:08 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-03-03 16:16:43 -0500 |
commit | 6ec0f97e37140666a929c36de45802c12a0f76a5 (patch) | |
tree | 5f573f4b4b4c0f8b8977fe43c2b5376a9ade243f /lib/sqlalchemy/dialects/mysql/base.py | |
parent | 15c458d349f30af8e08b0d1fb268a968753481de (diff) | |
download | sqlalchemy-6ec0f97e37140666a929c36de45802c12a0f76a5.tar.gz |
Get MySQL version info from @@version
MySQL dialects now query the server version using ``SELECT @@version``
explicitly to the server to ensure we are getting the correct version
information back. Proxy servers like MaxScale interfere with the value
that is passed to the DBAPI's connection.server_version value so this
is no longer reliable.
Change-Id: Iafd39be8c9bf1982d58b34cc997ae1016ad6c48c
Fixes: #4205
(cherry picked from commit 9ba77e8d3b682bff89fdab5e80271a96a52fe8c8)
(cherry picked from commit 5c1ebbc3706c810f936d9e252ee5d16800e561ea)
Diffstat (limited to 'lib/sqlalchemy/dialects/mysql/base.py')
-rw-r--r-- | lib/sqlalchemy/dialects/mysql/base.py | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index a304d04f6..b5d4cb4b7 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -1750,6 +1750,27 @@ class MySQLDialect(default.DefaultDialect): val = val.decode() return val.upper().replace("-", " ") + def _get_server_version_info(self, connection): + # get database server version info explicitly over the wire + # to avoid proxy servers like MaxScale getting in the + # way with their own values, see #4205 + dbapi_con = connection.connection + cursor = dbapi_con.cursor() + cursor.execute("SELECT VERSION()") + val = cursor.fetchone()[0] + cursor.close() + if util.py3k and isinstance(val, bytes): + val = val.decode() + + version = [] + r = re.compile(r'[.\-]') + for n in r.split(val): + try: + version.append(int(n)) + except ValueError: + version.append(n) + return tuple(version) + def do_commit(self, dbapi_connection): """Execute a COMMIT.""" @@ -1921,6 +1942,9 @@ class MySQLDialect(default.DefaultDialect): @property def _mariadb_normalized_version_info(self): + # MariaDB's wire-protocol prepends the server_version with + # the string "5.5"; now that we use @@version we no longer see this. + if self._is_mariadb: idx = self.server_version_info.index('MariaDB') return self.server_version_info[idx - 3: idx] |