Commit 5ae3b47c authored by unknown's avatar unknown
Browse files

Merge mysql.com:/usr/local/bk/mysql-5.0

into  mysql.com:/usr/home/pem/bug14723/mysql-5.0


sql/sp_head.cc:
  Auto merged
parents b10c7d60 425207c9
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -3617,4 +3617,35 @@ count(*)
drop table t3, t4|
drop procedure bug14210|
set @@session.max_heap_table_size=default|
drop function if exists bug14723|
drop procedure if exists bug14723|
/*!50003 create function bug14723()
returns bigint(20)
main_loop: begin
return 42;
end */;;
show create function bug14723;;
Function	sql_mode	Create Function
bug14723		CREATE FUNCTION `bug14723`() RETURNS bigint(20)
main_loop: begin
return 42;
end
select bug14723();;
bug14723()
42
/*!50003 create procedure bug14723()
main_loop: begin
select 42;
end */;;
show create procedure bug14723;;
Procedure	sql_mode	Create Procedure
bug14723		CREATE PROCEDURE `bug14723`()
main_loop: begin
select 42;
end
call bug14723();;
42
42
drop function bug14723|
drop procedure bug14723|
drop table t1,t2;
+32 −0
Original line number Diff line number Diff line
@@ -4541,6 +4541,38 @@ drop table t3, t4|
drop procedure bug14210|
set @@session.max_heap_table_size=default|


#
# BUG#1473: Dumping of stored functions seems to cause corruption in
#           the function body
#
--disable_warnings
drop function if exists bug14723|
drop procedure if exists bug14723|
--enable_warnings

delimiter ;;|
/*!50003 create function bug14723()
 returns bigint(20)
main_loop: begin
  return 42;
end */;;
show create function bug14723;;
select bug14723();;

/*!50003 create procedure bug14723()
main_loop: begin
  select 42;
end */;;
show create procedure bug14723;;
call bug14723();;

delimiter |;;

drop function bug14723|
drop procedure bug14723|


#
# BUG#NNNN: New bug synopsis
#
+14 −11
Original line number Diff line number Diff line
@@ -476,7 +476,7 @@ void
sp_head::init_strings(THD *thd, LEX *lex, sp_name *name)
{
  DBUG_ENTER("sp_head::init_strings");
  uint n;			/* Counter for nul trimming */ 
  uchar *endp;                  /* Used to trim the end */
  /* During parsing, we must use thd->mem_root */
  MEM_ROOT *root= thd->mem_root;

@@ -509,17 +509,20 @@ sp_head::init_strings(THD *thd, LEX *lex, sp_name *name)
                               (char *)m_param_begin, m_params.length);
  }

  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;
  }
  /* If ptr has overrun end_of_query then end_of_query is the end */
  endp= (lex->ptr > lex->end_of_query ? lex->end_of_query : lex->ptr);
  /*
    Trim "garbage" at the end. This is sometimes needed with the
    "/ * ! VERSION... * /" wrapper in dump files.
  */
  while (m_body_begin < endp &&
         (endp[-1] <= ' ' || endp[-1] == '*' ||
          endp[-1] == '/' || endp[-1] == ';'))
    endp-= 1;

  m_body.length= endp - m_body_begin;
  m_body.str= strmake_root(root, (char *)m_body_begin, m_body.length);
  m_defstr.length= lex->ptr - lex->buf;
  m_defstr.length-= n;
  m_defstr.length= endp - lex->buf;
  m_defstr.str= strmake_root(root, (char *)lex->buf, m_defstr.length);
  DBUG_VOID_RETURN;
}