Commit d51a5bae authored by unknown's avatar unknown
Browse files

Fix for trigger.test failure in --debug mode.

We can't have Item_trigger_field as aggregated object inside of
sp_instr_set_trigger_field class since in this case its destructor
will be called twice. So instead let us create this Item separately
and store pointer to it in instruction object.


sql/sp_head.cc:
  sp_instr_set_trigger_field:
    We can't have Item_trigger_field as aggregated object since in this
    case its destructor will be called twice, so let us store pointer
    to this Item (Another way to avoid this is to exclude this Item
    from free_list but this can't be done in elegant way in 5.0 and
    will also cause additional problems with Item::cleanup()).
sql/sp_head.h:
  sp_instr_set_trigger_field:
    We can't have Item_trigger_field as aggregated object since in this
    case its destructor will be called twice, so let us store pointer
    to this Item (Another way to avoid this is to exclude this Item
    from free_list but this can't be done in elegant way in 5.0 and
    will also cause additional problems with Item::cleanup()).
sql/sql_yacc.yy:
  We can't have Item_trigger_field as aggregated object inside of
  sp_instr_set_trigger_field class since in this case its destructor
  will be called twice. So instead let us create this Item separately
  and store pointer to it in instruction object.
parent f0f9b595
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1499,8 +1499,8 @@ sp_instr_set_trigger_field::execute(THD *thd, uint *nextp)
  DBUG_ENTER("sp_instr_set_trigger_field::execute");
  /* QQ: Still unsure what should we return in case of error 1 or -1 ? */
  if (!value->fixed && value->fix_fields(thd, 0, &value) ||
      trigger_field.fix_fields(thd, 0, 0) ||
      (value->save_in_field(trigger_field.field, 0) < 0))
      trigger_field->fix_fields(thd, 0, 0) ||
      (value->save_in_field(trigger_field->field, 0) < 0))
    res= -1;
  *nextp= m_ip + 1;
  DBUG_RETURN(res);
@@ -1510,7 +1510,7 @@ void
sp_instr_set_trigger_field::print(String *str)
{
  str->append("set ", 4);
  trigger_field.print(str);
  trigger_field->print(str);
  str->append(":=", 2);
  value->print(str);
}
+3 −4
Original line number Diff line number Diff line
@@ -467,9 +467,9 @@ class sp_instr_set_trigger_field : public sp_instr
public:

  sp_instr_set_trigger_field(uint ip, sp_pcontext *ctx,
                             LEX_STRING field_name, Item *val)
                             Item_trigger_field *trg_fld, Item *val)
    : sp_instr(ip, ctx),
      trigger_field(Item_trigger_field::NEW_ROW, field_name.str),
      trigger_field(trg_fld),
      value(val)
  {}

@@ -480,9 +480,8 @@ class sp_instr_set_trigger_field : public sp_instr

  virtual void print(String *str);

  Item_trigger_field trigger_field;

private:
  Item_trigger_field *trigger_field;
  Item *value;
}; // class sp_instr_trigger_field : public sp_instr

+8 −5
Original line number Diff line number Diff line
@@ -7565,6 +7565,7 @@ sys_option_value:
          {
            /* We are in trigger and assigning value to field of new row */
            Item *it;
            Item_trigger_field *trg_fld;
            sp_instr_set_trigger_field *i;
            if ($1)
            {
@@ -7585,17 +7586,19 @@ sys_option_value:
              it= new Item_null();
            }

            if (!(i= new sp_instr_set_trigger_field(
            if (!(trg_fld= new Item_trigger_field(Item_trigger_field::NEW_ROW,
                                                  $2.base_name.str)) ||
                !(i= new sp_instr_set_trigger_field(
                           lex->sphead->instructions(), lex->spcont,
                $2.base_name, it)))
                           trg_fld, it)))
              YYABORT;

            /*
              Let us add this item to list of all Item_trigger_field
              objects in trigger.
            */
            lex->trg_table_fields.link_in_list((byte *)&i->trigger_field,
            (byte **)&i->trigger_field.next_trg_field);
            lex->trg_table_fields.link_in_list((byte *)trg_fld,
                                    (byte **)&trg_fld->next_trg_field);

            lex->sphead->add_instr(i);
          }