mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Merge mysql.com:/usr/local/bk/mysql-5.0
into mysql.com:/usr/home/pem/bug14376/mysql-5.0 sql/sp_pcontext.cc: Auto merged sql/sql_yacc.yy: Auto merged mysql-test/r/sp.result: SCCS merged mysql-test/t/sp.test: SCCS merged sql/sp_pcontext.h: SCCS merged
This commit is contained in:
commit
110b887c4e
5 changed files with 100 additions and 3 deletions
|
@ -4070,4 +4070,33 @@ a
|
|||
3
|
||||
drop procedure bug14304|
|
||||
drop table t3, t4|
|
||||
drop procedure if exists bug14376|
|
||||
create procedure bug14376()
|
||||
begin
|
||||
declare x int default x;
|
||||
end|
|
||||
call bug14376()|
|
||||
ERROR 42S22: Unknown column 'x' in 'field list'
|
||||
drop procedure bug14376|
|
||||
create procedure bug14376()
|
||||
begin
|
||||
declare x int default 42;
|
||||
begin
|
||||
declare x int default x;
|
||||
select x;
|
||||
end;
|
||||
end|
|
||||
call bug14376()|
|
||||
x
|
||||
42
|
||||
drop procedure bug14376|
|
||||
create procedure bug14376(x int)
|
||||
begin
|
||||
declare x int default x;
|
||||
select x;
|
||||
end|
|
||||
call bug14376(4711)|
|
||||
x
|
||||
4711
|
||||
drop procedure bug14376|
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -4855,6 +4855,51 @@ call bug14304()|
|
|||
drop procedure bug14304|
|
||||
drop table t3, t4|
|
||||
|
||||
#
|
||||
# BUG#14376: MySQL crash on scoped variable (re)initialization
|
||||
#
|
||||
--disable_warnings
|
||||
drop procedure if exists bug14376|
|
||||
--enable_warnings
|
||||
|
||||
create procedure bug14376()
|
||||
begin
|
||||
declare x int default x;
|
||||
end|
|
||||
|
||||
# Not the error we want, but that's what we got for now...
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
call bug14376()|
|
||||
drop procedure bug14376|
|
||||
|
||||
create procedure bug14376()
|
||||
begin
|
||||
declare x int default 42;
|
||||
|
||||
begin
|
||||
declare x int default x;
|
||||
|
||||
select x;
|
||||
end;
|
||||
end|
|
||||
|
||||
call bug14376()|
|
||||
|
||||
drop procedure bug14376|
|
||||
|
||||
create procedure bug14376(x int)
|
||||
begin
|
||||
declare x int default x;
|
||||
|
||||
select x;
|
||||
end|
|
||||
|
||||
call bug14376(4711)|
|
||||
|
||||
drop procedure bug14376|
|
||||
|
||||
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
#
|
||||
|
|
|
@ -52,7 +52,7 @@ sp_cond_check(LEX_STRING *sqlstate)
|
|||
|
||||
sp_pcontext::sp_pcontext(sp_pcontext *prev)
|
||||
: Sql_alloc(), m_psubsize(0), m_csubsize(0), m_hsubsize(0),
|
||||
m_handlers(0), m_parent(prev)
|
||||
m_handlers(0), m_parent(prev), m_pboundary(0)
|
||||
{
|
||||
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));
|
||||
|
@ -150,7 +150,7 @@ sp_pcontext::diff_cursors(sp_pcontext *ctx)
|
|||
sp_pvar_t *
|
||||
sp_pcontext::find_pvar(LEX_STRING *name, my_bool scoped)
|
||||
{
|
||||
uint i= m_pvar.elements;
|
||||
uint i= m_pvar.elements - m_pboundary;
|
||||
|
||||
while (i--)
|
||||
{
|
||||
|
|
|
@ -174,6 +174,16 @@ class sp_pcontext : public Sql_alloc
|
|||
sp_pvar_t *
|
||||
find_pvar(uint offset);
|
||||
|
||||
/*
|
||||
Set the current scope boundary (for default values)
|
||||
The argument is the number of variables to skip.
|
||||
*/
|
||||
inline void
|
||||
declare_var_boundary(uint n)
|
||||
{
|
||||
m_pboundary= n;
|
||||
}
|
||||
|
||||
//
|
||||
// Labels
|
||||
//
|
||||
|
@ -282,6 +292,13 @@ private:
|
|||
|
||||
uint m_poffset; // Variable offset for this context
|
||||
uint m_coffset; // Cursor offset for this context
|
||||
/*
|
||||
Boundary for finding variables in this context. This is the number
|
||||
of variables currently "invisible" to default clauses.
|
||||
This is normally 0, but will be larger during parsing of
|
||||
DECLARE ... DEFAULT, to get the scope right for DEFAULT values.
|
||||
*/
|
||||
uint m_pboundary;
|
||||
|
||||
DYNAMIC_ARRAY m_pvar; // Parameters/variables
|
||||
DYNAMIC_ARRAY m_cond; // Conditions
|
||||
|
|
|
@ -1592,7 +1592,12 @@ sp_decls:
|
|||
|
||||
sp_decl:
|
||||
DECLARE_SYM sp_decl_idents type
|
||||
{ Lex->sphead->reset_lex(YYTHD); }
|
||||
{
|
||||
LEX *lex= Lex;
|
||||
|
||||
lex->sphead->reset_lex(YYTHD);
|
||||
lex->spcont->declare_var_boundary($2);
|
||||
}
|
||||
sp_opt_default
|
||||
{
|
||||
LEX *lex= Lex;
|
||||
|
@ -1623,6 +1628,7 @@ sp_decl:
|
|||
lex->sphead->add_instr(in);
|
||||
ctx->set_default(off, it);
|
||||
}
|
||||
ctx->declare_var_boundary(0);
|
||||
lex->sphead->restore_lex(YYTHD);
|
||||
$$.vars= $2;
|
||||
$$.conds= $$.hndlrs= $$.curs= 0;
|
||||
|
|
Loading…
Reference in a new issue