Commit 85e54a08 authored by unknown's avatar unknown

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
...@@ -314,3 +314,12 @@ select * from db_bug14533.t1; ...@@ -314,3 +314,12 @@ select * from db_bug14533.t1;
ERROR 42000: SELECT command denied to user 'user_bug14533'@'localhost' for table 't1' ERROR 42000: SELECT command denied to user 'user_bug14533'@'localhost' for table 't1'
drop user user_bug14533@localhost; drop user user_bug14533@localhost;
drop database db_bug14533; 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;
...@@ -525,4 +525,26 @@ disconnect user_bug14533; ...@@ -525,4 +525,26 @@ disconnect user_bug14533;
drop user user_bug14533@localhost; drop user user_bug14533@localhost;
drop database db_bug14533; 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. # End of 5.0 bugs.
...@@ -1012,6 +1012,7 @@ sp_exist_routines(THD *thd, TABLE_LIST *routines, bool any, bool no_error) ...@@ -1012,6 +1012,7 @@ sp_exist_routines(THD *thd, TABLE_LIST *routines, bool any, bool no_error)
{ {
TABLE_LIST *routine; TABLE_LIST *routine;
bool result= 0; bool result= 0;
bool sp_object_found;
DBUG_ENTER("sp_exists_routine"); DBUG_ENTER("sp_exists_routine");
for (routine= routines; routine; routine= routine->next_global) 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) ...@@ -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); lex_name.str= thd->strmake(routine->table_name, lex_name.length);
name= new sp_name(lex_db, lex_name); name= new sp_name(lex_db, lex_name);
name->init_qname(thd); 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 || &thd->sp_proc_cache, FALSE) != NULL ||
sp_find_routine(thd, TYPE_ENUM_FUNCTION, name, 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) if (any)
DBUG_RETURN(1); DBUG_RETURN(1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment