MySQL 8.0.39
Source Code Documentation
table_trigger_dispatcher.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2013, 2024, 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 designed to work 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 either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License, version 2.0, for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
24
25#ifndef TABLE_TRIGGER_DISPATCHER_H_INCLUDED
26#define TABLE_TRIGGER_DISPATCHER_H_INCLUDED
27
28///////////////////////////////////////////////////////////////////////////
29
30#include <assert.h>
31#include <string.h>
32
33#include "lex_string.h"
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
41class Field;
43class String;
44class THD;
45class Trigger;
46class Trigger_chain;
47struct MEM_ROOT;
48
49namespace dd {
50class Table;
51} // namespace dd
52struct TABLE;
53class Table_ref;
54template <class T>
55class 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:
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 /**
97 Create trigger for table.
98
99 @param thd Thread context
100 @param[out] binlog_create_trigger_stmt
101 Well-formed CREATE TRIGGER statement for putting into
102 binlog (after successful execution)
103 @param if_not_exists
104 True if 'IF NOT EXISTS' clause was specified
105 @param[out] already_exists
106 Set to true if trigger already exists on the same table
107
108 @note
109 - Assumes that trigger name is fully qualified.
110 - NULL-string means the following LEX_STRING instance:
111 { str = 0; length = 0 }.
112 - In other words, definer_user and definer_host should contain
113 simultaneously NULL-strings (non-SUID/old trigger) or valid strings
114 (SUID/new trigger).
115
116 @return Operation status.
117 @retval false Success
118 @retval true Failure
119 */
120 bool create_trigger(THD *thd, String *binlog_create_trigger_stmt,
121 bool if_not_exists, bool &already_exists);
122
125 bool old_row_is_record1);
126
127 Trigger_chain *get_triggers(int event, int action_time) {
128 assert(0 <= event && event < TRG_EVENT_MAX);
129 assert(0 <= action_time && action_time < TRG_ACTION_MAX);
130 return m_trigger_map[event][action_time];
131 }
132
133 const Trigger_chain *get_triggers(int event, int action_time) const {
134 assert(0 <= event && event < TRG_EVENT_MAX);
135 assert(0 <= action_time && action_time < TRG_ACTION_MAX);
136 return m_trigger_map[event][action_time];
137 }
138
139 Trigger *find_trigger(const LEX_STRING &trigger_name);
140
142 enum_trigger_action_time_type action_time) const {
143 return get_triggers(event, action_time) != nullptr;
144 }
145
146 bool has_update_triggers() const {
149 }
150
151 bool has_delete_triggers() const {
154 }
155
157
159 Query_tables_list *prelocking_ctx,
160 Table_ref *table_list);
161
164
165 void print_upgrade_warnings(THD *thd);
166
167 void parse_triggers(THD *thd, List<Trigger> *triggers, bool is_upgrade);
168
169 private:
173
175
176 /**
177 Remember a parse error that occurred while parsing trigger definitions
178 loaded from the Data Dictionary. This makes the Table_trigger_dispatcher
179 enter the error state flagged by m_has_unparseable_trigger == true. The
180 error message will be used whenever a statement invoking or manipulating
181 triggers is issued against the Table_trigger_dispatcher's table.
182
183 @param error_message The error message thrown by the parser.
184 */
185 void set_parse_error_message(const char *error_message) {
188 snprintf(m_parse_error_message, sizeof(m_parse_error_message), "%s",
189 error_message);
190 }
191 }
192
193 private:
194 /************************************************************************
195 * Table_trigger_field_support interface implementation.
196 ***********************************************************************/
197
199
201 int field_index) override {
202 return (v == TRG_OLD_ROW) ? m_old_field[field_index]
203 : m_new_field[field_index];
204 }
205
206 private:
207 /**
208 TABLE instance for which this triggers list object was created.
209 */
211
212 /// Triggers grouped by event, action_time.
214
215 /**
216 Copy of TABLE::Field array with field pointers set to TABLE::record[1]
217 buffer instead of TABLE::record[0] (used for OLD values in on UPDATE
218 trigger and DELETE trigger when it is called for REPLACE).
219 */
221
222 /**
223 During execution of trigger m_new_field and m_old_field should point to the
224 array of fields representing new or old version of row correspondingly
225 (so it can point to TABLE::field or to
226 Table_trigger_dispatcher::m_record1_field).
227 */
230
231 /**
232 This flag indicates that one of the triggers was not parsed successfully,
233 and as a precaution the object has entered the state where all trigger
234 operations result in errors until all the table triggers are dropped. It is
235 not safe to add triggers since it is unknown if the broken trigger has the
236 same name or event type. Nor is it safe to invoke any trigger. The only
237 safe operations are drop_trigger() and drop_all_triggers().
238
239 We can't use the value of m_parse_error_message as a flag to inform that
240 a trigger has a parse error since for multi-byte locale the first byte of
241 message can be 0 but the message still be meaningful. It means that just a
242 comparison against m_parse_error_message[0] can not be done safely.
243
244 @see Table_trigger_dispatcher::set_parse_error()
245 */
247
248 /**
249 This error will be displayed when the user tries to manipulate or invoke
250 triggers on a table that has broken triggers. It is set once per statement
251 and thus will contain the first parse error encountered in the trigger file.
252 */
254};
255
256///////////////////////////////////////////////////////////////////////////
257
258#endif // TABLE_TRIGGER_DISPATCHER_H_INCLUDED
Definition: field.h:575
Definition: sql_list.h:434
Definition: sql_lex.h:2507
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:168
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:34
Definition: table.h:2791
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:87
bool reorder_57_list(MEM_ROOT *mem_root, List< Trigger > *triggers)
Definition: table.cc:107
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:391
bool has_update_triggers() const
Definition: table_trigger_dispatcher.h:146
void disable_fields_temporary_nullability()
Reset "temporary nullable" flag from trigger fields.
Definition: table_trigger_dispatcher.cc:635
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:246
bool has_triggers(enum_trigger_event_type event, enum_trigger_action_time_type action_time) const
Definition: table_trigger_dispatcher.h:141
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:536
void print_upgrade_warnings(THD *thd)
Iterate along triggers and print necessary upgrade warnings.
Definition: table_trigger_dispatcher.cc:650
const Trigger_chain * get_triggers(int event, int action_time) const
Definition: table_trigger_dispatcher.h:133
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:228
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:185
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:220
Trigger * find_trigger(const LEX_STRING &trigger_name)
Get trigger object by trigger name.
Definition: table_trigger_dispatcher.cc:416
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:229
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:681
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:607
bool has_delete_triggers() const
Definition: table_trigger_dispatcher.h:151
bool create_trigger(THD *thd, String *binlog_create_trigger_stmt, bool if_not_exists, bool &already_exists)
Create trigger for table.
Definition: table_trigger_dispatcher.cc:110
Field * get_trigger_variable_field(enum_trigger_variable_type v, int field_index) override
Definition: table_trigger_dispatcher.h:200
Trigger_chain * get_triggers(int event, int action_time)
Definition: table_trigger_dispatcher.h:127
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:77
bool add_tables_and_routines_for_triggers(THD *thd, Query_tables_list *prelocking_ctx, Table_ref *table_list)
Add triggers for table to the set of routines used by statement.
Definition: table_trigger_dispatcher.cc:583
TABLE * get_subject_table() override
Definition: table_trigger_dispatcher.h:198
TABLE * m_subject_table
TABLE instance for which this triggers list object was created.
Definition: table_trigger_dispatcher.h:210
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:294
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:253
~Table_trigger_dispatcher() override
Definition: table_trigger_dispatcher.cc:97
Trigger_chain * m_trigger_map[TRG_EVENT_MAX][TRG_ACTION_MAX]
Triggers grouped by event, action_time.
Definition: table_trigger_dispatcher.h:213
bool check_n_load(THD *thd, const dd::Table &table)
Load triggers for the table.
Definition: table_trigger_dispatcher.cc:330
void parse_triggers(THD *thd, List< Trigger > *triggers, bool is_upgrade)
Parse trigger definition statements (CREATE TRIGGER).
Definition: table_trigger_dispatcher.cc:451
This is an interface to be used from Item_trigger_field to access information about table trigger fie...
Definition: table_trigger_field_support.h:44
Definition: trigger_chain.h:41
This class represents a trigger object.
Definition: trigger.h:74
Definition: table.h:47
static MEM_ROOT mem_root
Definition: client_plugin.cc:110
void my_message(uint my_err, const char *str, myf MyFlags)
Print an error message.
Definition: my_error.cc:311
Some integer typedefs for easier portability.
#define MYF(v)
Definition: my_inttypes.h:97
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:880
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:43
required string event
Definition: replication_group_member_actions.proto:32
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: mysql_lex_string.h:35
Definition: table.h:1399
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:73
@ TRG_OLD_ROW
Definition: trigger_def.h:73
enum_trigger_event_type
Constants to enumerate possible event types on which triggers can be fired.
Definition: trigger_def.h:42
@ TRG_EVENT_UPDATE
Definition: trigger_def.h:44
@ TRG_EVENT_MAX
Definition: trigger_def.h:46
@ TRG_EVENT_DELETE
Definition: trigger_def.h:45
enum_trigger_action_time_type
Constants to enumerate possible timings when triggers can be fired.
Definition: trigger_def.h:52
@ TRG_ACTION_BEFORE
Definition: trigger_def.h:53
@ TRG_ACTION_MAX
Definition: trigger_def.h:55
@ TRG_ACTION_AFTER
Definition: trigger_def.h:54