Commit 497f6049 authored by unknown's avatar unknown

Merge kpdesk.mysql.com:/home/thek/dev/bug22043/my51-bug22043

into  kpdesk.mysql.com:/home/thek/dev/mysql-5.1-maint


mysql-test/r/information_schema.result:
  Auto merged
mysql-test/r/rpl_sp.result:
  Auto merged
mysql-test/t/information_schema.test:
  Auto merged
mysql-test/t/rpl_sp.test:
  Auto merged
sql/sql_parse.cc:
  Auto merged
parents 06ac5d2f 108107f1
......@@ -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';
......
......@@ -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;
......@@ -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;
......
......@@ -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;
......
......@@ -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;
......@@ -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
......
......@@ -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.
......@@ -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
......@@ -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
......@@ -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;
......@@ -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;
}
}
......@@ -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 &&
......@@ -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;
......@@ -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;
......
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