From d51a5baecb83341e65931b2430f86d9982367a04 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 27 May 2005 14:15:17 +0400 Subject: [PATCH] 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. --- sql/sp_head.cc | 6 +++--- sql/sp_head.h | 7 +++---- sql/sql_yacc.yy | 13 ++++++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 988345694b2..f680fc17d9a 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -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); } diff --git a/sql/sp_head.h b/sql/sp_head.h index ee41b1efc83..4e940c427bb 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -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 @@ public: 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 diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 99b0f43db2d..88109e61e5d 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -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( - lex->sphead->instructions(), lex->spcont, - $2.base_name, it))) + 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, + 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); }