MySQL  8.0.26
Source Code Documentation
table_trigger_dispatcher.h
Go to the documentation of this file.
1 /*
2  Copyright (c) 2013, 2021, Oracle and/or its affiliates.
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License, version 2.0,
6  as published by the Free Software Foundation.
7 
8  This program is also distributed with certain software (including
9  but not limited to OpenSSL) that is licensed under separate terms,
10  as designated in a particular file or component or in included license
11  documentation. The authors of MySQL hereby grant you an additional
12  permission to link the program and your derivative works with the
13  separately licensed software that they have included with MySQL.
14 
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License, version 2.0, for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with this program; if not, write to the Free Software
22  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23 
24 #ifndef TABLE_TRIGGER_DISPATCHER_H_INCLUDED
25 #define TABLE_TRIGGER_DISPATCHER_H_INCLUDED
26 
27 ///////////////////////////////////////////////////////////////////////////
28 
29 #include <assert.h>
30 #include <string.h>
31 
32 #include "lex_string.h"
33 
34 #include "my_inttypes.h"
35 #include "my_sys.h"
36 #include "mysql_com.h" // MYSQL_ERRMSG_SIZE
37 #include "mysqld_error.h" // ER_PARSE_ERROR
38 #include "sql/table_trigger_field_support.h" // Table_trigger_field_support
39 #include "sql/trigger_def.h" // enum_trigger_action_time_type
40 
41 class Field;
42 class Query_tables_list;
43 class String;
44 class THD;
45 class Trigger;
46 class Trigger_chain;
47 struct MEM_ROOT;
48 
49 namespace dd {
50 class Table;
51 } // namespace dd
52 struct TABLE;
53 struct TABLE_LIST;
54 template <class T>
55 class List;
56 
57 ///////////////////////////////////////////////////////////////////////////
58 
59 /**
60  This class holds all information about triggers of a table.
61 */
62 
64  public:
65  static Table_trigger_dispatcher *create(TABLE *subject_table);
66 
67  bool check_n_load(THD *thd, const dd::Table &table);
68 
69  /*
70  During upgrade from 5.7, we need to use the trigger chains to fix
71  the trigger order.
72  */
74 
75  private:
76  Table_trigger_dispatcher(TABLE *subject_table);
77 
78  public:
79  ~Table_trigger_dispatcher() override;
80 
81  /**
82  Checks if there is a broken trigger for this table.
83 
84  @retval false if all triggers are Ok.
85  @retval true in case there is at least one broken trigger (a trigger which
86  SQL-definition can not be parsed) for this table.
87  */
90  my_message(ER_PARSE_ERROR, m_parse_error_message, MYF(0));
91  return true;
92  }
93  return false;
94  }
95 
96  bool create_trigger(THD *thd, String *binlog_create_trigger_stmt);
97 
100  bool old_row_is_record1);
101 
102  Trigger_chain *get_triggers(int event, int action_time) {
103  assert(0 <= event && event < TRG_EVENT_MAX);
104  assert(0 <= action_time && action_time < TRG_ACTION_MAX);
105  return m_trigger_map[event][action_time];
106  }
107 
108  const Trigger_chain *get_triggers(int event, int action_time) const {
109  assert(0 <= event && event < TRG_EVENT_MAX);
110  assert(0 <= action_time && action_time < TRG_ACTION_MAX);
111  return m_trigger_map[event][action_time];
112  }
113 
114  Trigger *find_trigger(const LEX_STRING &trigger_name);
115 
117  enum_trigger_action_time_type action_time) const {
118  return get_triggers(event, action_time) != nullptr;
119  }
120 
121  bool has_update_triggers() const {
124  }
125 
126  bool has_delete_triggers() const {
129  }
130 
132 
134  Query_tables_list *prelocking_ctx,
135  TABLE_LIST *table_list);
136 
139 
140  void print_upgrade_warnings(THD *thd);
141 
142  void parse_triggers(THD *thd, List<Trigger> *triggers, bool is_upgrade);
143 
144  private:
147  enum_trigger_action_time_type action_time);
148 
150 
151  /**
152  Remember a parse error that occurred while parsing trigger definitions
153  loaded from the Data Dictionary. This makes the Table_trigger_dispatcher
154  enter the error state flagged by m_has_unparseable_trigger == true. The
155  error message will be used whenever a statement invoking or manipulating
156  triggers is issued against the Table_trigger_dispatcher's table.
157 
158  @param error_message The error message thrown by the parser.
159  */
160  void set_parse_error_message(const char *error_message) {
163  strncpy(m_parse_error_message, error_message,
164  sizeof(m_parse_error_message) - 1);
165  m_parse_error_message[sizeof(m_parse_error_message) - 1] = '\n';
166  }
167  }
168 
169  private:
170  /************************************************************************
171  * Table_trigger_field_support interface implementation.
172  ***********************************************************************/
173 
174  TABLE *get_subject_table() override { return m_subject_table; }
175 
177  int field_index) override {
178  return (v == TRG_OLD_ROW) ? m_old_field[field_index]
179  : m_new_field[field_index];
180  }
181 
182  private:
183  /**
184  TABLE instance for which this triggers list object was created.
185  */
187 
188  /// Triggers grouped by event, action_time.
190 
191  /**
192  Copy of TABLE::Field array with field pointers set to TABLE::record[1]
193  buffer instead of TABLE::record[0] (used for OLD values in on UPDATE
194  trigger and DELETE trigger when it is called for REPLACE).
195  */
197 
198  /**
199  During execution of trigger m_new_field and m_old_field should point to the
200  array of fields representing new or old version of row correspondingly
201  (so it can point to TABLE::field or to
202  Table_trigger_dispatcher::m_record1_field).
203  */
206 
207  /**
208  This flag indicates that one of the triggers was not parsed successfully,
209  and as a precaution the object has entered the state where all trigger
210  operations result in errors until all the table triggers are dropped. It is
211  not safe to add triggers since it is unknown if the broken trigger has the
212  same name or event type. Nor is it safe to invoke any trigger. The only
213  safe operations are drop_trigger() and drop_all_triggers().
214 
215  We can't use the value of m_parse_error_message as a flag to inform that
216  a trigger has a parse error since for multi-byte locale the first byte of
217  message can be 0 but the message still be meaningful. It means that just a
218  comparison against m_parse_error_message[0] can not be done safely.
219 
220  @see Table_trigger_dispatcher::set_parse_error()
221  */
223 
224  /**
225  This error will be displayed when the user tries to manipulate or invoke
226  triggers on a table that has broken triggers. It is set once per statement
227  and thus will contain the first parse error encountered in the trigger file.
228  */
230 };
231 
232 ///////////////////////////////////////////////////////////////////////////
233 
234 #endif // TABLE_TRIGGER_DISPATCHER_H_INCLUDED
Definition: field.h:591
Definition: sql_list.h:431
Definition: sql_lex.h:2444
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:165
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_class.h:821
This class holds all information about triggers of a table.
Definition: table_trigger_dispatcher.h:63
Table_trigger_dispatcher(TABLE *subject_table)
Private form of Table_trigger_dispatcher constructor.
Definition: table_trigger_dispatcher.cc:86
bool reorder_57_list(MEM_ROOT *mem_root, List< Trigger > *triggers)
Definition: table.cc:106
Field * get_trigger_variable_field(enum_trigger_variable_type v, int field_index) override
Definition: table_trigger_dispatcher.h:176
Trigger_chain * create_trigger_chain(MEM_ROOT *mem_root, enum_trigger_event_type event, enum_trigger_action_time_type action_time)
Make sure there is a chain for the specified event and action time.
Definition: table_trigger_dispatcher.cc:385
bool has_update_triggers() const
Definition: table_trigger_dispatcher.h:121
void disable_fields_temporary_nullability()
Reset "temporary nullable" flag from trigger fields.
Definition: table_trigger_dispatcher.cc:629
bool m_has_unparseable_trigger
This flag indicates that one of the triggers was not parsed successfully, and as a precaution the obj...
Definition: table_trigger_dispatcher.h:222
bool has_triggers(enum_trigger_event_type event, enum_trigger_action_time_type action_time) const
Definition: table_trigger_dispatcher.h:116
bool process_triggers(THD *thd, enum_trigger_event_type event, enum_trigger_action_time_type action_time, bool old_row_is_record1)
Execute trigger for given (event, time) pair.
Definition: table_trigger_dispatcher.cc:530
void print_upgrade_warnings(THD *thd)
Iterate along triggers and print necessary upgrade warnings.
Definition: table_trigger_dispatcher.cc:644
Field ** m_new_field
During execution of trigger m_new_field and m_old_field should point to the array of fields represent...
Definition: table_trigger_dispatcher.h:204
void set_parse_error_message(const char *error_message)
Remember a parse error that occurred while parsing trigger definitions loaded from the Data Dictionar...
Definition: table_trigger_dispatcher.h:160
Field ** m_record1_field
Copy of TABLE::Field array with field pointers set to TABLE::record[1] buffer instead of TABLE::recor...
Definition: table_trigger_dispatcher.h:196
Trigger * find_trigger(const LEX_STRING &trigger_name)
Get trigger object by trigger name.
Definition: table_trigger_dispatcher.cc:410
bool check_for_broken_triggers()
Checks if there is a broken trigger for this table.
Definition: table_trigger_dispatcher.h:88
Field ** m_old_field
Definition: table_trigger_dispatcher.h:205
bool mark_fields(enum_trigger_event_type event)
Mark fields of subject table which we read/set in its triggers as such.
Definition: table_trigger_dispatcher.cc:675
void enable_fields_temporary_nullability(THD *thd)
Mark all trigger fields as "temporary nullable" and remember the current THD::check_for_truncated_fie...
Definition: table_trigger_dispatcher.cc:601
const Trigger_chain * get_triggers(int event, int action_time) const
Definition: table_trigger_dispatcher.h:108
bool has_delete_triggers() const
Definition: table_trigger_dispatcher.h:126
static Table_trigger_dispatcher * create(TABLE *subject_table)
Create an instance of Table_trigger_dispatcher for the given subject table.
Definition: table_trigger_dispatcher.cc:76
Trigger_chain * get_triggers(int event, int action_time)
Definition: table_trigger_dispatcher.h:102
TABLE * m_subject_table
TABLE instance for which this triggers list object was created.
Definition: table_trigger_dispatcher.h:186
bool prepare_record1_accessors()
Prepare array of Field objects referencing to TABLE::record[1] instead of record<a href="they will re...
Definition: table_trigger_dispatcher.cc:288
char m_parse_error_message[MYSQL_ERRMSG_SIZE]
This error will be displayed when the user tries to manipulate or invoke triggers on a table that has...
Definition: table_trigger_dispatcher.h:229
~Table_trigger_dispatcher() override
Definition: table_trigger_dispatcher.cc:96
TABLE * get_subject_table() override
Definition: table_trigger_dispatcher.h:174
bool add_tables_and_routines_for_triggers(THD *thd, Query_tables_list *prelocking_ctx, TABLE_LIST *table_list)
Add triggers for table to the set of routines used by statement.
Definition: table_trigger_dispatcher.cc:577
Trigger_chain * m_trigger_map[TRG_EVENT_MAX][TRG_ACTION_MAX]
Triggers grouped by event, action_time.
Definition: table_trigger_dispatcher.h:189
bool check_n_load(THD *thd, const dd::Table &table)
Load triggers for the table.
Definition: table_trigger_dispatcher.cc:324
bool create_trigger(THD *thd, String *binlog_create_trigger_stmt)
Create trigger for table.
Definition: table_trigger_dispatcher.cc:131
void parse_triggers(THD *thd, List< Trigger > *triggers, bool is_upgrade)
Parse trigger definition statements (CREATE TRIGGER).
Definition: table_trigger_dispatcher.cc:445
This is an interface to be used from Item_trigger_field to access information about table trigger fie...
Definition: table_trigger_field_support.h:43
Definition: trigger_chain.h:40
This class represents a trigger object.
Definition: trigger.h:73
Definition: table.h:46
static MEM_ROOT mem_root
Definition: client_plugin.cc:109
void my_message(uint my_err, const char *str, myf MyFlags)
Print an error message.
Definition: my_error.cc:310
Some integer typedefs for easier portability.
#define MYF(v)
Definition: my_inttypes.h:96
Common header for many mysys elements.
Common definition between mysql server & client.
#define MYSQL_ERRMSG_SIZE
Max length of a error message.
Definition: mysql_com.h:850
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:42
required string event
Definition: replication_group_member_actions.proto:31
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:78
Definition: mysql_lex_string.h:34
Definition: table.h:2612
Definition: table.h:1396
This file defines all base public constants related to triggers in MySQL.
enum_trigger_variable_type
Enum constants to designate NEW and OLD trigger pseudo-variables.
Definition: trigger_def.h:72
@ TRG_OLD_ROW
Definition: trigger_def.h:72
enum_trigger_event_type
Constants to enumerate possible event types on which triggers can be fired.
Definition: trigger_def.h:41
@ TRG_EVENT_UPDATE
Definition: trigger_def.h:43
@ TRG_EVENT_MAX
Definition: trigger_def.h:45
@ TRG_EVENT_DELETE
Definition: trigger_def.h:44
enum_trigger_action_time_type
Constants to enumerate possible timings when triggers can be fired.
Definition: trigger_def.h:51
@ TRG_ACTION_BEFORE
Definition: trigger_def.h:52
@ TRG_ACTION_MAX
Definition: trigger_def.h:54
@ TRG_ACTION_AFTER
Definition: trigger_def.h:53