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