mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-5816: Stored programs: validation of stored program statements
This is the prerequisite patch to move the data member LEX::trg_table_fields to the class sp_head and rename it as m_trg_table_fields. This data member is used for handling OLD/NEW pseudo-rows inside a trigger body and in order to be able to re-parse a trigger body the data member must be moved from the struct LEX to the class sp_head.
This commit is contained in:
@@ -801,12 +801,6 @@ sp_head::init(LEX *lex)
|
||||
if (!lex->spcont)
|
||||
DBUG_VOID_RETURN;
|
||||
|
||||
/*
|
||||
Altough trg_table_fields list is used only in triggers we init for all
|
||||
types of stored procedures to simplify reset_lex()/restore_lex() code.
|
||||
*/
|
||||
lex->trg_table_fields.empty();
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
@@ -2492,8 +2486,6 @@ sp_head::merge_lex(THD *thd, LEX *oldlex, LEX *sublex)
|
||||
|
||||
sublex->set_trg_event_type_for_tables();
|
||||
|
||||
oldlex->trg_table_fields.push_back(&sublex->trg_table_fields);
|
||||
|
||||
/* If this substatement is unsafe, the entire routine is too. */
|
||||
DBUG_PRINT("info", ("sublex->get_stmt_unsafe_flags: 0x%x",
|
||||
sublex->get_stmt_unsafe_flags()));
|
||||
|
@@ -952,6 +952,15 @@ protected:
|
||||
push_backpatch(THD *thd, sp_instr *, sp_label *, List<bp_t> *list,
|
||||
backpatch_instr_type itype);
|
||||
|
||||
public:
|
||||
/*
|
||||
List of all items (Item_trigger_field objects) representing fields in
|
||||
old/new version of row in trigger. We use this list for checking whenever
|
||||
all such fields are valid at trigger creation time and for binding these
|
||||
fields to TABLE object at table open (altough for latter pointer to table
|
||||
being opened is probably enough).
|
||||
*/
|
||||
SQL_I_List<Item_trigger_field> m_trg_table_fields;
|
||||
}; // class sp_head : public Sql_alloc
|
||||
|
||||
|
||||
|
@@ -239,7 +239,7 @@ bool LEX::set_trigger_new_row(const LEX_CSTRING *name, Item *val)
|
||||
Let us add this item to list of all Item_trigger_field
|
||||
objects in trigger.
|
||||
*/
|
||||
trg_table_fields.link_in_list(trg_fld, &trg_fld->next_trg_field);
|
||||
sphead->m_trg_table_fields.link_in_list(trg_fld, &trg_fld->next_trg_field);
|
||||
|
||||
return sphead->add_instr(sp_fld);
|
||||
}
|
||||
@@ -7883,7 +7883,7 @@ Item *LEX::create_and_link_Item_trigger_field(THD *thd,
|
||||
in trigger.
|
||||
*/
|
||||
if (likely(trg_fld))
|
||||
trg_table_fields.link_in_list(trg_fld, &trg_fld->next_trg_field);
|
||||
sphead->m_trg_table_fields.link_in_list(trg_fld, &trg_fld->next_trg_field);
|
||||
|
||||
return trg_fld;
|
||||
}
|
||||
|
@@ -3536,14 +3536,6 @@ public:
|
||||
|
||||
/* Characterstics of trigger being created */
|
||||
st_trg_chistics trg_chistics;
|
||||
/*
|
||||
List of all items (Item_trigger_field objects) representing fields in
|
||||
old/new version of row in trigger. We use this list for checking whenever
|
||||
all such fields are valid at trigger creation time and for binding these
|
||||
fields to TABLE object at table open (altough for latter pointer to table
|
||||
being opened is probably enough).
|
||||
*/
|
||||
SQL_I_List<Item_trigger_field> trg_table_fields;
|
||||
|
||||
/*
|
||||
stmt_definition_begin is intended to point to the next word after
|
||||
@@ -5102,7 +5094,6 @@ public:
|
||||
spcont= oldlex->spcont;
|
||||
/* Keep the parent trigger stuff too */
|
||||
trg_chistics= oldlex->trg_chistics;
|
||||
trg_table_fields.empty();
|
||||
sp_lex_in_use= false;
|
||||
}
|
||||
};
|
||||
|
@@ -939,7 +939,7 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables,
|
||||
*/
|
||||
old_field= new_field= table->field;
|
||||
|
||||
for (trg_field= lex->trg_table_fields.first;
|
||||
for (trg_field= lex->sphead->m_trg_table_fields.first;
|
||||
trg_field; trg_field= trg_field->next_trg_field)
|
||||
{
|
||||
/*
|
||||
@@ -1797,7 +1797,7 @@ bool Table_triggers_list::check_n_load(THD *thd, const LEX_CSTRING *db,
|
||||
in old/new versions of row in trigger into lists containing all such
|
||||
objects for the trigger_list with same action and timing.
|
||||
*/
|
||||
trigger->trigger_fields= lex.trg_table_fields.first;
|
||||
trigger->trigger_fields= sp->m_trg_table_fields.first;
|
||||
/*
|
||||
Also let us bind these objects to Field objects in table being
|
||||
opened.
|
||||
@@ -1807,7 +1807,7 @@ bool Table_triggers_list::check_n_load(THD *thd, const LEX_CSTRING *db,
|
||||
SELECT)...
|
||||
Anyway some things can be checked only during trigger execution.
|
||||
*/
|
||||
for (Item_trigger_field *trg_field= lex.trg_table_fields.first;
|
||||
for (Item_trigger_field *trg_field= sp->m_trg_table_fields.first;
|
||||
trg_field;
|
||||
trg_field= trg_field->next_trg_field)
|
||||
{
|
||||
|
Reference in New Issue
Block a user