Merge mskold@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/usr/local/home/marty/MySQL/mysql-5.0
This commit is contained in:
commit
01b0f1a3e5
@ -526,4 +526,45 @@ delete from t1|
|
|||||||
call bug7299()|
|
call bug7299()|
|
||||||
ERROR 02000: No data to FETCH
|
ERROR 02000: No data to FETCH
|
||||||
drop procedure bug7299|
|
drop procedure bug7299|
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlexception select 1;
|
||||||
|
declare continue handler for sqlexception select 2;
|
||||||
|
end|
|
||||||
|
ERROR 42000: Duplicate handler declared in the same block
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare condname1 condition for 1234;
|
||||||
|
declare continue handler for condname1 select 1;
|
||||||
|
declare exit handler for condname1 select 2;
|
||||||
|
end|
|
||||||
|
ERROR 42000: Duplicate handler declared in the same block
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare condname1 condition for sqlstate '42000';
|
||||||
|
declare condname2 condition for sqlstate '42000';
|
||||||
|
declare exit handler for condname1 select 1;
|
||||||
|
declare continue handler for condname2 select 2;
|
||||||
|
end|
|
||||||
|
ERROR 42000: Duplicate handler declared in the same block
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare condname1 condition for sqlstate '42000';
|
||||||
|
declare exit handler for condname1 select 1;
|
||||||
|
declare exit handler for sqlstate '42000' select 2;
|
||||||
|
end|
|
||||||
|
ERROR 42000: Duplicate handler declared in the same block
|
||||||
|
drop procedure if exists bug9073|
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare condname1 condition for sqlstate '42000';
|
||||||
|
declare continue handler for condname1 select 1;
|
||||||
|
begin
|
||||||
|
declare exit handler for sqlstate '42000' select 2;
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '42000' select 3;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end|
|
||||||
|
drop procedure bug9073|
|
||||||
drop table t1|
|
drop table t1|
|
||||||
|
@ -742,6 +742,56 @@ call bug7299()|
|
|||||||
drop procedure bug7299|
|
drop procedure bug7299|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#9073: Able to declare two handlers for same condition in same scope
|
||||||
|
#
|
||||||
|
--error ER_SP_DUP_HANDLER
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlexception select 1;
|
||||||
|
declare continue handler for sqlexception select 2;
|
||||||
|
end|
|
||||||
|
--error ER_SP_DUP_HANDLER
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare condname1 condition for 1234;
|
||||||
|
declare continue handler for condname1 select 1;
|
||||||
|
declare exit handler for condname1 select 2;
|
||||||
|
end|
|
||||||
|
--error ER_SP_DUP_HANDLER
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare condname1 condition for sqlstate '42000';
|
||||||
|
declare condname2 condition for sqlstate '42000';
|
||||||
|
declare exit handler for condname1 select 1;
|
||||||
|
declare continue handler for condname2 select 2;
|
||||||
|
end|
|
||||||
|
--error ER_SP_DUP_HANDLER
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare condname1 condition for sqlstate '42000';
|
||||||
|
declare exit handler for condname1 select 1;
|
||||||
|
declare exit handler for sqlstate '42000' select 2;
|
||||||
|
end|
|
||||||
|
|
||||||
|
# This should still work.
|
||||||
|
--disable_warnings
|
||||||
|
drop procedure if exists bug9073|
|
||||||
|
--enable_warnings
|
||||||
|
create procedure bug9073()
|
||||||
|
begin
|
||||||
|
declare condname1 condition for sqlstate '42000';
|
||||||
|
declare continue handler for condname1 select 1;
|
||||||
|
begin
|
||||||
|
declare exit handler for sqlstate '42000' select 2;
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '42000' select 3;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end|
|
||||||
|
drop procedure bug9073|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#NNNN: New bug synopsis
|
# BUG#NNNN: New bug synopsis
|
||||||
#
|
#
|
||||||
|
@ -5338,4 +5338,5 @@ ER_WRONG_VALUE_FOR_TYPE
|
|||||||
eng "Incorrect %-.32s value: '%-.128s' for function %-.32s"
|
eng "Incorrect %-.32s value: '%-.128s' for function %-.32s"
|
||||||
ER_TABLE_DEF_CHANGED
|
ER_TABLE_DEF_CHANGED
|
||||||
eng "Table definition has changed, please retry transaction"
|
eng "Table definition has changed, please retry transaction"
|
||||||
|
ER_SP_DUP_HANDLER 42000
|
||||||
|
eng "Duplicate handler declared in the same block"
|
||||||
|
@ -57,6 +57,7 @@ sp_pcontext::sp_pcontext(sp_pcontext *prev)
|
|||||||
VOID(my_init_dynamic_array(&m_pvar, sizeof(sp_pvar_t *), 16, 8));
|
VOID(my_init_dynamic_array(&m_pvar, sizeof(sp_pvar_t *), 16, 8));
|
||||||
VOID(my_init_dynamic_array(&m_cond, sizeof(sp_cond_type_t *), 16, 8));
|
VOID(my_init_dynamic_array(&m_cond, sizeof(sp_cond_type_t *), 16, 8));
|
||||||
VOID(my_init_dynamic_array(&m_cursor, sizeof(LEX_STRING), 16, 8));
|
VOID(my_init_dynamic_array(&m_cursor, sizeof(LEX_STRING), 16, 8));
|
||||||
|
VOID(my_init_dynamic_array(&m_handler, sizeof(sp_cond_type_t *), 16, 8));
|
||||||
m_label.empty();
|
m_label.empty();
|
||||||
m_children.empty();
|
m_children.empty();
|
||||||
if (!prev)
|
if (!prev)
|
||||||
@ -82,6 +83,7 @@ sp_pcontext::destroy()
|
|||||||
delete_dynamic(&m_pvar);
|
delete_dynamic(&m_pvar);
|
||||||
delete_dynamic(&m_cond);
|
delete_dynamic(&m_cond);
|
||||||
delete_dynamic(&m_cursor);
|
delete_dynamic(&m_cursor);
|
||||||
|
delete_dynamic(&m_handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
sp_pcontext *
|
sp_pcontext *
|
||||||
@ -258,6 +260,41 @@ sp_pcontext::find_cond(LEX_STRING *name, my_bool scoped)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This only searches the current context, for error checking of
|
||||||
|
* duplicates.
|
||||||
|
* Returns TRUE if found.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
sp_pcontext::find_handler(sp_cond_type_t *cond)
|
||||||
|
{
|
||||||
|
uint i= m_handler.elements;
|
||||||
|
|
||||||
|
while (i--)
|
||||||
|
{
|
||||||
|
sp_cond_type_t *p;
|
||||||
|
|
||||||
|
get_dynamic(&m_handler, (gptr)&p, i);
|
||||||
|
if (cond->type == p->type)
|
||||||
|
{
|
||||||
|
switch (p->type)
|
||||||
|
{
|
||||||
|
case sp_cond_type_t::number:
|
||||||
|
if (cond->mysqlerr == p->mysqlerr)
|
||||||
|
return TRUE;
|
||||||
|
break;
|
||||||
|
case sp_cond_type_t::state:
|
||||||
|
if (strcmp(cond->sqlstate, p->sqlstate) == 0)
|
||||||
|
return TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sp_pcontext::push_cursor(LEX_STRING *name)
|
sp_pcontext::push_cursor(LEX_STRING *name)
|
||||||
{
|
{
|
||||||
|
@ -241,6 +241,15 @@ class sp_pcontext : public Sql_alloc
|
|||||||
m_handlers+= 1;
|
m_handlers+= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
push_handler(sp_cond_type_t *cond)
|
||||||
|
{
|
||||||
|
insert_dynamic(&m_handler, (gptr)&cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
find_handler(sp_cond_type *cond);
|
||||||
|
|
||||||
inline uint
|
inline uint
|
||||||
max_handlers()
|
max_handlers()
|
||||||
{
|
{
|
||||||
@ -293,6 +302,7 @@ private:
|
|||||||
DYNAMIC_ARRAY m_pvar; // Parameters/variables
|
DYNAMIC_ARRAY m_pvar; // Parameters/variables
|
||||||
DYNAMIC_ARRAY m_cond; // Conditions
|
DYNAMIC_ARRAY m_cond; // Conditions
|
||||||
DYNAMIC_ARRAY m_cursor; // Cursors
|
DYNAMIC_ARRAY m_cursor; // Cursors
|
||||||
|
DYNAMIC_ARRAY m_handler; // Handlers, for checking of duplicates
|
||||||
|
|
||||||
List<sp_label_t> m_label; // The label list
|
List<sp_label_t> m_label; // The label list
|
||||||
|
|
||||||
|
@ -1774,19 +1774,43 @@ sp_hcond_list:
|
|||||||
{
|
{
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
sp_head *sp= lex->sphead;
|
sp_head *sp= lex->sphead;
|
||||||
sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction();
|
sp_pcontext *ctx= lex->spcont;
|
||||||
|
|
||||||
i->add_condition($1);
|
if (ctx->find_handler($1))
|
||||||
$$= 1;
|
{
|
||||||
|
my_message(ER_SP_DUP_HANDLER, ER(ER_SP_DUP_HANDLER), MYF(0));
|
||||||
|
YYABORT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sp_instr_hpush_jump *i=
|
||||||
|
(sp_instr_hpush_jump *)sp->last_instruction();
|
||||||
|
|
||||||
|
i->add_condition($1);
|
||||||
|
ctx->push_handler($1);
|
||||||
|
$$= 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
| sp_hcond_list ',' sp_hcond
|
| sp_hcond_list ',' sp_hcond
|
||||||
{
|
{
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
sp_head *sp= lex->sphead;
|
sp_head *sp= lex->sphead;
|
||||||
sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction();
|
sp_pcontext *ctx= lex->spcont;
|
||||||
|
|
||||||
i->add_condition($3);
|
if (ctx->find_handler($3))
|
||||||
$$= $1 + 1;
|
{
|
||||||
|
my_message(ER_SP_DUP_HANDLER, ER(ER_SP_DUP_HANDLER), MYF(0));
|
||||||
|
YYABORT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sp_instr_hpush_jump *i=
|
||||||
|
(sp_instr_hpush_jump *)sp->last_instruction();
|
||||||
|
|
||||||
|
i->add_condition($3);
|
||||||
|
ctx->push_handler($3);
|
||||||
|
$$= $1 + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user