sql_trigger.h 5.23 KB
Newer Older
1 2 3 4
/* Copyright (C) 2004-2005 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6 7 8 9 10 11 12 13 14 15 16

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA */


17 18 19 20 21
/*
  This class holds all information about triggers of table.

  QQ: Will it be merged into TABLE in future ?
*/
22

23 24 25
class Table_triggers_list: public Sql_alloc
{
  /* Triggers as SPs grouped by event, action_time */
26
  sp_head           *bodies[TRG_EVENT_MAX][TRG_ACTION_MAX];
27 28 29 30 31
  /*
    Heads of the lists linking items for all fields used in triggers
    grouped by event and action_time.
  */
  Item_trigger_field *trigger_fields[TRG_EVENT_MAX][TRG_ACTION_MAX];
32
  /*
33 34 35
    Copy of TABLE::Field array with field pointers set to TABLE::record[1]
    buffer instead of TABLE::record[0] (used for OLD values in on UPDATE
    trigger and DELETE trigger when it is called for REPLACE).
36
  */
37 38 39 40 41 42 43
  Field             **record1_field;
  /*
    During execution of trigger new_field and old_field should point to the
    array of fields representing new or old version of row correspondingly
    (so it can point to TABLE::field or to Tale_triggers_list::record1_field)
  */
  Field             **new_field;
44
  Field             **old_field;
45

46
  /* TABLE instance for which this triggers list object was created */
47
  TABLE *trigger_table;
48 49 50 51 52 53
  /*
    Names of triggers.
    Should correspond to order of triggers on definitions_list,
    used in CREATE/DROP TRIGGER for looking up trigger by name.
  */
  List<LEX_STRING>  names_list;
54 55 56 57 58
  /*
    List of "ON table_name" parts in trigger definitions, used for
    updating trigger definitions during RENAME TABLE.
  */
  List<LEX_STRING>  on_table_names_list;
59

60
  /*
61
    Grant information for each trigger (pair: subject table, trigger definer).
62
  */
63
  GRANT_INFO        subject_table_grants[TRG_EVENT_MAX][TRG_ACTION_MAX];
64

65 66 67 68 69 70
public:
  /*
    Field responsible for storing triggers definitions in file.
    It have to be public because we are using it directly from parser.
  */
  List<LEX_STRING>  definitions_list;
71 72 73 74
  /*
    List of sql modes for triggers
  */
  List<ulonglong> definition_modes_list;
75

76 77
  List<LEX_STRING>  definers_list;

78
  Table_triggers_list(TABLE *table_arg):
79
    record1_field(0), trigger_table(table_arg)
80 81
  {
    bzero((char *)bodies, sizeof(bodies));
82
    bzero((char *)trigger_fields, sizeof(trigger_fields));
83
    bzero((char *)&subject_table_grants, sizeof(subject_table_grants));
84 85 86
  }
  ~Table_triggers_list();

87 88
  bool create_trigger(THD *thd, TABLE_LIST *table, String *stmt_query);
  bool drop_trigger(THD *thd, TABLE_LIST *table, String *stmt_query);
89
  bool process_triggers(THD *thd, trg_event_type event,
90
                        trg_action_time_type time_type,
91
                        bool old_row_is_record1);
92 93
  bool get_trigger_info(THD *thd, trg_event_type event,
                        trg_action_time_type time_type,
94
                        LEX_STRING *trigger_name, LEX_STRING *trigger_stmt,
95 96
                        ulong *sql_mode,
                        LEX_STRING *definer);
97 98

  static bool check_n_load(THD *thd, const char *db, const char *table_name,
99 100
                           TABLE *table, bool names_only);
  static bool drop_all_triggers(THD *thd, char *db, char *table_name);
101 102 103 104
  static bool change_table_name(THD *thd, const char *db,
                                const char *old_table,
                                const char *new_db,
                                const char *new_table);
105 106 107
  bool has_triggers(trg_event_type event_type, 
                    trg_action_time_type action_time)
  {
108
    return (bodies[event_type][action_time] != NULL);
109
  }
110 111 112 113 114 115
  bool has_delete_triggers()
  {
    return (bodies[TRG_EVENT_DELETE][TRG_ACTION_BEFORE] ||
            bodies[TRG_EVENT_DELETE][TRG_ACTION_AFTER]);
  }

116 117
  void set_table(TABLE *new_table);

118 119
  void mark_fields_used(THD *thd, trg_event_type event);

120 121
  bool is_updated_in_before_update_triggers(Field *fld);

122
  friend class Item_trigger_field;
123
  friend int sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
124
                                                            TABLE_LIST *table);
125 126

private:
127
  bool prepare_record1_accessors(TABLE *table);
128 129 130 131 132 133 134
  LEX_STRING* change_table_name_in_trignames(const char *db_name,
                                             LEX_STRING *new_table_name,
                                             LEX_STRING *stopper);
  bool change_table_name_in_triggers(THD *thd,
                                     const char *db_name,
                                     LEX_STRING *old_table_name,
                                     LEX_STRING *new_table_name);
135
};
136 137 138

extern const LEX_STRING trg_action_time_type_names[];
extern const LEX_STRING trg_event_type_names[];
139 140 141 142

int
add_table_for_trigger(THD *thd, sp_name *trig, bool if_exists,
                      TABLE_LIST **table);