MySQL 8.4.0
Source Code Documentation
trigger.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 TRIGGER_H_INCLUDED
26#define TRIGGER_H_INCLUDED
27
28#include <stdint.h>
29#include <string.h>
30
31#include "my_config.h"
32#ifdef HAVE_SYS_TIME_H
33#include <sys/time.h>
34#endif
35#include <sys/types.h>
36
37#include "lex_string.h"
38#include "my_inttypes.h"
39#include "mysql_com.h"
40#include "sql/table.h" // GRANT_INFO
41#include "sql/trigger_def.h" // enum_trigger_event_type
42
44class String;
45class THD;
46class sp_head;
47struct MEM_ROOT;
48
49using sql_mode_t = uint64_t;
50
51/**
52 This class represents a trigger object.
53 Trigger can be created, initialized, parsed and executed.
54
55 Trigger attributes are usually stored on the memory root of the subject table.
56 Trigger object however can exist when the subject table does not. In this
57 case, trigger attributes are stored on a separate memory root.
58
59 Trigger objects are created in two ways:
60
61 1. loading from Data Dictionary (by Trigger_loader)
62
63 In this case Trigger object is initialized from the data
64 which is directly available in data dictionary;
65
66 @see Trigger::create_from_dd().
67
68 2. creating a new Trigger object that represents the trigger object being
69 created by CREATE TRIGGER statement (by Table_trigger_dispatcher).
70
71 In this case Trigger object is created temporarily.
72
73 @see Trigger::create_from_parser().
74*/
75class Trigger {
76 public:
77 static Trigger *create_from_parser(THD *thd, TABLE *subject_table,
78 String *binlog_create_trigger_stmt);
79
80 static Trigger *create_from_dd(
81 MEM_ROOT *mem_root, const LEX_CSTRING &trigger_name,
82 const LEX_CSTRING &db_name, const LEX_CSTRING &subject_table_name,
83 const LEX_CSTRING &definition, const LEX_CSTRING &definition_utf8,
84 sql_mode_t sql_mode, const LEX_CSTRING &definer_user,
85 const LEX_CSTRING &definer_host, const LEX_CSTRING &client_cs_name,
86 const LEX_CSTRING &connection_cl_name, const LEX_CSTRING &db_cl_name,
87 enum_trigger_event_type trg_event_type,
88 enum_trigger_action_time_type trg_time_type, uint action_order,
89 my_timeval created_timestamp);
90
91 /**
92 Constructs CREATE TRIGGER statement taking into account a value of
93 the DEFINER clause.
94
95 The point of this method is to create canonical forms of CREATE TRIGGER
96 statement for writing into the binlog.
97
98 @note
99 A statement for the binlog form must preserve FOLLOWS/PRECEDES clause
100 if it was in the original statement. The reason for that difference is this:
101
102 - the Data Dictionary preserves the trigger execution order
103 (action_order), thus FOLLOWS/PRECEDES clause is not needed.
104
105 - moreover, FOLLOWS/PRECEDES clause usually makes problem in mysqldump,
106 because CREATE TRIGGER statement will have a reference to
107 not-yet-existing trigger (which is about to be created right after this
108 one).
109
110 - thus, FOLLOWS/PRECEDES must not be stored in the Data Dictionary.
111
112 - on the other hand, the binlog contains statements in the user order (as
113 the user executes them). Thus, it is important to preserve
114 FOLLOWS/PRECEDES clause if the user has specified it so that the trigger
115 execution order on master and slave will be the same.
116
117 @param thd thread context
118 @param[out] binlog_query well-formed CREATE TRIGGER statement for putting
119 into binlog (after successful execution)
120 @param def_user user part of a definer value
121 @param def_host host part of a definer value
122
123 @return Operation status.
124 @retval false Success
125 @retval true Failure
126 */
128 THD *thd, String *binlog_query, const LEX_CSTRING &def_user,
129 const LEX_CSTRING &def_host);
130
131 public:
132 bool execute(THD *thd);
133
134 bool parse(THD *thd, bool is_upgrade);
135
136 void add_tables_and_routines(THD *thd, Query_tables_list *prelocking_ctx,
137 Table_ref *table_list);
138
139 void print_upgrade_warning(THD *thd);
140
141 public:
142 /************************************************************************
143 * Attribute accessors.
144 ***********************************************************************/
145
146 const LEX_CSTRING &get_db_name() const { return m_db_name; }
147
150 }
151
152 const LEX_CSTRING &get_trigger_name() const { return m_trigger_name; }
153
154 const LEX_CSTRING &get_definition() const { return m_definition; }
155
157
159
160 const LEX_CSTRING &get_definer() const { return m_definer; }
161
162 const LEX_CSTRING &get_definer_user() const { return m_definer_user; }
163
164 const LEX_CSTRING &get_definer_host() const { return m_definer_host; }
165
167
170 }
171
172 const LEX_CSTRING &get_db_cl_name() const { return m_db_cl_name; }
173
175
176 const LEX_CSTRING &get_event_as_string() const;
177
179 return m_action_time;
180 }
181
183
185 return m_created_timestamp.m_tv_sec == 0 &&
187 }
188
190
192
193 void set_action_order(ulonglong action_order) {
194 m_action_order = action_order;
195 }
196
197 sp_head *get_sp() { return m_sp; }
198
200
201 bool has_parse_error() const { return m_has_parse_error; }
202
203 const char *get_parse_error_message() const { return m_parse_error_message; }
204
205 /**
206 Construct a full CREATE TRIGGER statement from Trigger's data members.
207
208 @param [in] thd Thread context
209 @param [out] full_trigger_definition Place where a CREATE TRIGGER
210 statement be stored.
211
212 @return Operation status
213 @retval true Failure
214 @retval false Success
215 */
216
217 bool create_full_trigger_definition(const THD *thd,
218 String *full_trigger_definition) const;
219
220 private:
221 Trigger(const LEX_CSTRING &trigger_name, MEM_ROOT *mem_root,
223 const LEX_CSTRING &definition, const LEX_CSTRING &definition_utf8,
224 sql_mode_t sql_mode, const LEX_CSTRING &definer_user,
225 const LEX_CSTRING &definer_host, const LEX_CSTRING &client_cs_name,
226 const LEX_CSTRING &connection_cl_name, const LEX_CSTRING &db_cl_name,
227 enum_trigger_event_type event_type,
228 enum_trigger_action_time_type action_time, uint action_order,
229 my_timeval created_timestamp);
230
231 public:
232 ~Trigger();
233
234 private:
235 void set_trigger_name(const LEX_CSTRING &trigger_name) {
236 m_trigger_name = trigger_name;
237 }
238
239 void set_trigger_def(const LEX_CSTRING &trigger_def) {
240 m_definition = trigger_def;
241 }
242
243 void set_trigger_def_utf8(const LEX_CSTRING &trigger_def_utf8) {
244 m_definition_utf8 = trigger_def_utf8;
245 }
246
247 void set_parse_error_message(const char *error_message) {
248 m_has_parse_error = true;
249 snprintf(m_parse_error_message, sizeof(m_parse_error_message), "%s",
250 error_message);
251 }
252
253 /**
254 Memory root to store all data of this Trigger object.
255
256 This can be a pointer to the subject table memory root, or it can be a
257 pointer to a dedicated memory root if subject table does not exist.
258 */
260
261 /**
262 Full trigger definition reconstructed from a data loaded from the table
263 mysql.trigger.
264 */
266
267 private:
268 /************************************************************************
269 * Mandatory trigger attributes loaded from data dictionary.
270 * All these strings are allocated on m_mem_root.
271 ***********************************************************************/
272
273 /// Database name.
275
276 /// Table name.
278
279 /// Trigger definition to save in DD.
281
282 /// Trigger definition in UTF8 to save in DD.
284
285 /// Trigger sql-mode.
287
288 /// Trigger definer.
290
291 /// Trigger definer (user part).
293
294 /// Trigger definer (host part).
296
297 /// Character set context, used for parsing and executing trigger.
299
300 /// Collation name of the connection within one a trigger are created.
302
303 /// Default database collation.
305
306 /// Trigger event.
308
309 /// Trigger action time.
311
312 /**
313 Current time when the trigger was created (measured in milliseconds since
314 since 0 hours, 0 minutes, 0 seconds, January 1, 1970, UTC). This is the
315 value of CREATED attribute.
316
317 There is special value -- zero means CREATED is not set (NULL).
318 */
320
321 /**
322 Action_order value for the trigger. Action_order is the ordinal position
323 of the trigger in the list of triggers with the same EVENT_MANIPULATION,
324 CONDITION_TIMING, and ACTION_ORIENTATION.
325 */
327
328 private:
329 /************************************************************************
330 * All these strings are allocated on the trigger table's mem-root.
331 ***********************************************************************/
332
333 /// Trigger name.
335
336 private:
337 /************************************************************************
338 * Other attributes.
339 ***********************************************************************/
340
341 /// Grant information for the trigger.
343
344 /// Pointer to the sp_head corresponding to the trigger.
346
347 /// This flags specifies whether the trigger has parse error or not.
349
350 /**
351 This error will be displayed when the user tries to manipulate or invoke
352 triggers on a table that has broken triggers. It will get set only once
353 per statement and thus will contain the first parse error encountered in
354 the trigger file.
355 */
357};
358
359///////////////////////////////////////////////////////////////////////////
360
361#endif // TRIGGER_H_INCLUDED
Definition: sql_lex.h:2596
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:167
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Definition: table.h:2863
This class represents a trigger object.
Definition: trigger.h:75
sp_head * m_sp
Pointer to the sp_head corresponding to the trigger.
Definition: trigger.h:345
GRANT_INFO * get_subject_table_grant()
Definition: trigger.h:199
bool has_parse_error() const
Definition: trigger.h:201
enum_trigger_event_type m_event
Trigger event.
Definition: trigger.h:307
LEX_CSTRING m_client_cs_name
Character set context, used for parsing and executing trigger.
Definition: trigger.h:298
ulonglong get_action_order() const
Definition: trigger.h:191
LEX_CSTRING m_db_name
Database name.
Definition: trigger.h:274
LEX_CSTRING m_connection_cl_name
Collation name of the connection within one a trigger are created.
Definition: trigger.h:301
enum_trigger_action_time_type get_action_time() const
Definition: trigger.h:178
const LEX_CSTRING & get_definer_user() const
Definition: trigger.h:162
~Trigger()
Destroy associated SP (if any).
Definition: trigger.cc:362
LEX_CSTRING m_definition_utf8
Trigger definition in UTF8 to save in DD.
Definition: trigger.h:283
my_timeval m_created_timestamp
Current time when the trigger was created (measured in milliseconds since since 0 hours,...
Definition: trigger.h:319
static Trigger * create_from_dd(MEM_ROOT *mem_root, const LEX_CSTRING &trigger_name, const LEX_CSTRING &db_name, const LEX_CSTRING &subject_table_name, const LEX_CSTRING &definition, const LEX_CSTRING &definition_utf8, sql_mode_t sql_mode, const LEX_CSTRING &definer_user, const LEX_CSTRING &definer_host, const LEX_CSTRING &client_cs_name, const LEX_CSTRING &connection_cl_name, const LEX_CSTRING &db_cl_name, enum_trigger_event_type trg_event_type, enum_trigger_action_time_type trg_time_type, uint action_order, my_timeval created_timestamp)
Creates a new Trigger-instance with the state loaded from the Data Dictionary.
Definition: trigger.cc:306
const LEX_CSTRING & get_action_time_as_string() const
Definition: trigger.cc:154
void set_action_order(ulonglong action_order)
Definition: trigger.h:193
bool m_has_parse_error
This flags specifies whether the trigger has parse error or not.
Definition: trigger.h:348
bool parse(THD *thd, bool is_upgrade)
Parse CREATE TRIGGER statement.
Definition: trigger.cc:434
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: trigger.h:356
bool create_full_trigger_definition(const THD *thd, String *full_trigger_definition) const
Construct a full CREATE TRIGGER statement from Trigger's data members.
Definition: trigger.cc:399
ulonglong m_action_order
Action_order value for the trigger.
Definition: trigger.h:326
my_timeval get_created_timestamp() const
Definition: trigger.h:189
const LEX_CSTRING & get_trigger_name() const
Definition: trigger.h:152
const char * get_parse_error_message() const
Definition: trigger.h:203
const LEX_CSTRING & get_definition_utf8() const
Definition: trigger.h:156
LEX_CSTRING m_trigger_name
Trigger name.
Definition: trigger.h:334
LEX_CSTRING m_db_cl_name
Default database collation.
Definition: trigger.h:304
const LEX_CSTRING & get_definer() const
Definition: trigger.h:160
sql_mode_t m_sql_mode
Trigger sql-mode.
Definition: trigger.h:286
LEX_CSTRING m_definition
Trigger definition to save in DD.
Definition: trigger.h:280
bool execute(THD *thd)
Execute trigger's body.
Definition: trigger.cc:374
MEM_ROOT * m_mem_root
Memory root to store all data of this Trigger object.
Definition: trigger.h:259
const LEX_CSTRING & get_db_cl_name() const
Definition: trigger.h:172
enum_trigger_event_type get_event() const
Definition: trigger.h:174
void set_trigger_def_utf8(const LEX_CSTRING &trigger_def_utf8)
Definition: trigger.h:243
void add_tables_and_routines(THD *thd, Query_tables_list *prelocking_ctx, Table_ref *table_list)
Add tables and routines used by trigger to the set of elements used by statement.
Definition: trigger.cc:625
LEX_CSTRING m_definer
Trigger definer.
Definition: trigger.h:289
const LEX_CSTRING & get_definition() const
Definition: trigger.h:154
bool is_created_timestamp_null() const
Definition: trigger.h:184
LEX_CSTRING m_subject_table_name
Table name.
Definition: trigger.h:277
void set_parse_error_message(const char *error_message)
Definition: trigger.h:247
sql_mode_t get_sql_mode() const
Definition: trigger.h:158
LEX_CSTRING m_definer_user
Trigger definer (user part).
Definition: trigger.h:292
const LEX_CSTRING & get_connection_cl_name() const
Definition: trigger.h:168
Trigger(const LEX_CSTRING &trigger_name, MEM_ROOT *mem_root, const LEX_CSTRING &db_name, const LEX_CSTRING &table_name, const LEX_CSTRING &definition, const LEX_CSTRING &definition_utf8, sql_mode_t sql_mode, const LEX_CSTRING &definer_user, const LEX_CSTRING &definer_host, const LEX_CSTRING &client_cs_name, const LEX_CSTRING &connection_cl_name, const LEX_CSTRING &db_cl_name, enum_trigger_event_type event_type, enum_trigger_action_time_type action_time, uint action_order, my_timeval created_timestamp)
Trigger constructor.
Definition: trigger.cc:326
LEX_CSTRING m_definer_host
Trigger definer (host part).
Definition: trigger.h:295
void set_trigger_def(const LEX_CSTRING &trigger_def)
Definition: trigger.h:239
GRANT_INFO m_subject_table_grant
Grant information for the trigger.
Definition: trigger.h:342
const LEX_CSTRING & get_subject_table_name() const
Definition: trigger.h:148
const LEX_CSTRING & get_event_as_string() const
Definition: trigger.cc:158
const LEX_CSTRING & get_db_name() const
Definition: trigger.h:146
static bool construct_create_trigger_stmt_with_definer(THD *thd, String *binlog_query, const LEX_CSTRING &def_user, const LEX_CSTRING &def_host)
Constructs CREATE TRIGGER statement taking into account a value of the DEFINER clause.
Definition: trigger.cc:128
const LEX_CSTRING & get_definer_host() const
Definition: trigger.h:164
const LEX_CSTRING & get_client_cs_name() const
Definition: trigger.h:166
void print_upgrade_warning(THD *thd)
Print upgrade warnings (if any).
Definition: trigger.cc:668
LEX_CSTRING m_full_trigger_definition
Full trigger definition reconstructed from a data loaded from the table mysql.trigger.
Definition: trigger.h:265
enum_trigger_action_time_type m_action_time
Trigger action time.
Definition: trigger.h:310
sp_head * get_sp()
Definition: trigger.h:197
void set_trigger_name(const LEX_CSTRING &trigger_name)
Definition: trigger.h:235
static Trigger * create_from_parser(THD *thd, TABLE *subject_table, String *binlog_create_trigger_stmt)
Creates a new Trigger-instance with the state from the parser.
Definition: trigger.cc:182
sp_head represents one instance of a stored program.
Definition: sp_head.h:383
static MEM_ROOT mem_root
Definition: client_plugin.cc:114
uint64_t sql_mode_t
Definition: dd_event.h:39
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
Common definition between mysql server & client.
#define MYSQL_ERRMSG_SIZE
Max length of a error message.
Definition: mysql_com.h:881
static const char * sql_mode
Definition: mysqlslap.cc:199
const char * table_name
Definition: rules_table_service.cc:56
const char * db_name
Definition: rules_table_service.cc:55
The current state of the privilege checking process for the current user, SQL statement and SQL objec...
Definition: table.h:368
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:40
Definition: table.h:1405
Replacement of system's struct timeval to ensure we can carry 64 bit values even on a platform which ...
Definition: my_time_t.h:45
int64_t m_tv_sec
Definition: my_time_t.h:46
int64_t m_tv_usec
Definition: my_time_t.h:47
Include file for Sun RPC to compile out of the box.
This file defines all base public constants related to triggers in MySQL.
enum_trigger_event_type
Constants to enumerate possible event types on which triggers can be fired.
Definition: trigger_def.h:42
enum_trigger_action_time_type
Constants to enumerate possible timings when triggers can be fired.
Definition: trigger_def.h:52