Loading mysql-test/r/information_schema.result +1 −1 Original line number Diff line number Diff line Loading @@ -1077,7 +1077,7 @@ CREATE PROCEDURE p1 () BEGIN SELECT 'foo' FROM DUAL; END | ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' ERROR 42000: Unknown database 'information_schema' select ROUTINE_NAME from routines; ROUTINE_NAME grant all on information_schema.* to 'user1'@'localhost'; Loading mysql-test/r/rpl_sp.result +9 −7 Original line number Diff line number Diff line Loading @@ -468,6 +468,7 @@ drop table t1; set global log_bin_trust_function_creators=0; set global log_bin_trust_function_creators=0; End of 5.0 tests reset master; drop database if exists mysqltest; drop database if exists mysqltest2; create database mysqltest; Loading @@ -476,14 +477,15 @@ use mysqltest2; create table t ( t integer ); create procedure mysqltest.test() begin end; insert into t values ( 1 ); show binlog events in 'master-bin.000001' from 8657; show binlog events in 'master-bin.000001' from 102; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 8657 Query 1 8760 drop database if exists mysqltest2 master-bin.000001 8760 Query 1 8853 create database mysqltest master-bin.000001 8853 Query 1 8948 create database mysqltest2 master-bin.000001 8948 Query 1 9045 use `mysqltest2`; create table t ( t integer ) master-bin.000001 9045 Query 1 9184 use `mysqltest2`; CREATE DEFINER=`root`@`localhost` procedure mysqltest.test() begin end master-bin.000001 9184 Query 1 9279 use `mysqltest2`; insert into t values ( 1 ) master-bin.000001 102 Query 1 203 drop database if exists mysqltest master-bin.000001 203 Query 1 306 drop database if exists mysqltest2 master-bin.000001 306 Query 1 399 create database mysqltest master-bin.000001 399 Query 1 494 create database mysqltest2 master-bin.000001 494 Query 1 591 use `mysqltest2`; create table t ( t integer ) master-bin.000001 591 Query 1 730 use `mysqltest2`; CREATE DEFINER=`root`@`localhost` procedure mysqltest.test() begin end master-bin.000001 730 Query 1 825 use `mysqltest2`; insert into t values ( 1 ) create procedure `\\`.test() begin end; ERROR 42000: Unknown database '\\' drop database mysqltest; Loading mysql-test/t/information_schema.test +1 −1 Original line number Diff line number Diff line Loading @@ -721,7 +721,7 @@ create temporary table schemata(f1 char(10)); # Bug #10708 SP's can use INFORMATION_SCHEMA as ROUTINE_SCHEMA # delimiter |; --error 1044 --error ER_BAD_DB_ERROR CREATE PROCEDURE p1 () BEGIN SELECT 'foo' FROM DUAL; Loading mysql-test/t/rpl_sp.test +2 −1 Original line number Diff line number Diff line Loading @@ -532,6 +532,7 @@ set global log_bin_trust_function_creators=0; # Bug22043: MySQL don't add "USE <DATABASE>" before "DROP PROCEDURE IF EXISTS" # connection master; reset master; --disable_warnings drop database if exists mysqltest; drop database if exists mysqltest2; Loading @@ -542,7 +543,7 @@ use mysqltest2; create table t ( t integer ); create procedure mysqltest.test() begin end; insert into t values ( 1 ); show binlog events in 'master-bin.000001' from 8657; show binlog events in 'master-bin.000001' from 102; --error ER_BAD_DB_ERROR create procedure `\\`.test() begin end; # Clean up Loading sql/sql_parse.cc +50 −73 Original line number Diff line number Diff line Loading @@ -4426,11 +4426,10 @@ mysql_execute_command(THD *thd) { uint namelen; char *name; int result; int result= SP_INTERNAL_ERROR; DBUG_ASSERT(lex->sphead != 0); DBUG_ASSERT(lex->sphead->m_db.str); /* Must be initialized in the parser */ /* Verify that the database name is allowed, optionally lowercase it. Loading @@ -4438,37 +4437,26 @@ mysql_execute_command(THD *thd) if (check_db_name(&lex->sphead->m_db)) { my_error(ER_WRONG_DB_NAME, MYF(0), lex->sphead->m_db.str); delete lex->sphead; lex->sphead= 0; goto error; goto create_sp_error; } /* Check that a database with this name exists. Check that a database directory with this name exists. Design note: This won't work on virtual databases like information_schema. */ if (check_db_dir_existence(lex->sphead->m_db.str)) { my_error(ER_BAD_DB_ERROR, MYF(0), lex->sphead->m_db.str); delete lex->sphead; lex->sphead= 0; goto error; goto create_sp_error; } if (check_access(thd, CREATE_PROC_ACL, lex->sphead->m_db.str, 0, 0, 0, is_schema_db(lex->sphead->m_db.str))) { delete lex->sphead; lex->sphead= 0; goto error; } goto create_sp_error; if (end_active_trans(thd)) { delete lex->sphead; lex->sphead= 0; goto error; } goto create_sp_error; name= lex->sphead->name(&namelen); #ifdef HAVE_DLOPEN Loading @@ -4479,9 +4467,7 @@ mysql_execute_command(THD *thd) if (udf) { my_error(ER_UDF_EXISTS, MYF(0), name); delete lex->sphead; lex->sphead= 0; goto error; goto create_sp_error; } } #endif Loading Loading @@ -4523,13 +4509,9 @@ mysql_execute_command(THD *thd) if (ps_arena) thd->restore_active_arena(ps_arena, &original_arena); if (res) { /* Error has been already reported. */ delete lex->sphead; lex->sphead= 0; goto error; } if (res) goto create_sp_error; if (thd->slave_thread) lex->sphead->m_chistics->suid= SP_IS_NOT_SUID; Loading @@ -4549,9 +4531,7 @@ mysql_execute_command(THD *thd) if (check_global_access(thd, SUPER_ACL)) { my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "SUPER"); delete lex->sphead; lex->sphead= 0; goto error; goto create_sp_error; } } Loading @@ -4571,8 +4551,8 @@ mysql_execute_command(THD *thd) #endif /* NO_EMBEDDED_ACCESS_CHECKS */ res= (result= lex->sphead->create(thd)); if (result == SP_OK) { switch (result) { case SP_OK: #ifndef NO_EMBEDDED_ACCESS_CHECKS /* only add privileges if really neccessary */ if (sp_automatic_privileges && !opt_noacl && Loading @@ -4588,20 +4568,10 @@ mysql_execute_command(THD *thd) close_thread_tables(thd); } #endif lex->unit.cleanup(); delete lex->sphead; lex->sphead= 0; send_ok(thd); } else { switch (result) { break; case SP_WRITE_ROW_FAILED: my_error(ER_SP_ALREADY_EXISTS, MYF(0), SP_TYPE_STRING(lex), name); break; case SP_NO_DB_ERROR: my_error(ER_BAD_DB_ERROR, MYF(0), lex->sphead->m_db.str); break; case SP_BAD_IDENTIFIER: my_error(ER_TOO_LONG_IDENT, MYF(0), name); break; Loading @@ -4611,14 +4581,21 @@ mysql_execute_command(THD *thd) default: my_error(ER_SP_STORE_FAILED, MYF(0), SP_TYPE_STRING(lex), name); break; } } /* end switch */ /* Capture all errors within this CASE and clean up the environment. */ create_sp_error: lex->unit.cleanup(); delete lex->sphead; lex->sphead= 0; if (result != SP_OK ) goto error; } break; } send_ok(thd); break; /* break super switch */ } /* end case group bracket */ case SQLCOM_CALL: { sp_head *sp; Loading Loading
mysql-test/r/information_schema.result +1 −1 Original line number Diff line number Diff line Loading @@ -1077,7 +1077,7 @@ CREATE PROCEDURE p1 () BEGIN SELECT 'foo' FROM DUAL; END | ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema' ERROR 42000: Unknown database 'information_schema' select ROUTINE_NAME from routines; ROUTINE_NAME grant all on information_schema.* to 'user1'@'localhost'; Loading
mysql-test/r/rpl_sp.result +9 −7 Original line number Diff line number Diff line Loading @@ -468,6 +468,7 @@ drop table t1; set global log_bin_trust_function_creators=0; set global log_bin_trust_function_creators=0; End of 5.0 tests reset master; drop database if exists mysqltest; drop database if exists mysqltest2; create database mysqltest; Loading @@ -476,14 +477,15 @@ use mysqltest2; create table t ( t integer ); create procedure mysqltest.test() begin end; insert into t values ( 1 ); show binlog events in 'master-bin.000001' from 8657; show binlog events in 'master-bin.000001' from 102; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 8657 Query 1 8760 drop database if exists mysqltest2 master-bin.000001 8760 Query 1 8853 create database mysqltest master-bin.000001 8853 Query 1 8948 create database mysqltest2 master-bin.000001 8948 Query 1 9045 use `mysqltest2`; create table t ( t integer ) master-bin.000001 9045 Query 1 9184 use `mysqltest2`; CREATE DEFINER=`root`@`localhost` procedure mysqltest.test() begin end master-bin.000001 9184 Query 1 9279 use `mysqltest2`; insert into t values ( 1 ) master-bin.000001 102 Query 1 203 drop database if exists mysqltest master-bin.000001 203 Query 1 306 drop database if exists mysqltest2 master-bin.000001 306 Query 1 399 create database mysqltest master-bin.000001 399 Query 1 494 create database mysqltest2 master-bin.000001 494 Query 1 591 use `mysqltest2`; create table t ( t integer ) master-bin.000001 591 Query 1 730 use `mysqltest2`; CREATE DEFINER=`root`@`localhost` procedure mysqltest.test() begin end master-bin.000001 730 Query 1 825 use `mysqltest2`; insert into t values ( 1 ) create procedure `\\`.test() begin end; ERROR 42000: Unknown database '\\' drop database mysqltest; Loading
mysql-test/t/information_schema.test +1 −1 Original line number Diff line number Diff line Loading @@ -721,7 +721,7 @@ create temporary table schemata(f1 char(10)); # Bug #10708 SP's can use INFORMATION_SCHEMA as ROUTINE_SCHEMA # delimiter |; --error 1044 --error ER_BAD_DB_ERROR CREATE PROCEDURE p1 () BEGIN SELECT 'foo' FROM DUAL; Loading
mysql-test/t/rpl_sp.test +2 −1 Original line number Diff line number Diff line Loading @@ -532,6 +532,7 @@ set global log_bin_trust_function_creators=0; # Bug22043: MySQL don't add "USE <DATABASE>" before "DROP PROCEDURE IF EXISTS" # connection master; reset master; --disable_warnings drop database if exists mysqltest; drop database if exists mysqltest2; Loading @@ -542,7 +543,7 @@ use mysqltest2; create table t ( t integer ); create procedure mysqltest.test() begin end; insert into t values ( 1 ); show binlog events in 'master-bin.000001' from 8657; show binlog events in 'master-bin.000001' from 102; --error ER_BAD_DB_ERROR create procedure `\\`.test() begin end; # Clean up Loading
sql/sql_parse.cc +50 −73 Original line number Diff line number Diff line Loading @@ -4426,11 +4426,10 @@ mysql_execute_command(THD *thd) { uint namelen; char *name; int result; int result= SP_INTERNAL_ERROR; DBUG_ASSERT(lex->sphead != 0); DBUG_ASSERT(lex->sphead->m_db.str); /* Must be initialized in the parser */ /* Verify that the database name is allowed, optionally lowercase it. Loading @@ -4438,37 +4437,26 @@ mysql_execute_command(THD *thd) if (check_db_name(&lex->sphead->m_db)) { my_error(ER_WRONG_DB_NAME, MYF(0), lex->sphead->m_db.str); delete lex->sphead; lex->sphead= 0; goto error; goto create_sp_error; } /* Check that a database with this name exists. Check that a database directory with this name exists. Design note: This won't work on virtual databases like information_schema. */ if (check_db_dir_existence(lex->sphead->m_db.str)) { my_error(ER_BAD_DB_ERROR, MYF(0), lex->sphead->m_db.str); delete lex->sphead; lex->sphead= 0; goto error; goto create_sp_error; } if (check_access(thd, CREATE_PROC_ACL, lex->sphead->m_db.str, 0, 0, 0, is_schema_db(lex->sphead->m_db.str))) { delete lex->sphead; lex->sphead= 0; goto error; } goto create_sp_error; if (end_active_trans(thd)) { delete lex->sphead; lex->sphead= 0; goto error; } goto create_sp_error; name= lex->sphead->name(&namelen); #ifdef HAVE_DLOPEN Loading @@ -4479,9 +4467,7 @@ mysql_execute_command(THD *thd) if (udf) { my_error(ER_UDF_EXISTS, MYF(0), name); delete lex->sphead; lex->sphead= 0; goto error; goto create_sp_error; } } #endif Loading Loading @@ -4523,13 +4509,9 @@ mysql_execute_command(THD *thd) if (ps_arena) thd->restore_active_arena(ps_arena, &original_arena); if (res) { /* Error has been already reported. */ delete lex->sphead; lex->sphead= 0; goto error; } if (res) goto create_sp_error; if (thd->slave_thread) lex->sphead->m_chistics->suid= SP_IS_NOT_SUID; Loading @@ -4549,9 +4531,7 @@ mysql_execute_command(THD *thd) if (check_global_access(thd, SUPER_ACL)) { my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "SUPER"); delete lex->sphead; lex->sphead= 0; goto error; goto create_sp_error; } } Loading @@ -4571,8 +4551,8 @@ mysql_execute_command(THD *thd) #endif /* NO_EMBEDDED_ACCESS_CHECKS */ res= (result= lex->sphead->create(thd)); if (result == SP_OK) { switch (result) { case SP_OK: #ifndef NO_EMBEDDED_ACCESS_CHECKS /* only add privileges if really neccessary */ if (sp_automatic_privileges && !opt_noacl && Loading @@ -4588,20 +4568,10 @@ mysql_execute_command(THD *thd) close_thread_tables(thd); } #endif lex->unit.cleanup(); delete lex->sphead; lex->sphead= 0; send_ok(thd); } else { switch (result) { break; case SP_WRITE_ROW_FAILED: my_error(ER_SP_ALREADY_EXISTS, MYF(0), SP_TYPE_STRING(lex), name); break; case SP_NO_DB_ERROR: my_error(ER_BAD_DB_ERROR, MYF(0), lex->sphead->m_db.str); break; case SP_BAD_IDENTIFIER: my_error(ER_TOO_LONG_IDENT, MYF(0), name); break; Loading @@ -4611,14 +4581,21 @@ mysql_execute_command(THD *thd) default: my_error(ER_SP_STORE_FAILED, MYF(0), SP_TYPE_STRING(lex), name); break; } } /* end switch */ /* Capture all errors within this CASE and clean up the environment. */ create_sp_error: lex->unit.cleanup(); delete lex->sphead; lex->sphead= 0; if (result != SP_OK ) goto error; } break; } send_ok(thd); break; /* break super switch */ } /* end case group bracket */ case SQLCOM_CALL: { sp_head *sp; Loading