List:Commits« Previous MessageNext Message »
From:Alexey Botchkov Date:November 21 2008 1:41pm
Subject:bzr commit into mysql-5.0-bugteam branch (holyfoot:2720) Bug#25058
View as plain text  
#At file:///home/hf/work/mysql_common/25058/

 2720 Alexey Botchkov	2008-11-21
      Bug#25058 ignored return codes in memory allocation functions
         memory allocation error checks added for functions
         calling insert_dynamic()
      
      per-file messages:
        myisam/mi_delete.c
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
        myisam/mi_write.c
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
        server-tools/instance-manager/instance_options.cc
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
        sql/slave.cc
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
        sql/sp_head.cc
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
        sql/sp_head.h
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
        sql/sp_pcontext.cc
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
        sql/sp_pcontext.h
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
        sql/sql_select.cc
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
        sql/sql_yacc.yy
      Bug#25058 ignored return codes in memory allocation functions
          out-of-memory errors handled
modified:
  myisam/mi_delete.c
  myisam/mi_write.c
  server-tools/instance-manager/instance_options.cc
  sql/slave.cc
  sql/sp_head.cc
  sql/sp_head.h
  sql/sp_pcontext.cc
  sql/sp_pcontext.h
  sql/sql_select.cc
  sql/sql_yacc.yy

=== modified file 'myisam/mi_delete.c'
--- a/myisam/mi_delete.c	2008-03-29 07:52:16 +0000
+++ b/myisam/mi_delete.c	2008-11-21 13:38:42 +0000
@@ -250,7 +250,11 @@ static int d_search(register MI_INFO *in
       if (info->ft1_to_ft2)
       {
         /* we're in ft1->ft2 conversion mode. Saving key data */
-        insert_dynamic(info->ft1_to_ft2, (char*) (lastkey+off));
+        if (insert_dynamic(info->ft1_to_ft2, (char*) (lastkey+off)))
+        {
+          DBUG_PRINT("error",("Out of memory"));
+          DBUG_RETURN(-1);
+        }
       }
       else
       {

=== modified file 'myisam/mi_write.c'
--- a/myisam/mi_write.c	2008-03-29 07:52:16 +0000
+++ b/myisam/mi_write.c	2008-11-21 13:38:42 +0000
@@ -550,7 +550,14 @@ int _mi_insert(register MI_INFO *info, r
              we cannot easily dispatch an empty page here */
           b+=blen+ft2len+2;
           for (a=anc_buff+a_length ; b < a ; b+=ft2len+2)
-            insert_dynamic(info->ft1_to_ft2, (char*) b);
+          {
+            if (insert_dynamic(info->ft1_to_ft2, (char*) b))
+            {
+              mi_print_error(info->s, HA_ERR_OUT_OF_MEM);
+              my_errno= HA_ERR_OUT_OF_MEM;
+              DBUG_RETURN(-1);
+            }
+          }
 
           /* fixing the page's length - it contains only one key now */
           mi_putint(anc_buff,2+blen+ft2len+2,0);

=== modified file 'server-tools/instance-manager/instance_options.cc'
--- a/server-tools/instance-manager/instance_options.cc	2007-03-01 21:06:57 +0000
+++ b/server-tools/instance-manager/instance_options.cc	2008-11-21 13:38:42 +0000
@@ -522,8 +522,7 @@ int Instance_options::add_option(const c
        switch (selected_options->type) {
        case SAVE_WHOLE_AND_ADD:
          *(selected_options->value)= tmp;
-         insert_dynamic(&options_array,(gptr) &tmp);
-         return 0;
+         return insert_dynamic(&options_array,(gptr) &tmp);
        case SAVE_VALUE:
          *(selected_options->value)= strchr(tmp, '=') + 1;
          return 0;

=== modified file 'sql/slave.cc'
--- a/sql/slave.cc	2008-03-28 20:01:05 +0000
+++ b/sql/slave.cc	2008-11-21 13:38:42 +0000
@@ -1053,8 +1053,7 @@ int add_wild_table_rule(DYNAMIC_ARRAY* a
   e->tbl_name = e->db + (dot - table_spec) + 1;
   e->key_len = len;
   memcpy(e->db, table_spec, len);
-  insert_dynamic(a, (gptr)&e);
-  return 0;
+  return insert_dynamic(a, (gptr)&e);
 }
 
 

=== modified file 'sql/sp_head.cc'
--- a/sql/sp_head.cc	2008-10-02 08:10:06 +0000
+++ b/sql/sp_head.cc	2008-11-21 13:38:42 +0000
@@ -1924,17 +1924,16 @@ sp_head::restore_lex(THD *thd)
   DBUG_VOID_RETURN;
 }
 
-void
+int
 sp_head::push_backpatch(sp_instr *i, sp_label_t *lab)
 {
   bp_t *bp= (bp_t *)sql_alloc(sizeof(bp_t));
 
-  if (bp)
-  {
-    bp->lab= lab;
-    bp->instr= i;
-    (void)m_backpatch.push_front(bp);
-  }
+  if (!bp)
+    return 1;
+  bp->lab= lab;
+  bp->instr= i;
+  return m_backpatch.push_front(bp);
 }
 
 void
@@ -2009,7 +2008,7 @@ sp_head::fill_field_definition(THD *thd,
 }
 
 
-void
+int
 sp_head::new_cont_backpatch(sp_instr_opt_meta *i)
 {
   m_cont_level+= 1;
@@ -2017,15 +2016,17 @@ sp_head::new_cont_backpatch(sp_instr_opt
   {
     /* Use the cont. destination slot to store the level */
     i->m_cont_dest= m_cont_level;
-    (void)m_cont_backpatch.push_front(i);
+    if (m_cont_backpatch.push_front(i))
+      return 1;
   }
+  return 0;
 }
 
-void
+int
 sp_head::add_cont_backpatch(sp_instr_opt_meta *i)
 {
   i->m_cont_dest= m_cont_level;
-  (void)m_cont_backpatch.push_front(i);
+  return m_cont_backpatch.push_front(i);
 }
 
 void
@@ -2207,7 +2208,7 @@ sp_head::show_create_procedure(THD *thd)
     instr   Instruction
 */
 
-void sp_head::add_instr(sp_instr *instr)
+int sp_head::add_instr(sp_instr *instr)
 {
   instr->free_list= m_thd->free_list;
   m_thd->free_list= 0;
@@ -2218,7 +2219,7 @@ void sp_head::add_instr(sp_instr *instr)
     entire stored procedure, as their life span is equal.
   */
   instr->mem_root= &main_mem_root;
-  insert_dynamic(&m_instr, (gptr)&instr);
+  return insert_dynamic(&m_instr, (gptr)&instr);
 }
 
 

=== modified file 'sql/sp_head.h'
--- a/sql/sp_head.h	2008-07-07 16:00:08 +0000
+++ b/sql/sp_head.h	2008-11-21 13:38:42 +0000
@@ -226,7 +226,7 @@ public:
   int
   show_create_function(THD *thd);
 
-  void
+  int
   add_instr(sp_instr *instr);
 
   inline uint
@@ -254,7 +254,7 @@ public:
   restore_lex(THD *thd);
 
   // Put the instruction on the backpatch list, associated with the label.
-  void
+  int
   push_backpatch(sp_instr *, struct sp_label *);
 
   // Update all instruction with this label in the backpatch list to
@@ -263,11 +263,11 @@ public:
   backpatch(struct sp_label *);
 
   // Start a new cont. backpatch level. If 'i' is NULL, the level is just incr.
-  void
+  int
   new_cont_backpatch(sp_instr_opt_meta *i);
 
   // Add an instruction to the current level
-  void
+  int
   add_cont_backpatch(sp_instr_opt_meta *i);
 
   // Backpatch (and pop) the current level to the current position.

=== modified file 'sql/sp_pcontext.cc'
--- a/sql/sp_pcontext.cc	2007-03-14 18:02:32 +0000
+++ b/sql/sp_pcontext.cc	2008-11-21 13:38:42 +0000
@@ -263,7 +263,8 @@ sp_pcontext::push_variable(LEX_STRING *n
   p->mode= mode;
   p->offset= current_var_count();
   p->dflt= NULL;
-  insert_dynamic(&m_vars, (gptr)&p);
+  if (insert_dynamic(&m_vars, (gptr)&p))
+    return NULL;
 
   return p;
 }
@@ -308,18 +309,17 @@ sp_pcontext::find_label(char *name)
   return NULL;
 }
 
-void
+int
 sp_pcontext::push_cond(LEX_STRING *name, sp_cond_type_t *val)
 {
   sp_cond_t *p= (sp_cond_t *)sql_alloc(sizeof(sp_cond_t));
 
-  if (p)
-  {
-    p->name.str= name->str;
-    p->name.length= name->length;
-    p->val= val;
-    insert_dynamic(&m_conds, (gptr)&p);
-  }
+  if (p == NULL)
+    return 1;
+  p->name.str= name->str;
+  p->name.length= name->length;
+  p->val= val;
+  return insert_dynamic(&m_conds, (gptr)&p);
 }
 
 /*
@@ -382,7 +382,7 @@ sp_pcontext::find_handler(sp_cond_type_t
   return FALSE;
 }
 
-void
+int
 sp_pcontext::push_cursor(LEX_STRING *name)
 {
   LEX_STRING n;
@@ -391,7 +391,7 @@ sp_pcontext::push_cursor(LEX_STRING *nam
     m_max_cursor_index+= 1;
   n.str= name->str;
   n.length= name->length;
-  insert_dynamic(&m_cursors, (gptr)&n);
+  return insert_dynamic(&m_cursors, (gptr)&n);
 }
 
 /*

=== modified file 'sql/sp_pcontext.h'
--- a/sql/sp_pcontext.h	2007-03-14 18:02:32 +0000
+++ b/sql/sp_pcontext.h	2008-11-21 13:38:42 +0000
@@ -323,7 +323,7 @@ public:
   // Conditions
   //
 
-  void
+  int
   push_cond(LEX_STRING *name, sp_cond_type_t *val);
 
   inline void
@@ -365,7 +365,7 @@ public:
   // Cursors
   //
 
-  void
+  int
   push_cursor(LEX_STRING *name);
 
   my_bool

=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc	2008-11-03 09:50:32 +0000
+++ b/sql/sql_select.cc	2008-11-21 13:38:42 +0000
@@ -3342,10 +3342,6 @@ add_key_fields(JOIN *join, KEY_FIELD **k
   }
 }
 
-/*
-  Add all keys with uses 'field' for some keypart
-  If field->and_level != and_level then only mark key_part as const_part
-*/
 
 static uint
 max_part_bit(key_part_map bits)
@@ -3355,7 +3351,16 @@ max_part_bit(key_part_map bits)
   return found;
 }
 
-static void
+/*
+  Add all keys with uses 'field' for some keypart
+  If field->and_level != and_level then only mark key_part as const_part
+
+  RETURN 
+   0 - OK
+   1 - Out of memory.
+*/
+
+static bool
 add_key_part(DYNAMIC_ARRAY *keyuse_array,KEY_FIELD *key_field)
 {
   Field *field=key_field->field;
@@ -3385,24 +3390,26 @@ add_key_part(DYNAMIC_ARRAY *keyuse_array
 	  keyuse.optimize= key_field->optimize & KEY_OPTIMIZE_REF_OR_NULL;
           keyuse.null_rejecting= key_field->null_rejecting;
           keyuse.cond_guard= key_field->cond_guard;
-	  VOID(insert_dynamic(keyuse_array,(gptr) &keyuse));
+	  if (insert_dynamic(keyuse_array,(gptr) &keyuse))
+            return TRUE;
 	}
       }
     }
   }
+  return FALSE;
 }
 
 
 #define FT_KEYPART   (MAX_REF_PARTS+10)
 
-static void
+static bool
 add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
             JOIN_TAB *stat,COND *cond,table_map usable_tables)
 {
   Item_func_match *cond_func=NULL;
 
   if (!cond)
-    return;
+    return FALSE;
 
   if (cond->type() == Item::FUNC_ITEM)
   {
@@ -3436,13 +3443,16 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
     {
       Item *item;
       while ((item=li++))
-        add_ft_keys(keyuse_array,stat,item,usable_tables);
+      {
+        if (add_ft_keys(keyuse_array,stat,item,usable_tables))
+          return TRUE;
+      }
     }
   }
 
   if (!cond_func || cond_func->key == NO_SUCH_KEY ||
       !(usable_tables & cond_func->table->map))
-    return;
+    return FALSE;
 
   KEYUSE keyuse;
   keyuse.table= cond_func->table;
@@ -3452,7 +3462,7 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
   keyuse.used_tables=cond_func->key_item()->used_tables();
   keyuse.optimize= 0;
   keyuse.keypart_map= 0;
-  VOID(insert_dynamic(keyuse_array,(gptr) &keyuse));
+  return insert_dynamic(keyuse_array,(gptr) &keyuse);
 }
 
 
@@ -3602,7 +3612,8 @@ update_ref_and_keys(THD *thd, DYNAMIC_AR
                    sargables);
     for (; field != end ; field++)
     {
-      add_key_part(keyuse,field);
+      if (add_key_part(keyuse,field))
+        return TRUE;
       /* Mark that we can optimize LEFT JOIN */
       if (field->val->type() == Item::NULL_ITEM &&
 	  !field->field->real_maybe_null())
@@ -3640,11 +3651,15 @@ update_ref_and_keys(THD *thd, DYNAMIC_AR
 
   /* fill keyuse with found key parts */
   for ( ; field != end ; field++)
-    add_key_part(keyuse,field);
+  {
+    if (add_key_part(keyuse,field))
+      return TRUE;
+  }
 
   if (select_lex->ftfunc_list->elements)
   {
-    add_ft_keys(keyuse,join_tab,cond,normal_tables);
+    if (add_ft_keys(keyuse,join_tab,cond,normal_tables))
+      return TRUE;
   }
 
   /*
@@ -3665,7 +3680,8 @@ update_ref_and_keys(THD *thd, DYNAMIC_AR
 	  (qsort_cmp) sort_keyuse);
 
     bzero((char*) &key_end,sizeof(key_end));    /* Add for easy testing */
-    VOID(insert_dynamic(keyuse,(gptr) &key_end));
+    if (insert_dynamic(keyuse,(gptr) &key_end))
+      return TRUE;
 
     use=save_pos=dynamic_element(keyuse,0,KEYUSE*);
     prev= &key_end;

=== modified file 'sql/sql_yacc.yy'
--- a/sql/sql_yacc.yy	2008-10-02 11:57:52 +0000
+++ b/sql/sql_yacc.yy	2008-11-21 13:38:42 +0000
@@ -234,9 +234,7 @@ int case_stmt_action_expr(LEX *lex, Item
                                 parsing_ctx, case_expr_id, expr, lex);
 
   sp->add_cont_backpatch(i);
-  sp->add_instr(i);
-
-  return 0;
+  return sp->add_instr(i);
 }
 
 /**
@@ -247,7 +245,7 @@ int case_stmt_action_expr(LEX *lex, Item
   @param simple true for simple cases, false for searched cases
 */
 
-void case_stmt_action_when(LEX *lex, Item *when, bool simple)
+int case_stmt_action_when(LEX *lex, Item *when, bool simple)
 {
   sp_head *sp= lex->sphead;
   sp_pcontext *ctx= lex->spcont;
@@ -279,9 +277,10 @@ void case_stmt_action_when(LEX *lex, Ite
     (jump_if_not from instruction 2 to 5, 5 to 8 ... in the example)
   */
 
-  sp->push_backpatch(i, ctx->push_label((char *)"", 0));
-  sp->add_cont_backpatch(i);
-  sp->add_instr(i);
+  return !test(i) ||
+         sp->push_backpatch(i, ctx->push_label((char *)"", 0)) ||
+         sp->add_cont_backpatch(i) ||
+         sp->add_instr(i);
 }
 
 /**
@@ -290,13 +289,14 @@ void case_stmt_action_when(LEX *lex, Ite
   @param lex the parser lex context
 */
 
-void case_stmt_action_then(LEX *lex)
+int case_stmt_action_then(LEX *lex)
 {
   sp_head *sp= lex->sphead;
   sp_pcontext *ctx= lex->spcont;
   uint ip= sp->instructions();
   sp_instr_jump *i = new sp_instr_jump(ip, ctx);
-  sp->add_instr(i);
+  if (!test(i) || sp->add_instr(i))
+    return 1;
 
   /*
     BACKPATCH: Resolving forward jump from
@@ -312,7 +312,7 @@ void case_stmt_action_then(LEX *lex)
     (jump from instruction 4 to 12, 7 to 12 ... in the example)
   */
 
-  sp->push_backpatch(i, ctx->last_label());
+  return sp->push_backpatch(i, ctx->last_label());
 }
 
 /**
@@ -1905,10 +1905,9 @@ sp_decl:
                                                  var_type,
                                                  lex,
                                                  (i == num_vars - 1));
-              if (is == NULL)
+              if (is == NULL ||
+                  lex->sphead->add_instr(is))
                 MYSQL_YYABORT;
-
-              lex->sphead->add_instr(is);
             }
 
             pctx->declare_var_boundary(0);
@@ -1927,7 +1926,8 @@ sp_decl:
 	      my_error(ER_SP_DUP_COND, MYF(0), $2.str);
 	      MYSQL_YYABORT;
 	    }
-	    YYTHD->lex->spcont->push_cond(&$2, $5);
+	    if(YYTHD->lex->spcont->push_cond(&$2, $5))
+              MYSQL_YYABORT;
 	    $$.vars= $$.hndlrs= $$.curs= 0;
 	    $$.conds= 1;
 	  }
@@ -1942,10 +1942,10 @@ sp_decl:
 	    sp_instr_hpush_jump *i=
               new sp_instr_hpush_jump(sp->instructions(), ctx, $2,
 	                              ctx->current_var_count());
-            if (i == NULL)
+            if (i == NULL ||
+	        sp->add_instr(i))
               MYSQL_YYABORT;
 
-	    sp->add_instr(i);
 	    sp->push_backpatch(i, ctx->push_label((char *)"", 0));
 	  }
 	  sp_hcond_list sp_proc_stmt
@@ -1960,17 +1960,17 @@ sp_decl:
 	    {
 	      i= new sp_instr_hreturn(sp->instructions(), ctx,
 	                              ctx->current_var_count());
-              if (i == NULL )
+              if (i == NULL ||
+	          sp->add_instr(i))
                 MYSQL_YYABORT;
-	      sp->add_instr(i);
 	    }
 	    else
 	    {  /* EXIT or UNDO handler, just jump to the end of the block */
 	      i= new sp_instr_hreturn(sp->instructions(), ctx, 0);
-              if (i == NULL)
+              if (i == NULL ||
+	          sp->add_instr(i) ||
+	          sp->push_backpatch(i, lex->spcont->last_label())) /* Block end */
                 MYSQL_YYABORT;
-	      sp->add_instr(i);
-	      sp->push_backpatch(i, lex->spcont->last_label()); /* Block end */
 	    }
 	    lex->sphead->backpatch(hlab);
 
@@ -1996,10 +1996,10 @@ sp_decl:
 	    }
             i= new sp_instr_cpush(sp->instructions(), ctx, $5,
                                   ctx->current_cursor_count());
-	    if (i == NULL)
+	    if (i == NULL ||
+                sp->add_instr(i) ||
+	        ctx->push_cursor(&$2))
               MYSQL_YYABORT;
-            sp->add_instr(i);
-	    ctx->push_cursor(&$2);
 	    $$.vars= $$.conds= $$.hndlrs= 0;
 	    $$.curs= 1;
 	  }
@@ -2223,10 +2223,11 @@ sp_proc_stmt:
                 i->m_query.length= lip->ptr - sp->m_tmp_query;
               else
                 i->m_query.length= lip->tok_end - sp->m_tmp_query;
-              i->m_query.str= strmake_root(thd->mem_root,
-                                           sp->m_tmp_query,
-                                           i->m_query.length);
-              sp->add_instr(i);
+              if (!(i->m_query.str= strmake_root(thd->mem_root,
+                                                 sp->m_tmp_query,
+                                                 i->m_query.length)) ||
+                    sp->add_instr(i))
+                MYSQL_YYABORT;
             }
 	    sp->restore_lex(thd);
           }
@@ -2251,9 +2252,9 @@ sp_proc_stmt:
 
 	      i= new sp_instr_freturn(sp->instructions(), lex->spcont, $3,
                                       sp->m_return_field_def.sql_type, lex);
-              if (i == NULL)
+              if (i == NULL ||
+	          sp->add_instr(i))
                 MYSQL_YYABORT;
-	      sp->add_instr(i);
 	      sp->m_flags|= sp_head::HAS_RETURN;
 	    }
 	    sp->restore_lex(YYTHD);
@@ -2311,23 +2312,23 @@ sp_proc_stmt:
 	      if (n)
               {
                 sp_instr_hpop *hpop= new sp_instr_hpop(ip++, ctx, n);
-                if (hpop == NULL)
+                if (hpop == NULL ||
+	            sp->add_instr(hpop))
                   MYSQL_YYABORT;
-	        sp->add_instr(hpop);
               }
 	      n= ctx->diff_cursors(lab->ctx, exclusive);
 	      if (n)
               {
                 sp_instr_cpop *cpop= new sp_instr_cpop(ip++, ctx, n);
-                if (cpop == NULL)
+                if (cpop == NULL ||
+	            sp->add_instr(cpop))
                   MYSQL_YYABORT;
-	        sp->add_instr(cpop);
               }
 	      i= new sp_instr_jump(ip, ctx);
-              if (i == NULL)
+              if (i == NULL ||
+	          sp->push_backpatch(i, lab) ||  /* Jumping forward */
+                  sp->add_instr(i))
                 MYSQL_YYABORT;
-	      sp->push_backpatch(i, lab);  /* Jumping forward */
-              sp->add_instr(i);
 	    }
 	  }
 	| ITERATE_SYM label_ident
@@ -2352,22 +2353,22 @@ sp_proc_stmt:
 	      if (n)
               {
                 sp_instr_hpop *hpop= new sp_instr_hpop(ip++, ctx, n);
-                if (hpop == NULL)
+                if (hpop == NULL ||
+	            sp->add_instr(hpop))
                   MYSQL_YYABORT;
-	        sp->add_instr(hpop);
               }
 	      n= ctx->diff_cursors(lab->ctx, FALSE);  /* Inclusive the dest. */
 	      if (n)
               {
                 sp_instr_cpop *cpop= new sp_instr_cpop(ip++, ctx, n);
-                if (cpop == NULL)
+                if (cpop == NULL ||
+	            sp->add_instr(cpop))
                   MYSQL_YYABORT;
-	        sp->add_instr(cpop);
               }
 	      i= new sp_instr_jump(ip, ctx, lab->ip); /* Jump back */
-              if (i == NULL)
+              if (i == NULL ||
+                  sp->add_instr(i))
                 MYSQL_YYABORT;
-              sp->add_instr(i);
 	    }
 	  }
 	| OPEN_SYM ident
@@ -2383,9 +2384,9 @@ sp_proc_stmt:
 	      MYSQL_YYABORT;
 	    }
 	    i= new sp_instr_copen(sp->instructions(), lex->spcont, offset);
-            if (i == NULL)
+            if (i == NULL ||
+	        sp->add_instr(i))
               MYSQL_YYABORT;
-	    sp->add_instr(i);
 	  }
 	| FETCH_SYM sp_opt_fetch_noise ident INTO
 	  {
@@ -2400,9 +2401,9 @@ sp_proc_stmt:
 	      MYSQL_YYABORT;
 	    }
 	    i= new sp_instr_cfetch(sp->instructions(), lex->spcont, offset);
-            if (i == NULL)
+            if (i == NULL ||
+	        sp->add_instr(i))
               MYSQL_YYABORT;
-	    sp->add_instr(i);
 	  }
 	  sp_fetch_list
 	  { }
@@ -2419,9 +2420,9 @@ sp_proc_stmt:
 	      MYSQL_YYABORT;
 	    }
 	    i= new sp_instr_cclose(sp->instructions(), lex->spcont,  offset);
-            if (i == NULL)
+            if (i == NULL ||
+	        sp->add_instr(i))
               MYSQL_YYABORT;
-	    sp->add_instr(i);
 	  }
 	;
 
@@ -2488,11 +2489,11 @@ sp_if:
 	    uint ip= sp->instructions();
 	    sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, ctx,
                                                                $2, lex);
-            if (i == NULL)
+            if (i == NULL ||
+	        sp->push_backpatch(i, ctx->push_label((char *)"", 0)) ||
+                sp->add_cont_backpatch(i) ||
+                sp->add_instr(i))
               MYSQL_YYABORT;
-	    sp->push_backpatch(i, ctx->push_label((char *)"", 0));
-            sp->add_cont_backpatch(i);
-            sp->add_instr(i);
             sp->restore_lex(YYTHD);
 	  }
 	  sp_proc_stmts1
@@ -2501,9 +2502,9 @@ sp_if:
 	    sp_pcontext *ctx= Lex->spcont;
 	    uint ip= sp->instructions();
 	    sp_instr_jump *i = new sp_instr_jump(ip, ctx);
-            if (i == NULL)
+            if (i == NULL ||
+	        sp->add_instr(i))
               MYSQL_YYABORT;
-	    sp->add_instr(i);
 	    sp->backpatch(ctx->pop_label());
 	    sp->push_backpatch(i, ctx->push_label((char *)"", 0));
 	  }
@@ -2589,14 +2590,16 @@ simple_when_clause:
             /* Simple case: <caseval> = <whenval> */
 
             LEX *lex= Lex;
-            case_stmt_action_when(lex, $3, true);
+            if (case_stmt_action_when(lex, $3, true))
+              MYSQL_YYABORT;
             lex->sphead->restore_lex(YYTHD); /* For expr $3 */
           }
           THEN_SYM
           sp_proc_stmts1
           {
             LEX *lex= Lex;
-            case_stmt_action_then(lex);
+            if (case_stmt_action_then(lex))
+              MYSQL_YYABORT;
           }
         ;
 
@@ -2609,14 +2612,16 @@ searched_when_clause:
           expr
           {
             LEX *lex= Lex;
-            case_stmt_action_when(lex, $3, false);
+            if (case_stmt_action_when(lex, $3, false))
+              MYSQL_YYABORT;
             lex->sphead->restore_lex(YYTHD); /* For expr $3 */
           }
           THEN_SYM
           sp_proc_stmts1
           {
             LEX *lex= Lex;
-            case_stmt_action_then(lex);
+            if (case_stmt_action_then(lex))
+              MYSQL_YYABORT;
           }
         ;
 
@@ -2628,9 +2633,9 @@ else_clause_opt:
             uint ip= sp->instructions();
             sp_instr_error *i= new sp_instr_error(ip, lex->spcont,
                                                   ER_SP_CASE_NOT_FOUND);
-            if (i == NULL)
+            if (i == NULL ||
+                sp->add_instr(i))
               MYSQL_YYABORT;
-            sp->add_instr(i);
           }
         | ELSE sp_proc_stmts1
         ;
@@ -2744,17 +2749,17 @@ sp_block_content:
             {
               sp_instr_hpop *hpop= new sp_instr_hpop(sp->instructions(), ctx,
                                                      $3.hndlrs);
-              if (hpop == NULL)
+              if (hpop == NULL ||
+	          sp->add_instr(hpop))
                 MYSQL_YYABORT;
-	      sp->add_instr(hpop);
             }
 	    if ($3.curs)
             {
               sp_instr_cpop *cpop= new sp_instr_cpop(sp->instructions(), ctx,
                                                      $3.curs);
-              if (cpop == NULL)
+              if (cpop == NULL ||
+	          sp->add_instr(cpop))
                 MYSQL_YYABORT;
-	      sp->add_instr(cpop);
             }
 	    lex->spcont= ctx->pop_context();
 	  }
@@ -2768,9 +2773,9 @@ sp_unlabeled_control:
 	    uint ip= lex->sphead->instructions();
 	    sp_label_t *lab= lex->spcont->last_label();  /* Jumping back */
 	    sp_instr_jump *i = new sp_instr_jump(ip, lex->spcont, lab->ip);
-            if (i == NULL)
+            if (i == NULL ||
+	        lex->sphead->add_instr(i))
               MYSQL_YYABORT;
-	    lex->sphead->add_instr(i);
 	  }
         | WHILE_SYM 
           {
@@ -2784,12 +2789,12 @@ sp_unlabeled_control:
 	    uint ip= sp->instructions();
 	    sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, lex->spcont,
 							       $3, lex);
-            if (i == NULL)
-              MYSQL_YYABORT;
+            if (i == NULL ||
 	    /* Jumping forward */
-	    sp->push_backpatch(i, lex->spcont->last_label());
-            sp->new_cont_backpatch(i);
-            sp->add_instr(i);
+                sp->push_backpatch(i, lex->spcont->last_label()) ||
+                sp->new_cont_backpatch(i) ||
+                sp->add_instr(i))
+              MYSQL_YYABORT;
             sp->restore_lex(YYTHD);
 	  }
 	  sp_proc_stmts1 END WHILE_SYM
@@ -2798,9 +2803,9 @@ sp_unlabeled_control:
 	    uint ip= lex->sphead->instructions();
 	    sp_label_t *lab= lex->spcont->last_label();  /* Jumping back */
 	    sp_instr_jump *i = new sp_instr_jump(ip, lex->spcont, lab->ip);
-            if (i == NULL)
+            if (i == NULL ||
+	        lex->sphead->add_instr(i))
               MYSQL_YYABORT;
-	    lex->sphead->add_instr(i);
             lex->sphead->do_cont_backpatch();
 	  }
         | REPEAT_SYM sp_proc_stmts1 UNTIL_SYM 
@@ -2816,9 +2821,9 @@ sp_unlabeled_control:
 	    sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, lex->spcont,
                                                                $5, lab->ip,
                                                                lex);
-            if (i == NULL)
+            if (i == NULL ||
+                lex->sphead->add_instr(i))
               MYSQL_YYABORT;
-            lex->sphead->add_instr(i);
             lex->sphead->restore_lex(YYTHD);
             /* We can shortcut the cont_backpatch here */
             i->m_cont_dest= ip+1;
@@ -9643,7 +9648,8 @@ option_type_value:
                       qbuff.length);
               qbuff.length+= 4;
               i->m_query= qbuff;
-              sp->add_instr(i);
+              if (sp->add_instr(i))
+                MYSQL_YYABORT;
             }
             lex->sphead->restore_lex(thd);
           }
@@ -9725,7 +9731,8 @@ sys_option_value:
             lex->trg_table_fields.link_in_list((byte *)trg_fld,
                                     (byte **)&trg_fld->next_trg_field);
 
-            lex->sphead->add_instr(sp_fld);
+            if (lex->sphead->add_instr(sp_fld))
+              MYSQL_YYABORT;
           }
           else if ($2.var)
           { /* System variable */
@@ -9755,11 +9762,12 @@ sys_option_value:
               it= spv->dflt;
             else
               it= new Item_null();
-            if (it == NULL)
+            if (it == NULL ||
+                (sp_set= new sp_instr_set(lex->sphead->instructions(), ctx,
+                                          spv->offset, it, spv->type, lex,
+                                          TRUE)) == NULL ||
+                lex->sphead->add_instr(sp_set))
               MYSQL_YYABORT;
-            sp_set= new sp_instr_set(lex->sphead->instructions(), ctx,
-                                     spv->offset, it, spv->type, lex, TRUE);
-            lex->sphead->add_instr(sp_set);
           }
         }
         | option_type TRANSACTION_SYM ISOLATION LEVEL_SYM isolation_types

Thread
bzr commit into mysql-5.0-bugteam branch (holyfoot:2720) Bug#25058Alexey Botchkov21 Nov