diff --git a/mysql-test/r/sp-destruct.result b/mysql-test/r/sp-destruct.result index b6891df2420..a4933ee9800 100644 --- a/mysql-test/r/sp-destruct.result +++ b/mysql-test/r/sp-destruct.result @@ -116,3 +116,21 @@ ERROR HY000: Cannot load from mysql.proc. The table is probably corrupted DROP TABLE mysql.proc; RENAME TABLE proc_backup TO mysql.proc; FLUSH TABLE mysql.proc; +# +# Bug#51376 Assert `! is_set()' failed in +# Diagnostics_area::set_ok_status on DROP FUNCTION +# +DROP FUNCTION IF EXISTS f1; +CREATE FUNCTION f1() RETURNS INT RETURN 1; +# Backup the procs_priv table +RENAME TABLE mysql.procs_priv TO procs_priv_backup; +FLUSH TABLE mysql.procs_priv; +DROP FUNCTION f1; +ERROR 42S02: Table 'mysql.procs_priv' doesn't exist +SHOW WARNINGS; +Level Code Message +Error 1146 Table 'mysql.procs_priv' doesn't exist +Warning 1405 Failed to revoke all privileges to dropped routine +# Restore the procs_priv table +RENAME TABLE procs_priv_backup TO mysql.procs_priv; +FLUSH TABLE mysql.procs_priv; diff --git a/mysql-test/t/sp-destruct.test b/mysql-test/t/sp-destruct.test index 720c24b2c24..b7090c01f1e 100644 --- a/mysql-test/t/sp-destruct.test +++ b/mysql-test/t/sp-destruct.test @@ -197,3 +197,28 @@ SHOW PROCEDURE STATUS; DROP TABLE mysql.proc; RENAME TABLE proc_backup TO mysql.proc; FLUSH TABLE mysql.proc; + + +--echo # +--echo # Bug#51376 Assert `! is_set()' failed in +--echo # Diagnostics_area::set_ok_status on DROP FUNCTION +--echo # + +--disable_warnings +DROP FUNCTION IF EXISTS f1; +--enable_warnings + +CREATE FUNCTION f1() RETURNS INT RETURN 1; + +--echo # Backup the procs_priv table +RENAME TABLE mysql.procs_priv TO procs_priv_backup; +FLUSH TABLE mysql.procs_priv; + +# DROP FUNCTION used to cause an assert. +--error ER_NO_SUCH_TABLE +DROP FUNCTION f1; +SHOW WARNINGS; + +--echo # Restore the procs_priv table +RENAME TABLE procs_priv_backup TO mysql.procs_priv; +FLUSH TABLE mysql.procs_priv; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 7a13c46e4f6..6403ad99282 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4326,14 +4326,16 @@ create_sp_error: close_thread_tables(thd); thd->mdl_context.release_transactional_locks(); - if (sp_automatic_privileges && !opt_noacl && - sp_revoke_privileges(thd, db, name, + if (sp_automatic_privileges && !opt_noacl && + sp_revoke_privileges(thd, db, name, lex->sql_command == SQLCOM_DROP_PROCEDURE)) - { - push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_PROC_AUTO_REVOKE_FAIL, - ER(ER_PROC_AUTO_REVOKE_FAIL)); - } + { + push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_PROC_AUTO_REVOKE_FAIL, + ER(ER_PROC_AUTO_REVOKE_FAIL)); + /* If this happens, an error should have been reported. */ + goto error; + } #endif } res= sp_result;