Commit 110b887c authored by unknown's avatar unknown
Browse files

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
parents 858eef45 a9086bc7
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -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;
+45 −0
Original line number Diff line number Diff line
@@ -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
#
+2 −2
Original line number Diff line number Diff line
@@ -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--)
  {
+17 −0
Original line number Diff line number Diff line
@@ -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 @@ class sp_pcontext : public Sql_alloc

  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
+7 −1
Original line number Diff line number Diff line
@@ -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;