Bug#21801 SQL exception handlers and warnings

The problem is that deprecated syntax warnings were not being
suppressed when the stored routine is being parsed for the first
execution. It's doesn't make sense to print out deprecated
syntax warnings when the routine is being executed because this
kind of warning only matters when the routine is being created.

The solution is to suppress deprecated syntax warnings when
parsing the stored routine for loading into the cache (might
mean that the routine is being executed for the first time).
parent 83428ce9
...@@ -1627,3 +1627,14 @@ end loop label1; ...@@ -1627,3 +1627,14 @@ end loop label1;
end loop; end loop;
end| end|
ERROR 42000: End-label label1 without match ERROR 42000: End-label label1 without match
drop procedure if exists p1;
create procedure p1()
begin
create table t1 (a int) type=MyISAM;
drop table t1;
end|
Warnings:
Warning 1287 The syntax 'TYPE=storage_engine' is deprecated and will be removed in MySQL 5.2. Please use 'ENGINE=storage_engine' instead
call p1();
call p1();
drop procedure p1;
...@@ -2368,6 +2368,24 @@ end| ...@@ -2368,6 +2368,24 @@ end|
delimiter ;| delimiter ;|
#
# Bug#21801: SQL exception handlers and warnings
#
--disable_warnings
drop procedure if exists p1;
--enable_warnings
delimiter |;
create procedure p1()
begin
create table t1 (a int) type=MyISAM;
drop table t1;
end|
delimiter ;|
call p1();
call p1();
drop procedure p1;
# #
# BUG#NNNN: New bug synopsis # BUG#NNNN: New bug synopsis
# #
......
...@@ -507,6 +507,31 @@ db_find_routine(THD *thd, int type, sp_name *name, sp_head **sphp) ...@@ -507,6 +507,31 @@ db_find_routine(THD *thd, int type, sp_name *name, sp_head **sphp)
} }
/**
Silence DEPRECATED SYNTAX warnings when loading a stored procedure
into the cache.
*/
struct Silence_deprecated_warning : public Internal_error_handler
{
public:
virtual bool handle_error(uint sql_errno, const char *message,
MYSQL_ERROR::enum_warning_level level,
THD *thd);
};
bool
Silence_deprecated_warning::handle_error(uint sql_errno, const char *message,
MYSQL_ERROR::enum_warning_level level,
THD *thd)
{
if (sql_errno == ER_WARN_DEPRECATED_SYNTAX &&
level == MYSQL_ERROR::WARN_LEVEL_WARN)
return TRUE;
return FALSE;
}
static int static int
db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp, db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp,
ulong sql_mode, const char *params, const char *returns, ulong sql_mode, const char *params, const char *returns,
...@@ -523,6 +548,7 @@ db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp, ...@@ -523,6 +548,7 @@ db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp,
ulong old_sql_mode= thd->variables.sql_mode; ulong old_sql_mode= thd->variables.sql_mode;
ha_rows old_select_limit= thd->variables.select_limit; ha_rows old_select_limit= thd->variables.select_limit;
sp_rcontext *old_spcont= thd->spcont; sp_rcontext *old_spcont= thd->spcont;
Silence_deprecated_warning warning_handler;
char definer_user_name_holder[USERNAME_LENGTH + 1]; char definer_user_name_holder[USERNAME_LENGTH + 1];
LEX_STRING definer_user_name= { definer_user_name_holder, LEX_STRING definer_user_name= { definer_user_name_holder,
...@@ -583,7 +609,9 @@ db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp, ...@@ -583,7 +609,9 @@ db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp,
lex_start(thd); lex_start(thd);
thd->push_internal_handler(&warning_handler);
ret= parse_sql(thd, &lip, creation_ctx) || newlex.sphead == NULL; ret= parse_sql(thd, &lip, creation_ctx) || newlex.sphead == NULL;
thd->pop_internal_handler();
/* /*
Force switching back to the saved current database (if changed), Force switching back to the saved current database (if changed),
......
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