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 5c1ebbc370)
This commit is contained in:
Mike Bayer
2018-03-02 15:08:08 -05:00
parent 1127fe7407
commit 8064be5b00
6 changed files with 34 additions and 38 deletions
+10
View File
@@ -0,0 +1,10 @@
.. change::
:tags: bug, mysql
:tickets: 4205
:versions: 1.2.5, 1.3.0b1
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.
+24
View File
@@ -1583,6 +1583,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."""
@@ -1754,6 +1775,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]
-11
View File
@@ -56,17 +56,6 @@ class MySQLDialect_cymysql(MySQLDialect_mysqldb):
def dbapi(cls):
return __import__('cymysql')
def _get_server_version_info(self, connection):
dbapi_con = connection.connection
version = []
r = re.compile(r'[.\-]')
for n in r.split(dbapi_con.server_version):
try:
version.append(int(n))
except ValueError:
version.append(n)
return tuple(version)
def _detect_charset(self, connection):
return connection.connection.charset
@@ -161,11 +161,6 @@ class MySQLDialect_mysqlconnector(MySQLDialect):
def _mysqlconnector_double_percents(self):
return not util.py3k and self._mysqlconnector_version_info < (2, 0)
def _get_server_version_info(self, connection):
dbapi_con = connection.connection
version = dbapi_con.get_server_version()
return tuple(version)
def _detect_charset(self, connection):
return connection.connection.charset
-11
View File
@@ -181,17 +181,6 @@ class MySQLDialect_mysqldb(MySQLDialect):
opts['client_flag'] = client_flag
return [[], opts]
def _get_server_version_info(self, connection):
dbapi_con = connection.connection
version = []
r = re.compile(r'[.\-]')
for n in r.split(dbapi_con.get_server_info()):
try:
version.append(int(n))
except ValueError:
version.append(n)
return tuple(version)
def _extract_error_code(self, exception):
return exception.args[0]
-11
View File
@@ -220,17 +220,6 @@ class MySQLDialect_oursql(MySQLDialect):
return [[], opts]
def _get_server_version_info(self, connection):
dbapi_con = connection.connection
version = []
r = re.compile(r'[.\-]')
for n in r.split(dbapi_con.server_info):
try:
version.append(int(n))
except ValueError:
version.append(n)
return tuple(version)
def _extract_error_code(self, exception):
return exception.errno