diff options
author | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2020-07-01 14:11:31 +0530 |
---|---|---|
committer | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2020-07-06 21:17:15 +0530 |
commit | a53662555302f08dc7dfb89c6ad12863fbf4e8d7 (patch) | |
tree | 828229463166a59111ff3e040755b8122240f679 | |
parent | cad9a9b1f8f09a3d7f4597bf1d68bd9c2e0c5879 (diff) | |
download | mariadb-git-a53662555302f08dc7dfb89c6ad12863fbf4e8d7.tar.gz |
MDEV-22654: Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())'
failed in Diagnostics_area::set_ok_status on FUNCTION replace
When there is REPLACE in the statement, sp_drop_routine_internal() returns
0 (SP_OK) on success which is then assigned to ret. So ret becomes false
and the error state is lost. The expression inside DBUG_ASSERT()
evaluates to false and thus the assertion failure.
-rw-r--r-- | mysql-test/r/create_drop_function.result | 17 | ||||
-rw-r--r-- | mysql-test/t/create_drop_function.test | 24 | ||||
-rw-r--r-- | sql/sp.cc | 2 |
3 files changed, 42 insertions, 1 deletions
diff --git a/mysql-test/r/create_drop_function.result b/mysql-test/r/create_drop_function.result index e9db636ab87..bdac57751b8 100644 --- a/mysql-test/r/create_drop_function.result +++ b/mysql-test/r/create_drop_function.result @@ -52,3 +52,20 @@ body DROP FUNCTION IF EXISTS f1; Warnings: Note 1305 FUNCTION test.f1 does not exist +# +# 10.1 Test +# +# MDEV-22654: Assertion `!is_set() || (m_status == DA_OK_BULK && +# is_bulk_op())' failed in Diagnostics_area::set_ok_status on FUNCTION replace +# +SET GLOBAL log_bin_trust_function_creators=0; +CREATE FUNCTION f(c INT) RETURNS NUMERIC NO SQL RETURN 0; +CREATE OR REPLACE FUNCTION f(c INT) RETURNS INT RETURN 0; +ERROR HY000: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) +CREATE OR REPLACE FUNCTION sp1_thisisaveryverylongnamelongnameverylongname_thisisaveryverylongname234872934(a INT) RETURNS INT RETURN 0; +ERROR 42000: Identifier name 'sp1_thisisaveryverylongnamelongnameverylongname_thisisaveryverylongname234872934' is too long +DROP FUNCTION IF EXISTS f; +Warnings: +Note 1305 FUNCTION test.f does not exist +SET GLOBAL log_bin_trust_function_creators=1; +# End of 10.1 Test diff --git a/mysql-test/t/create_drop_function.test b/mysql-test/t/create_drop_function.test index e4d3d684cd5..3c4770e25e3 100644 --- a/mysql-test/t/create_drop_function.test +++ b/mysql-test/t/create_drop_function.test @@ -1,3 +1,5 @@ +source include/have_log_bin.inc; + SET timestamp=UNIX_TIMESTAMP('2014-09-30 08:00:00'); CREATE FUNCTION f1(str char(20)) @@ -39,3 +41,25 @@ DROP FUNCTION IF EXISTS f1; SELECT body FROM mysql.proc WHERE name like 'f1'; DROP FUNCTION IF EXISTS f1; +--echo # +--echo # 10.1 Test +--echo # +--echo # MDEV-22654: Assertion `!is_set() || (m_status == DA_OK_BULK && +--echo # is_bulk_op())' failed in Diagnostics_area::set_ok_status on FUNCTION replace +--echo # + +SET GLOBAL log_bin_trust_function_creators=0; + +CREATE FUNCTION f(c INT) RETURNS NUMERIC NO SQL RETURN 0; + +--error ER_BINLOG_UNSAFE_ROUTINE +CREATE OR REPLACE FUNCTION f(c INT) RETURNS INT RETURN 0; + +--error ER_TOO_LONG_IDENT +CREATE OR REPLACE FUNCTION sp1_thisisaveryverylongnamelongnameverylongname_thisisaveryverylongname234872934(a INT) RETURNS INT RETURN 0; + +DROP FUNCTION IF EXISTS f; + +SET GLOBAL log_bin_trust_function_creators=1; + +--echo # End of 10.1 Test diff --git a/sql/sp.cc b/sql/sp.cc index 1d340644ba1..b783ff3b583 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -1080,7 +1080,7 @@ sp_create_routine(THD *thd, stored_procedure_type type, sp_head *sp) { if (lex->create_info.or_replace()) { - if ((ret= sp_drop_routine_internal(thd, type, lex->spname, table))) + if (sp_drop_routine_internal(thd, type, lex->spname, table)) goto done; } else if (lex->create_info.if_not_exists()) |