From 564bd4b4d462a23f6782f2a1ee37b072a998b924 Mon Sep 17 00:00:00 2001 From: Kamil Holubicki Date: Tue, 3 Dec 2019 10:42:36 +0100 Subject: [PATCH] PS-6094: Handler fails to trigger on Error 1049 or SQLSTATE 42000 or plain sqlexception https://jira.percona.com/browse/PS-6094 No_such_table_error_handler modified to trap ER_BAD_DB_ERROR as well to handle the case when specified nonexistent table is located in nonexistent database. --- mysql-test/r/sp-bugs.result | 27 +++++++++++++++++++++++++++ mysql-test/t/sp-bugs.test | 28 ++++++++++++++++++++++++++++ sql/error_handler.h | 5 +++-- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/sp-bugs.result b/mysql-test/r/sp-bugs.result index 3b30a8f0114..9c879268e91 100644 --- a/mysql-test/r/sp-bugs.result +++ b/mysql-test/r/sp-bugs.result @@ -464,3 +464,30 @@ Function sql_mode Create Function character_set_client collation_connection Data очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_e # # # # # DROP FUNCTION очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_é; SET NAMES default; +# +# PS-6094 - Handler fails to trigger on Error 1049 or SQLSTATE 42000 or plain sqlexception +# +CREATE FUNCTION handler_func() RETURNS int(11) +BEGIN +DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN NULL; +SELECT fake_col into @a FROM fake_table; +RETURN 1; +END| +Warnings: +Warning 1681 Integer display width is deprecated and will be removed in a future release. +CREATE FUNCTION handler_func2() RETURNS int(11) +BEGIN +DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN NULL; +SELECT fake_col into @a FROM fake_db.fake_table; +RETURN 1; +END| +Warnings: +Warning 1681 Integer display width is deprecated and will be removed in a future release. +select handler_func(); +handler_func() +NULL +select handler_func2(); +handler_func2() +NULL +DROP FUNCTION handler_func; +DROP FUNCTION handler_func2; diff --git a/mysql-test/t/sp-bugs.test b/mysql-test/t/sp-bugs.test index 068a49a10a9..ad173e50cb3 100644 --- a/mysql-test/t/sp-bugs.test +++ b/mysql-test/t/sp-bugs.test @@ -476,3 +476,31 @@ SHOW CREATE FUNCTION очень_очень_очень_очень_очень_оч DROP FUNCTION очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_é; SET NAMES default; + +--echo # +--echo # PS-6094 - Handler fails to trigger on Error 1049 or SQLSTATE 42000 or plain sqlexception +--echo # + +DELIMITER |; + +CREATE FUNCTION handler_func() RETURNS int(11) +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN NULL; + SELECT fake_col into @a FROM fake_table; +RETURN 1; +END| + +CREATE FUNCTION handler_func2() RETURNS int(11) +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN NULL; + SELECT fake_col into @a FROM fake_db.fake_table; +RETURN 1; +END| + +DELIMITER ;| + +select handler_func(); +select handler_func2(); + +DROP FUNCTION handler_func; +DROP FUNCTION handler_func2; diff --git a/sql/error_handler.h b/sql/error_handler.h index 3b1140a66c0..0d258122594 100644 --- a/sql/error_handler.h +++ b/sql/error_handler.h @@ -209,7 +209,8 @@ class View_error_handler : public Internal_error_handler { }; /** - This internal handler is used to trap ER_NO_SUCH_TABLE. + This internal handler is used to trap ER_NO_SUCH_TABLE and + ER_BAD_DB_ERROR. */ class No_such_table_error_handler : public Internal_error_handler { @@ -219,7 +220,7 @@ class No_such_table_error_handler : public Internal_error_handler { virtual bool handle_condition(THD *, uint sql_errno, const char *, Sql_condition::enum_severity_level *, const char *) { - if (sql_errno == ER_NO_SUCH_TABLE) { + if (sql_errno == ER_NO_SUCH_TABLE || sql_errno == ER_BAD_DB_ERROR) { m_handled_errors++; return true; } -- 2.17.1