Commit 85e54a08 authored by unknown's avatar unknown
Browse files

Fix for BUG#7787: Stored procedures: improper warning for "grant execute" statement.

The problem was that error flag was not reset.


mysql-test/r/sp-security.result:
  Results for test case for BUG#7787.
mysql-test/t/sp-security.test:
  A test case for BUG#7787.
sql/sp.cc:
  Reset errors after sp_find_routine().
parent b56d453c
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -314,3 +314,12 @@ select * from db_bug14533.t1;
ERROR 42000: SELECT command denied to user 'user_bug14533'@'localhost' for table 't1'
drop user user_bug14533@localhost;
drop database db_bug14533;
CREATE DATABASE db_bug7787;
use db_bug7787;
CREATE PROCEDURE p1()
SHOW INNODB STATUS;
Warnings:
Warning	1287	'SHOW INNODB STATUS' is deprecated; use 'SHOW ENGINE INNODB STATUS' instead
GRANT EXECUTE ON PROCEDURE p1 TO user_bug7787@localhost;
DROP DATABASE db_bug7787;
use test;
+22 −0
Original line number Diff line number Diff line
@@ -525,4 +525,26 @@ disconnect user_bug14533;
drop user user_bug14533@localhost;
drop database db_bug14533;


#
# BUG#7787: Stored procedures: improper warning for "grant execute" statement
#

# Prepare.

CREATE DATABASE db_bug7787;
use db_bug7787;

# Test.

CREATE PROCEDURE p1()
  SHOW INNODB STATUS; 

GRANT EXECUTE ON PROCEDURE p1 TO user_bug7787@localhost; 

# Cleanup.

DROP DATABASE db_bug7787;
use test;

# End of 5.0 bugs.
+7 −4
Original line number Diff line number Diff line
@@ -1012,6 +1012,7 @@ sp_exist_routines(THD *thd, TABLE_LIST *routines, bool any, bool no_error)
{
  TABLE_LIST *routine;
  bool result= 0;
  bool sp_object_found;
  DBUG_ENTER("sp_exists_routine");
  for (routine= routines; routine; routine= routine->next_global)
  {
@@ -1024,10 +1025,12 @@ sp_exist_routines(THD *thd, TABLE_LIST *routines, bool any, bool no_error)
    lex_name.str= thd->strmake(routine->table_name, lex_name.length);
    name= new sp_name(lex_db, lex_name);
    name->init_qname(thd);
    if (sp_find_routine(thd, TYPE_ENUM_PROCEDURE, name,
    sp_object_found= sp_find_routine(thd, TYPE_ENUM_PROCEDURE, name,
                                     &thd->sp_proc_cache, FALSE) != NULL ||
                     sp_find_routine(thd, TYPE_ENUM_FUNCTION, name,
                        &thd->sp_func_cache, FALSE) != NULL)
                                     &thd->sp_func_cache, FALSE) != NULL;
    mysql_reset_errors(thd, TRUE);
    if (sp_object_found)
    {
      if (any)
        DBUG_RETURN(1);