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().
This commit is contained in:
parent
b56d453c8d
commit
85e54a08c4
@ -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;
|
|||||||
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.
|
||||||
|
11
sql/sp.cc
11
sql/sp.cc
@ -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)
|
|||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user