--- /dev/null
+.. change::
+ :tags: change, mysql
+ :tickets: 7518
+
+ Replace ``SHOW VARIABLES LIKE`` statement with equivalent
+ ``SELECT @@variable`` in MySQL and MariaDB dialect initialization.
+ This should avoid mutex contention caused by ``SHOW VARIABLES``,
+ improving initialization performance.
# https://dev.mysql.com/doc/refman/en/identifier-case-sensitivity.html
charset = self._connection_charset
- show_var = connection.execute(
- sql.text("SHOW VARIABLES LIKE 'lower_case_table_names'")
- )
- row = self._compat_first(
- show_var,
- charset=charset,
+ show_var = connection.exec_driver_sql(
+ "SELECT @@lower_case_table_names"
)
+ row = self._compat_first(show_var, charset=charset)
if not row:
cs = 0
else:
# 4.0.15 returns OFF or ON according to [ticket:489]
# 3.23 doesn't, 4.0.27 doesn't..
- if row[1] == "OFF":
+ if row[0] == "OFF":
cs = 0
- elif row[1] == "ON":
+ elif row[0] == "ON":
cs = 1
else:
- cs = int(row[1])
+ cs = int(row[0])
self._casing = cs
return cs
def _detect_sql_mode(self, connection):
row = self._compat_first(
- connection.exec_driver_sql("SHOW VARIABLES LIKE 'sql_mode'"),
+ connection.exec_driver_sql("SELECT @@sql_mode"),
charset=self._connection_charset,
)
)
self._sql_mode = ""
else:
- self._sql_mode = row[1] or ""
+ self._sql_mode = row[0] or ""
def _detect_ansiquotes(self, connection):
"""Detect and adjust for the ANSI_QUOTES sql mode."""
""" # noqa
import re
-import sys
from .base import MySQLDialect
from .base import MySQLExecutionContext
from .types import TIME
+from ... import exc
from ... import util
from ...connectors.pyodbc import PyODBCConnector
from ...sql.sqltypes import Time
#
# If it's decided that issuing that sort of SQL leaves you SOL, then
# this can prefer the driver value.
- rs = connection.exec_driver_sql(
- "SHOW VARIABLES LIKE 'character_set%%'"
- )
- opts = {row[0]: row[1] for row in self._compat_fetchall(rs)}
- for key in ("character_set_connection", "character_set"):
- if opts.get(key, None):
- return opts[key]
+ try:
+ value = connection.exec_driver_sql(
+ "select @@character_set_client"
+ ).scalar()
+ if value:
+ return value
+ except exc.DBAPIError:
+ pass
util.warn(
"Could not detect the connection character set. "
# https://github.com/mkleehammer/pyodbc/wiki/Unicode
pyodbc_SQL_CHAR = 1 # pyodbc.SQL_CHAR
pyodbc_SQL_WCHAR = -8 # pyodbc.SQL_WCHAR
- if sys.version_info.major > 2:
- conn.setdecoding(pyodbc_SQL_CHAR, encoding="utf-8")
- conn.setdecoding(pyodbc_SQL_WCHAR, encoding="utf-8")
- conn.setencoding(encoding="utf-8")
- else:
- conn.setdecoding(pyodbc_SQL_CHAR, encoding="utf-8")
- conn.setdecoding(pyodbc_SQL_WCHAR, encoding="utf-8")
- conn.setencoding(str, encoding="utf-8")
- conn.setencoding(unicode, encoding="utf-8") # noqa: F821
+ conn.setdecoding(pyodbc_SQL_CHAR, encoding="utf-8")
+ conn.setdecoding(pyodbc_SQL_WCHAR, encoding="utf-8")
+ conn.setencoding(encoding="utf-8")
return on_connect
engine = engines.testing_engine()
def my_execute(self, statement, *args, **kw):
- if statement.startswith("SHOW VARIABLES"):
+ if statement.startswith("SELECT @@"):
statement = "SELECT 1 FROM DUAL WHERE 1=0"
return real_exec(self, statement, *args, **kw)