Fixed BUG#5307: Stored procedure allows statement after BEGIN ... END.
mysql-test/r/sp.result: New test case for BUG#5307 mysql-test/t/sp.test: New test case for BUG#5307 sql/sp_head.cc: Use the correct end-of-query pointer when extracting the body in the case of a create procedure compound with another statement.
This commit is contained in:
parent
339859d261
commit
2c3f49a64d
@ -1776,6 +1776,14 @@ end loop;
|
|||||||
end|
|
end|
|
||||||
call bug5287(1)|
|
call bug5287(1)|
|
||||||
drop procedure bug5287|
|
drop procedure bug5287|
|
||||||
|
create procedure bug5307()
|
||||||
|
begin
|
||||||
|
end; set @x = 3|
|
||||||
|
call bug5307()|
|
||||||
|
select @x|
|
||||||
|
@x
|
||||||
|
3
|
||||||
|
drop procedure bug5307|
|
||||||
drop table if exists fac|
|
drop table if exists fac|
|
||||||
create table fac (n int unsigned not null primary key, f bigint unsigned)|
|
create table fac (n int unsigned not null primary key, f bigint unsigned)|
|
||||||
create procedure ifac(n int unsigned)
|
create procedure ifac(n int unsigned)
|
||||||
|
@ -1942,6 +1942,18 @@ call bug5287(1)|
|
|||||||
drop procedure bug5287|
|
drop procedure bug5287|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#5307: Stored procedure allows statement after BEGIN ... END
|
||||||
|
#
|
||||||
|
create procedure bug5307()
|
||||||
|
begin
|
||||||
|
end; set @x = 3|
|
||||||
|
|
||||||
|
call bug5307()|
|
||||||
|
select @x|
|
||||||
|
drop procedure bug5307|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Some "real" examples
|
# Some "real" examples
|
||||||
#
|
#
|
||||||
|
@ -288,6 +288,7 @@ void
|
|||||||
sp_head::init_strings(THD *thd, LEX *lex, sp_name *name)
|
sp_head::init_strings(THD *thd, LEX *lex, sp_name *name)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("sp_head::init_strings");
|
DBUG_ENTER("sp_head::init_strings");
|
||||||
|
uint n; /* Counter for nul trimming */
|
||||||
/* During parsing, we must use thd->mem_root */
|
/* During parsing, we must use thd->mem_root */
|
||||||
MEM_ROOT *root= &thd->mem_root;
|
MEM_ROOT *root= &thd->mem_root;
|
||||||
|
|
||||||
@ -351,9 +352,17 @@ sp_head::init_strings(THD *thd, LEX *lex, sp_name *name)
|
|||||||
(char *)m_returns_begin, m_retstr.length);
|
(char *)m_returns_begin, m_retstr.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_body.length= lex->end_of_query - m_body_begin;
|
m_body.length= lex->ptr - m_body_begin;
|
||||||
|
/* Trim nuls at the end */
|
||||||
|
n= 0;
|
||||||
|
while (m_body.length && m_body_begin[m_body.length-1] == '\0')
|
||||||
|
{
|
||||||
|
m_body.length-= 1;
|
||||||
|
n+= 1;
|
||||||
|
}
|
||||||
m_body.str= strmake_root(root, (char *)m_body_begin, m_body.length);
|
m_body.str= strmake_root(root, (char *)m_body_begin, m_body.length);
|
||||||
m_defstr.length= lex->end_of_query - lex->buf;
|
m_defstr.length= lex->ptr - lex->buf;
|
||||||
|
m_defstr.length-= n;
|
||||||
m_defstr.str= strmake_root(root, (char *)lex->buf, m_defstr.length);
|
m_defstr.str= strmake_root(root, (char *)lex->buf, m_defstr.length);
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user