From: valievkarim Date: Wed, 18 May 2022 20:24:41 +0000 (-0400) Subject: Include new MySQL error code 4031 for MySQL disconnect check X-Git-Tag: rel_1_4_37~17^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce4ab47c1633db38dc2c6b2522a9d7d9c09ac598;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git 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 (cherry picked from commit de399c914b923ec3c81d3a51e16c7b720d34e058) --- 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 260c147ddf..e4d89b2dce 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -2591,6 +2591,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 1b34af0539..6f60a21500 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