diff --git a/mysql-test/r/sp-security.result b/mysql-test/r/sp-security.result index cd5e6a16967..882072ff7c7 100644 --- a/mysql-test/r/sp-security.result +++ b/mysql-test/r/sp-security.result @@ -755,3 +755,21 @@ GRANT EXECUTE ON PROCEDURE `test`.`sp1` TO 'root'@'localhost' GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION drop procedure sp1; set password=''; +# +# MDEV-13396 Unexpected "alter routine comand defined" during CREATE OR REPLACE PROCEDURE +# +CREATE DATABASE u1; +CREATE PROCEDURE u1.p1() BEGIN SELECT 1; END; $$ +CREATE FUNCTION u1.f1() RETURNS INT BEGIN RETURN 1; END; $$ +CREATE USER u1@localhost; +GRANT CREATE ROUTINE ON u1.* TO u1@localhost; +GRANT ALTER ROUTINE ON FUNCTION u1.f1 TO u1@localhost; +GRANT ALTER ROUTINE ON PROCEDURE u1.p1 TO u1@localhost; +connect u1, localhost, u1,,; +USE u1; +CREATE OR REPLACE FUNCTION f1() RETURNS INT BEGIN RETURN 2; END; $$ +CREATE OR REPLACE PROCEDURE p1() BEGIN SELECT 1; END; $$ +disconnect u1; +connection default; +DROP DATABASE u1; +DROP USER u1@localhost; diff --git a/mysql-test/t/sp-security.test b/mysql-test/t/sp-security.test index f719cbff11c..059a5dd0fa8 100644 --- a/mysql-test/t/sp-security.test +++ b/mysql-test/t/sp-security.test @@ -1023,3 +1023,30 @@ grant execute on procedure sp1 to current_user() identified by 'barfoo'; show grants; drop procedure sp1; set password=''; + +--echo # +--echo # MDEV-13396 Unexpected "alter routine comand defined" during CREATE OR REPLACE PROCEDURE +--echo # + +CREATE DATABASE u1; +DELIMITER $$; +CREATE PROCEDURE u1.p1() BEGIN SELECT 1; END; $$ +CREATE FUNCTION u1.f1() RETURNS INT BEGIN RETURN 1; END; $$ +DELIMITER ;$$ + +CREATE USER u1@localhost; +GRANT CREATE ROUTINE ON u1.* TO u1@localhost; +GRANT ALTER ROUTINE ON FUNCTION u1.f1 TO u1@localhost; +GRANT ALTER ROUTINE ON PROCEDURE u1.p1 TO u1@localhost; + +connect (u1, localhost, u1,,); +USE u1; +DELIMITER $$; +CREATE OR REPLACE FUNCTION f1() RETURNS INT BEGIN RETURN 2; END; $$ +CREATE OR REPLACE PROCEDURE p1() BEGIN SELECT 1; END; $$ +DELIMITER ;$$ + +disconnect u1; +connection default; +DROP DATABASE u1; +DROP USER u1@localhost; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ac742d79681..4f0610cffcb 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -5660,7 +5660,7 @@ end_with_restore_list: { if (check_routine_access(thd, ALTER_PROC_ACL, lex->spname->m_db.str, lex->spname->m_name.str, - lex->sql_command == SQLCOM_DROP_PROCEDURE, 0)) + lex->sql_command == SQLCOM_CREATE_PROCEDURE, 0)) goto error; }