diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 36a4331c9be..3ea9b3676dd 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2844,4 +2844,10 @@ drop procedure bug6900| drop procedure bug9074| drop procedure bug6900_9074| drop table t3| +drop procedure if exists avg| +create procedure avg () +begin +end| +call avg ()| +drop procedure avg| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 69c7544ee7c..e31d360c52f 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3481,6 +3481,20 @@ drop procedure bug6900_9074| drop table t3| +# +# BUG#7185: Stored procedure crash if identifier is AVG +# +--disable_warnings +drop procedure if exists avg| +--enable_warnings +create procedure avg () +begin +end| + +call avg ()| +drop procedure avg| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ac1b1148cf8..ee385f9792e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4128,7 +4128,15 @@ unsent_create_error: sp= sp_find_function(thd, lex->spname); mysql_reset_errors(thd, 0); if (! sp) - result= SP_KEY_NOT_FOUND; + { + if (lex->spname->m_db.str) + result= SP_KEY_NOT_FOUND; + else + { + my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); + goto error; + } + } else { if (check_procedure_access(thd, ALTER_PROC_ACL, sp->m_db.str, @@ -4207,7 +4215,13 @@ unsent_create_error: } } #endif - result= SP_KEY_NOT_FOUND; + if (lex->spname->m_db.str) + result= SP_KEY_NOT_FOUND; + else + { + my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); + goto error; + } } res= result; switch (result) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 9ff7f4449b2..2516893ee24 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1328,12 +1328,12 @@ clear_privileges: ; sp_name: - IDENT_sys '.' IDENT_sys + ident '.' ident { $$= new sp_name($1, $3); $$->init_qname(YYTHD); } - | IDENT_sys + | ident { $$= sp_name_current_db_new(YYTHD, $1); }