diff options
author | unknown <dlenev@brandersnatch.localdomain> | 2004-09-09 00:46:01 +0400 |
---|---|---|
committer | unknown <dlenev@brandersnatch.localdomain> | 2004-09-09 00:46:01 +0400 |
commit | 12ce293a7fc18fdc2c6f8d7ec951d816d3661cf8 (patch) | |
tree | 585d1e39d3250f0afea1d761e09394b1142c917f /sql/sql_trigger.cc | |
parent | cab6f8df6ddb35fbdef771eb56217bb0920be25b (diff) | |
download | mariadb-git-12ce293a7fc18fdc2c6f8d7ec951d816d3661cf8.tar.gz |
WL#1218 "Triggers"
After review and after merge fixes.
mysql-test/t/trigger.test:
After merge fix. Updated error codes.
sql/sp_head.cc:
After merge fix.
To give some chances for functions/triggers we have to close tables during sp_instr_*
execution only if we have opened them before.
sql/sp_head.h:
After merge fix. sp_instr constructor now takes one more argument.
sql/sql_trigger.cc:
After merge and review fixes.
Some variable renaming and optimizations.
sql/sql_yacc.yy:
After merge fixes.
sp_instr_* classes now require sp context as constructor parameter.
Also we should be careful with adding table for which we are creating trigger to table
list. Some elements in trigger body can damage LEX::query_tables and so we should add this
table to list only after parsing trigger body.
Diffstat (limited to 'sql/sql_trigger.cc')
-rw-r--r-- | sql/sql_trigger.cc | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 5e08192d0c1..56294b9bc80 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -319,18 +319,18 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, if (!strncmp(triggers_file_type.str, parser->type()->str, parser->type()->length)) { - int i; - Table_triggers_list *triggers_info= + Field **fld, **old_fld; + Table_triggers_list *triggers= new (&table->mem_root) Table_triggers_list(); - if (!triggers_info) + if (!triggers) DBUG_RETURN(1); - if (parser->parse((gptr)triggers_info, &table->mem_root, + if (parser->parse((gptr)triggers, &table->mem_root, triggers_file_parameters, 1)) DBUG_RETURN(1); - table->triggers= triggers_info; + table->triggers= triggers; /* We have to prepare array of Field objects which will represent OLD.* @@ -338,27 +338,26 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, TODO: This could be avoided if there is no ON UPDATE trigger. */ - if (!(triggers_info->old_field= + if (!(triggers->old_field= (Field **)alloc_root(&table->mem_root, (table->fields + 1) * sizeof(Field*)))) DBUG_RETURN(1); - for (i= 0; i < table->fields; i++) + for (fld= table->field, old_fld= triggers->old_field; *fld; + fld++, old_fld++) { /* QQ: it is supposed that it is ok to use this function for field cloning... */ - if (!(triggers_info->old_field[i]= - table->field[i]->new_field(&table->mem_root, table))) + if (!(*old_fld= (*fld)->new_field(&table->mem_root, table))) DBUG_RETURN(1); - triggers_info->old_field[i]->move_field((my_ptrdiff_t) - (table->record[1] - - table->record[0])); + (*old_fld)->move_field((my_ptrdiff_t)(table->record[1] - + table->record[0])); } - triggers_info->old_field[i]= 0; + *old_fld= 0; - List_iterator_fast<LEX_STRING> it(triggers_info->definitions_list); + List_iterator_fast<LEX_STRING> it(triggers->definitions_list); LEX_STRING *trg_create_str, *trg_name_str; char *trg_name_buff; LEX *old_lex= thd->lex, lex; @@ -367,8 +366,8 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, while ((trg_create_str= it++)) { - lex_start(thd, (uchar*)trg_create_str->str, trg_create_str->length); - mysql_init_query(thd, true); + mysql_init_query(thd, (uchar*)trg_create_str->str, + trg_create_str->length, true); lex.trg_table= table; if (yyparse((void *)thd) || thd->is_fatal_error) { @@ -385,7 +384,7 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, goto err_with_lex_cleanup; } - triggers_info->bodies[lex.trg_chistics.event] + triggers->bodies[lex.trg_chistics.event] [lex.trg_chistics.action_time]= lex.sphead; lex.sphead= 0; @@ -404,7 +403,7 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, old_global_mem_root= my_pthread_getspecific_ptr(MEM_ROOT*, THR_MALLOC); my_pthread_setspecific_ptr(THR_MALLOC, &table->mem_root); - if (triggers_info->names_list.push_back(trg_name_str)) + if (triggers->names_list.push_back(trg_name_str)) goto err_with_lex_cleanup; my_pthread_setspecific_ptr(THR_MALLOC, old_global_mem_root); |