From de399c914b923ec3c81d3a51e16c7b720d34e058 Mon Sep 17 00:00:00 2001 From: valievkarim Date: Wed, 18 May 2022 16:24:41 -0400 Subject: [PATCH] Include new MySQL error code 4031 for MySQL disconnect check Added disconnect code for MySQL error 4031, introduced in MySQL >= 8.0.24, indicating connection idle timeout exceeded. In particular this repairs an issue where pre-ping could not reconnect on a timed-out connection. Pull request courtesy valievkarim. Fixes: #8036 Closes: #8037 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/8037 Pull-request-sha: 7ab605c2d25c3cd83af41e3250c97c623220cc7a Change-Id: I21249c9d8acb305ac43ce61b90b41daf7fabdfe8 --- doc/build/changelog/unreleased_14/8036.rst | 8 ++++++++ lib/sqlalchemy/dialects/mysql/base.py | 1 + test/dialect/mysql/test_dialect.py | 4 ++++ 3 files changed, 13 insertions(+) create mode 100644 doc/build/changelog/unreleased_14/8036.rst diff --git a/doc/build/changelog/unreleased_14/8036.rst b/doc/build/changelog/unreleased_14/8036.rst new file mode 100644 index 0000000000..52b956b6b4 --- /dev/null +++ b/doc/build/changelog/unreleased_14/8036.rst @@ -0,0 +1,8 @@ +.. change:: + :tags: bug, mysql + :tickets: 8036 + + Added disconnect code for MySQL error 4031, introduced in MySQL >= 8.0.24, + indicating connection idle timeout exceeded. In particular this repairs an + issue where pre-ping could not reconnect on a timed-out connection. Pull + request courtesy valievkarim. diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index 420fcfdfdb..65de88cfe6 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -2568,6 +2568,7 @@ class MySQLDialect(default.DefaultDialect): 2014, 2045, 2055, + 4031, ): return True elif isinstance( diff --git a/test/dialect/mysql/test_dialect.py b/test/dialect/mysql/test_dialect.py index 4fa524a35c..d79f2629fa 100644 --- a/test/dialect/mysql/test_dialect.py +++ b/test/dialect/mysql/test_dialect.py @@ -199,6 +199,10 @@ class DialectTest(fixtures.TestBase): (2006, "foo", "OperationalError", "pymysql", True), (2007, "foo", "OperationalError", "mysqldb", False), (2007, "foo", "OperationalError", "pymysql", False), + (4031, "foo", "OperationalError", "mysqldb", True), + (4031, "foo", "OperationalError", "pymysql", True), + (4032, "foo", "OperationalError", "mysqldb", False), + (4032, "foo", "OperationalError", "pymysql", False), ) def test_is_disconnect( self, arg0, message, exc_cls_name, dialect_name, is_disconnect -- 2.47.2