diff options
author | unknown <kostja@bodhi.(none)> | 2007-07-16 23:31:36 +0400 |
---|---|---|
committer | unknown <kostja@bodhi.(none)> | 2007-07-16 23:31:36 +0400 |
commit | 9562c54a5c1172fa536d27bb67e86d7af93183d8 (patch) | |
tree | 53d9d30f94c45fc9b3f51662dd10574784b16e0a /sql/sql_trigger.cc | |
parent | b6c0fb605d613df14405e1d7c5621d22b35bc4fe (diff) | |
parent | 8023d91929247f1b2e2f81ca10daca4dde4ab2e2 (diff) | |
download | mariadb-git-9562c54a5c1172fa536d27bb67e86d7af93183d8.tar.gz |
Merge bodhi.(none):/opt/local/work/mysql-5.0-runtime
into bodhi.(none):/opt/local/work/mysql-5.1-runtime
mysql-test/r/trigger.result:
Auto merged
mysql-test/t/query_cache.test:
Auto merged
mysql-test/t/sp.test:
Auto merged
mysql-test/t/trigger.test:
Auto merged
sql/item.cc:
Auto merged
sql/item.h:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/sp_head.h:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_db.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/sql_select.cc:
Auto merged
sql/sql_show.cc:
Auto merged
sql/sql_trigger.h:
Auto merged
sql/sql_view.cc:
Auto merged
sql/table.cc:
Auto merged
storage/myisam/ha_myisam.h:
Auto merged
mysql-test/include/mix1.inc:
Manual merge.
mysql-test/r/information_schema.result:
Manual merge.
mysql-test/r/innodb_mysql.result:
Manual merge.
mysql-test/r/query_cache.result:
Manual merge.
mysql-test/r/sp.result:
Manual merge.
mysql-test/t/information_schema.test:
Manual merge.
sql/handler.h:
Manual merge.
sql/sp.cc:
Manual merge.
sql/sp_head.cc:
Manual merge.
sql/sql_prepare.cc:
Manual merge.
sql/sql_trigger.cc:
Manual merge.
sql/sql_yacc.yy:
Manual merge.
sql/table.h:
Manual merge.
storage/myisam/ha_myisam.cc:
Manual merge.
Diffstat (limited to 'sql/sql_trigger.cc')
-rw-r--r-- | sql/sql_trigger.cc | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 55eae2f5ea5..fa0154dc39e 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -1212,17 +1212,6 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, table->triggers= triggers; /* - Construct key that will represent triggers for this table in the set - of routines used by statement. - */ - triggers->sroutines_key.length= 1+strlen(db)+1+strlen(table_name)+1; - if (!(triggers->sroutines_key.str= (char*) - alloc_root(&table->mem_root, triggers->sroutines_key.length))) - DBUG_RETURN(1); - triggers->sroutines_key.str[0]= TYPE_ENUM_TRIGGER; - strxmov(triggers->sroutines_key.str+1, db, ".", table_name, NullS); - - /* TODO: This could be avoided if there is no triggers for UPDATE and DELETE. */ @@ -1270,6 +1259,15 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, DBUG_ASSERT(lex.sphead == 0); goto err_with_lex_cleanup; } + /* + Not strictly necessary to invoke this method here, since we know + that we've parsed CREATE TRIGGER and not an + UPDATE/DELETE/INSERT/REPLACE/LOAD/CREATE TABLE, but we try to + maintain the invariant that this method is called for each + distinct statement, in case its logic is extended with other + types of analyses in future. + */ + lex.set_trg_event_type_for_tables(); lex.sphead->set_info(0, 0, &lex.sp_chistics, (ulong) *trg_sql_mode); @@ -1899,8 +1897,9 @@ bool Table_triggers_list::process_triggers(THD *thd, { bool err_status; Sub_statement_state statement_state; + sp_head *sp_trigger= bodies[event][time_type]; - if (!bodies[event][time_type]) + if (sp_trigger == NULL) return FALSE; if (old_row_is_record1) @@ -1913,15 +1912,20 @@ bool Table_triggers_list::process_triggers(THD *thd, new_field= record1_field; old_field= trigger_table->field; } + /* + This trigger must have been processed by the pre-locking + algorithm. + */ + DBUG_ASSERT(trigger_table->pos_in_table_list->trg_event_map & + static_cast<uint>(1 << static_cast<int>(event))); thd->reset_sub_statement_state(&statement_state, SUB_STMT_TRIGGER); err_status= - bodies[event][time_type]->execute_trigger( - thd, - &trigger_table->s->db, - &trigger_table->s->table_name, - &subject_table_grants[event][time_type]); + sp_trigger->execute_trigger(thd, + &trigger_table->s->db, + &trigger_table->s->table_name, + &subject_table_grants[event][time_type]); thd->restore_sub_statement_state(&statement_state); @@ -1935,7 +1939,7 @@ bool Table_triggers_list::process_triggers(THD *thd, SYNOPSIS mark_fields_used() thd Current thread context - event Type of event triggers for which we are going to inspect + event Type of event triggers for which we are going to ins DESCRIPTION This method marks fields of subject table which are read/set in its |