Fixed that when using a trigger mysql.proc is now accessed
Cleanup: Changed procedure type from a int/char to an enum for easier to manage and debug code. mysql-test/r/trigger.result: Test that mysql.proc is not used as part of creating or using a trigger. mysql-test/t/trigger.test: Test that mysql.proc is not used as part of creating or using a trigger. sql/sp.cc: The main bug fix is to not look up triggers in mysql.proc; This is done by ignoreing type == TYPE_ENUM_TRIGGER in sp_add_used_routine() Cleanup: Changed procedure type from a int/char to an enum. sql/sp.h: Cleanup: Changed procedure type from a int/char to an enum. sql/sp_head.h: Cleanup: Changed procedure type from a int/char to an enum. sql/sql_db.cc: Fix include order sql/sql_lex.cc: Fix include order sql/sql_parse.cc: Cleanup: Changed procedure type from a int/char to an enum. sql/sql_show.cc: Fix include order sql/sql_view.cc: Fix include order
This commit is contained in:
parent
5f607a2c70
commit
9c32088322
@ -2117,3 +2117,22 @@ b
|
||||
DROP DATABASE db1;
|
||||
USE test;
|
||||
End of 5.1 tests.
|
||||
create table t1 (i int);
|
||||
create table t2 (i int);
|
||||
flush tables;
|
||||
flush status;
|
||||
CREATE DEFINER=`root`@`localhost` TRIGGER trg AFTER DELETE ON t1 FOR EACH ROW BEGIN DELETE FROM t2 WHERE t2.i = OLD.i; END //
|
||||
insert into t1 values (1),(2);
|
||||
insert into t2 values (1),(2);
|
||||
delete from t1 where i=1;
|
||||
show status like 'Opened_tables';
|
||||
Variable_name Value
|
||||
Opened_tables 3
|
||||
select * from t1;
|
||||
i
|
||||
2
|
||||
select * from t2;
|
||||
i
|
||||
2
|
||||
drop table t1,t2;
|
||||
End of 5.2 tests.
|
||||
|
@ -2409,3 +2409,28 @@ DROP DATABASE db1;
|
||||
USE test;
|
||||
|
||||
--echo End of 5.1 tests.
|
||||
|
||||
#
|
||||
# Test that using a trigger will not open mysql.proc
|
||||
#
|
||||
|
||||
create table t1 (i int);
|
||||
create table t2 (i int);
|
||||
flush tables;
|
||||
flush status;
|
||||
delimiter //;
|
||||
CREATE DEFINER=`root`@`localhost` TRIGGER trg AFTER DELETE ON t1 FOR EACH ROW BEGIN DELETE FROM t2 WHERE t2.i = OLD.i; END //
|
||||
delimiter ;//
|
||||
insert into t1 values (1),(2);
|
||||
insert into t2 values (1),(2);
|
||||
delete from t1 where i=1;
|
||||
#
|
||||
# If mysql.proc would be used we would have 4 here. 3 is the correct number.
|
||||
# (CREATE TRIGGER will open t1 and then flush it)
|
||||
#
|
||||
show status like 'Opened_tables';
|
||||
select * from t1;
|
||||
select * from t2;
|
||||
drop table t1,t2;
|
||||
|
||||
--echo End of 5.2 tests.
|
||||
|
45
sql/sp.cc
45
sql/sp.cc
@ -14,8 +14,8 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include "mysql_priv.h"
|
||||
#include "sp.h"
|
||||
#include "sp_head.h"
|
||||
#include "sp.h"
|
||||
#include "sp_cache.h"
|
||||
#include "sql_trigger.h"
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
static bool
|
||||
create_string(THD *thd, String *buf,
|
||||
int sp_type,
|
||||
stored_procedure_type sp_type,
|
||||
const char *db, ulong dblen,
|
||||
const char *name, ulong namelen,
|
||||
const char *params, ulong paramslen,
|
||||
@ -33,7 +33,8 @@ create_string(THD *thd, String *buf,
|
||||
const LEX_STRING *definer_user,
|
||||
const LEX_STRING *definer_host);
|
||||
static int
|
||||
db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp,
|
||||
db_load_routine(THD *thd, stored_procedure_type type, sp_name *name,
|
||||
sp_head **sphp,
|
||||
ulong sql_mode, const char *params, const char *returns,
|
||||
const char *body, st_sp_chistics &chistics,
|
||||
const char *definer, longlong created, longlong modified,
|
||||
@ -490,7 +491,8 @@ static TABLE *open_proc_table_for_update(THD *thd)
|
||||
*/
|
||||
|
||||
static int
|
||||
db_find_routine_aux(THD *thd, int type, sp_name *name, TABLE *table)
|
||||
db_find_routine_aux(THD *thd, stored_procedure_type type, sp_name *name,
|
||||
TABLE *table)
|
||||
{
|
||||
uchar key[MAX_KEY_LENGTH]; // db, name, optional key length type
|
||||
DBUG_ENTER("db_find_routine_aux");
|
||||
@ -543,7 +545,8 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, TABLE *table)
|
||||
*/
|
||||
|
||||
static int
|
||||
db_find_routine(THD *thd, int type, sp_name *name, sp_head **sphp)
|
||||
db_find_routine(THD *thd, stored_procedure_type type, sp_name *name,
|
||||
sp_head **sphp)
|
||||
{
|
||||
TABLE *table;
|
||||
const char *params, *returns, *body;
|
||||
@ -711,7 +714,8 @@ Silence_deprecated_warning::handle_error(uint sql_errno, const char *message,
|
||||
|
||||
|
||||
static int
|
||||
db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp,
|
||||
db_load_routine(THD *thd, stored_procedure_type type,
|
||||
sp_name *name, sp_head **sphp,
|
||||
ulong sql_mode, const char *params, const char *returns,
|
||||
const char *body, st_sp_chistics &chistics,
|
||||
const char *definer, longlong created, longlong modified,
|
||||
@ -890,7 +894,7 @@ sp_returns_type(THD *thd, String &result, sp_head *sp)
|
||||
*/
|
||||
|
||||
int
|
||||
sp_create_routine(THD *thd, int type, sp_head *sp)
|
||||
sp_create_routine(THD *thd, stored_procedure_type type, sp_head *sp)
|
||||
{
|
||||
int ret;
|
||||
TABLE *table;
|
||||
@ -906,7 +910,8 @@ sp_create_routine(THD *thd, int type, sp_head *sp)
|
||||
bool save_binlog_row_based;
|
||||
|
||||
DBUG_ENTER("sp_create_routine");
|
||||
DBUG_PRINT("enter", ("type: %d name: %.*s",type, (int) sp->m_name.length,
|
||||
DBUG_PRINT("enter", ("type: %d name: %.*s", (int) type,
|
||||
(int) sp->m_name.length,
|
||||
sp->m_name.str));
|
||||
String retstr(64);
|
||||
retstr.set_charset(system_charset_info);
|
||||
@ -1151,7 +1156,7 @@ done:
|
||||
*/
|
||||
|
||||
int
|
||||
sp_drop_routine(THD *thd, int type, sp_name *name)
|
||||
sp_drop_routine(THD *thd, stored_procedure_type type, sp_name *name)
|
||||
{
|
||||
TABLE *table;
|
||||
int ret;
|
||||
@ -1211,14 +1216,16 @@ sp_drop_routine(THD *thd, int type, sp_name *name)
|
||||
*/
|
||||
|
||||
int
|
||||
sp_update_routine(THD *thd, int type, sp_name *name, st_sp_chistics *chistics)
|
||||
sp_update_routine(THD *thd, stored_procedure_type type, sp_name *name,
|
||||
st_sp_chistics *chistics)
|
||||
{
|
||||
TABLE *table;
|
||||
int ret;
|
||||
bool save_binlog_row_based;
|
||||
DBUG_ENTER("sp_update_routine");
|
||||
DBUG_PRINT("enter", ("type: %d name: %.*s",
|
||||
type, (int) name->m_name.length, name->m_name.str));
|
||||
(int) type,
|
||||
(int) name->m_name.length, name->m_name.str));
|
||||
|
||||
DBUG_ASSERT(type == TYPE_ENUM_PROCEDURE ||
|
||||
type == TYPE_ENUM_FUNCTION);
|
||||
@ -1346,7 +1353,7 @@ err:
|
||||
*/
|
||||
|
||||
bool
|
||||
sp_show_create_routine(THD *thd, int type, sp_name *name)
|
||||
sp_show_create_routine(THD *thd, stored_procedure_type type, sp_name *name)
|
||||
{
|
||||
bool err_status= TRUE;
|
||||
sp_head *sp;
|
||||
@ -1404,8 +1411,8 @@ sp_show_create_routine(THD *thd, int type, sp_name *name)
|
||||
*/
|
||||
|
||||
sp_head *
|
||||
sp_find_routine(THD *thd, int type, sp_name *name, sp_cache **cp,
|
||||
bool cache_only)
|
||||
sp_find_routine(THD *thd, stored_procedure_type type, sp_name *name,
|
||||
sp_cache **cp, bool cache_only)
|
||||
{
|
||||
sp_head *sp;
|
||||
ulong depth= (type == TYPE_ENUM_PROCEDURE ?
|
||||
@ -1562,7 +1569,7 @@ sp_exist_routines(THD *thd, TABLE_LIST *routines, bool any)
|
||||
*/
|
||||
|
||||
int
|
||||
sp_routine_exists_in_table(THD *thd, int type, sp_name *name)
|
||||
sp_routine_exists_in_table(THD *thd, stored_procedure_type type, sp_name *name)
|
||||
{
|
||||
TABLE *table;
|
||||
int ret;
|
||||
@ -1729,7 +1736,7 @@ static bool add_used_routine(LEX *lex, Query_arena *arena,
|
||||
*/
|
||||
|
||||
void sp_add_used_routine(LEX *lex, Query_arena *arena,
|
||||
sp_name *rt, char rt_type)
|
||||
sp_name *rt, enum stored_procedure_type rt_type)
|
||||
{
|
||||
rt->set_routine_type(rt_type);
|
||||
(void)add_used_routine(lex, arena, &rt->m_sroutines_key, 0);
|
||||
@ -1885,9 +1892,11 @@ sp_cache_routines_and_add_tables_aux(THD *thd, LEX *lex,
|
||||
for (Sroutine_hash_entry *rt= start; rt; rt= rt->next)
|
||||
{
|
||||
sp_name name(thd, rt->key.str, rt->key.length);
|
||||
int type= rt->key.str[0];
|
||||
stored_procedure_type type= (stored_procedure_type) rt->key.str[0];
|
||||
sp_head *sp;
|
||||
|
||||
if (type == TYPE_ENUM_TRIGGER)
|
||||
continue;
|
||||
if (!(sp= sp_cache_lookup((type == TYPE_ENUM_FUNCTION ?
|
||||
&thd->sp_func_cache : &thd->sp_proc_cache),
|
||||
&name)))
|
||||
@ -2076,7 +2085,7 @@ sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
|
||||
*/
|
||||
static bool
|
||||
create_string(THD *thd, String *buf,
|
||||
int type,
|
||||
stored_procedure_type type,
|
||||
const char *db, ulong dblen,
|
||||
const char *name, ulong namelen,
|
||||
const char *params, ulong paramslen,
|
||||
|
16
sql/sp.h
16
sql/sp.h
@ -39,26 +39,28 @@ int
|
||||
sp_drop_db_routines(THD *thd, char *db);
|
||||
|
||||
sp_head *
|
||||
sp_find_routine(THD *thd, int type, sp_name *name,
|
||||
sp_find_routine(THD *thd, stored_procedure_type type, sp_name *name,
|
||||
sp_cache **cp, bool cache_only);
|
||||
|
||||
bool
|
||||
sp_exist_routines(THD *thd, TABLE_LIST *procs, bool any);
|
||||
|
||||
int
|
||||
sp_routine_exists_in_table(THD *thd, int type, sp_name *name);
|
||||
sp_routine_exists_in_table(THD *thd, stored_procedure_type type,
|
||||
sp_name *name);
|
||||
|
||||
bool
|
||||
sp_show_create_routine(THD *thd, int type, sp_name *name);
|
||||
sp_show_create_routine(THD *thd, stored_procedure_type type, sp_name *name);
|
||||
|
||||
int
|
||||
sp_create_routine(THD *thd, int type, sp_head *sp);
|
||||
sp_create_routine(THD *thd, stored_procedure_type type, sp_head *sp);
|
||||
|
||||
int
|
||||
sp_update_routine(THD *thd, int type, sp_name *name, st_sp_chistics *chistics);
|
||||
sp_update_routine(THD *thd, stored_procedure_type type, sp_name *name,
|
||||
st_sp_chistics *chistics);
|
||||
|
||||
int
|
||||
sp_drop_routine(THD *thd, int type, sp_name *name);
|
||||
sp_drop_routine(THD *thd, stored_procedure_type type, sp_name *name);
|
||||
|
||||
/*
|
||||
Procedures for pre-caching of stored routines and building table list
|
||||
@ -67,7 +69,7 @@ sp_drop_routine(THD *thd, int type, sp_name *name);
|
||||
void sp_get_prelocking_info(THD *thd, bool *need_prelocking,
|
||||
bool *first_no_prelocking);
|
||||
void sp_add_used_routine(LEX *lex, Query_arena *arena,
|
||||
sp_name *rt, char rt_type);
|
||||
sp_name *rt, stored_procedure_type rt_type);
|
||||
void sp_remove_not_own_routines(LEX *lex);
|
||||
bool sp_update_sp_used_routines(HASH *dst, HASH *src);
|
||||
int sp_cache_routines_and_add_tables(THD *thd, LEX *lex,
|
||||
|
@ -28,11 +28,16 @@
|
||||
@ingroup Runtime_Environment
|
||||
@{
|
||||
*/
|
||||
// Values for the type enum. This reflects the order of the enum declaration
|
||||
// in the CREATE TABLE command.
|
||||
#define TYPE_ENUM_FUNCTION 1
|
||||
#define TYPE_ENUM_PROCEDURE 2
|
||||
#define TYPE_ENUM_TRIGGER 3
|
||||
/*
|
||||
Values for the type enum. This reflects the order of the enum declaration
|
||||
in the CREATE TABLE command.
|
||||
*/
|
||||
enum stored_procedure_type
|
||||
{
|
||||
TYPE_ENUM_FUNCTION=1,
|
||||
TYPE_ENUM_PROCEDURE=2,
|
||||
TYPE_ENUM_TRIGGER=3
|
||||
};
|
||||
|
||||
Item_result
|
||||
sp_map_result_type(enum enum_field_types type);
|
||||
@ -134,9 +139,9 @@ public:
|
||||
// Init. the qualified name from the db and name.
|
||||
void init_qname(THD *thd); // thd for memroot allocation
|
||||
|
||||
void set_routine_type(char type)
|
||||
void set_routine_type(stored_procedure_type type)
|
||||
{
|
||||
m_sroutines_key.str[0]= type;
|
||||
m_sroutines_key.str[0]= (char) type;
|
||||
}
|
||||
|
||||
~sp_name()
|
||||
@ -170,8 +175,7 @@ public:
|
||||
HAS_SQLCOM_FLUSH= 4096
|
||||
};
|
||||
|
||||
/** TYPE_ENUM_FUNCTION, TYPE_ENUM_PROCEDURE or TYPE_ENUM_TRIGGER */
|
||||
int m_type;
|
||||
stored_procedure_type m_type;
|
||||
uint m_flags; // Boolean attributes of a stored routine
|
||||
|
||||
Create_field m_return_field_def; /**< This is used for FUNCTIONs only. */
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
#include "mysql_priv.h"
|
||||
#include <mysys_err.h>
|
||||
#include "sp_head.h"
|
||||
#include "sp.h"
|
||||
#include "events.h"
|
||||
#include <my_dir.h>
|
||||
|
@ -21,8 +21,8 @@
|
||||
#include "item_create.h"
|
||||
#include <m_ctype.h>
|
||||
#include <hash.h>
|
||||
#include "sp.h"
|
||||
#include "sp_head.h"
|
||||
#include "sp.h"
|
||||
|
||||
/*
|
||||
We are using pointer to this variable for distinguishing between assignment
|
||||
|
@ -4560,9 +4560,10 @@ create_sp_error:
|
||||
*/
|
||||
/* Conditionally writes to binlog */
|
||||
|
||||
int type= lex->sql_command == SQLCOM_ALTER_PROCEDURE ?
|
||||
TYPE_ENUM_PROCEDURE :
|
||||
TYPE_ENUM_FUNCTION;
|
||||
stored_procedure_type type;
|
||||
type= (lex->sql_command == SQLCOM_ALTER_PROCEDURE ?
|
||||
TYPE_ENUM_PROCEDURE :
|
||||
TYPE_ENUM_FUNCTION);
|
||||
|
||||
sp_result= sp_update_routine(thd,
|
||||
type,
|
||||
@ -4590,8 +4591,8 @@ create_sp_error:
|
||||
case SQLCOM_DROP_FUNCTION:
|
||||
{
|
||||
int sp_result;
|
||||
int type= (lex->sql_command == SQLCOM_DROP_PROCEDURE ?
|
||||
TYPE_ENUM_PROCEDURE : TYPE_ENUM_FUNCTION);
|
||||
stored_procedure_type type= (lex->sql_command == SQLCOM_DROP_PROCEDURE ?
|
||||
TYPE_ENUM_PROCEDURE : TYPE_ENUM_FUNCTION);
|
||||
|
||||
sp_result= sp_routine_exists_in_table(thd, type, lex->spname);
|
||||
mysql_reset_errors(thd, 0);
|
||||
@ -4618,9 +4619,10 @@ create_sp_error:
|
||||
#endif
|
||||
/* Conditionally writes to binlog */
|
||||
|
||||
int type= lex->sql_command == SQLCOM_DROP_PROCEDURE ?
|
||||
TYPE_ENUM_PROCEDURE :
|
||||
TYPE_ENUM_FUNCTION;
|
||||
stored_procedure_type type;
|
||||
type= (lex->sql_command == SQLCOM_DROP_PROCEDURE ?
|
||||
TYPE_ENUM_PROCEDURE :
|
||||
TYPE_ENUM_FUNCTION);
|
||||
|
||||
sp_result= sp_drop_routine(thd, type, lex->spname);
|
||||
}
|
||||
|
@ -22,8 +22,8 @@
|
||||
#include "create_options.h"
|
||||
#include "sql_show.h"
|
||||
#include "repl_failsafe.h"
|
||||
#include "sp.h"
|
||||
#include "sp_head.h"
|
||||
#include "sp.h"
|
||||
#include "sql_trigger.h"
|
||||
#include "authors.h"
|
||||
#include "contributors.h"
|
||||
|
@ -18,8 +18,8 @@
|
||||
#include "mysql_priv.h"
|
||||
#include "sql_select.h"
|
||||
#include "parse_file.h"
|
||||
#include "sp.h"
|
||||
#include "sp_head.h"
|
||||
#include "sp.h"
|
||||
#include "sp_cache.h"
|
||||
|
||||
#define MD5_BUFF_LENGTH 33
|
||||
|
Loading…
x
Reference in New Issue
Block a user