From e9ffed073cc77dfd853bfa5c35cdd3d3b67ac8cf Mon Sep 17 00:00:00 2001 From: Dmitry Shulga Date: Sun, 25 Jul 2021 19:40:28 +0700 Subject: MDEV-25973: fixed the test plugins.test_sql_service Set the data member THD::m_prepare_observer temporary to nullptr to avoid running a handler when a table version in TABLE_LIST differs from a value of version in TABLE_SHARE. It happens for any table when the method Ed_connection::execute_direct() is called from execute_sql_command() since the data members TABLE_LIST::m_table_ref_type and TABLES_LIST::m_table_ref_version have zero values on opening a table but corresponding members of TABLE_SHARE doesn't have. If the function execute_sql_command() is called on handling a Prepared statement it results in issuing the error ER_NEED_REPREPARE that is not issued in case the statement is run in regular way. So, to make fix the issue reset the data member THD::m_prepare_observer before running Ed_connection::execute_direct() and restoring it on return. --- sql/sql_prepare.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 0684f8c5e51..70d9dd783c8 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -6093,6 +6093,7 @@ extern "C" int execute_sql_command(const char *command, THD *new_thd= 0; int result; my_bool qc_save= 0; + Reprepare_observer *save_reprepare_observer= nullptr; if (!thd) { @@ -6113,6 +6114,8 @@ extern "C" int execute_sql_command(const char *command, qc_save= thd->query_cache_is_applicable; thd->query_cache_is_applicable= 0; + save_reprepare_observer= thd->m_reprepare_observer; + thd->m_reprepare_observer= nullptr; } sql_text.str= (char *) command; sql_text.length= strlen(command); @@ -6150,7 +6153,10 @@ extern "C" int execute_sql_command(const char *command, if (new_thd) delete new_thd; else + { thd->query_cache_is_applicable= qc_save; + thd->m_reprepare_observer= save_reprepare_observer; + } *hosts= 0; return result; -- cgit v1.2.1