Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
33a0e61
MDEV-30645: CREATE TRIGGER FOR { STARTUP | SHUTDOWN }
dmitryshulga Jun 8, 2026
e92f735
MDEV-30645: CREATE TRIGGER FOR { STARTUP | SHUTDOWN }
dmitryshulga Jun 8, 2026
6507eb9
MDEV-30645: CREATE TRIGGER FOR { STARTUP | SHUTDOWN }
dmitryshulga Jun 8, 2026
a51f816
MDEV-30645: CREATE TRIGGER FOR { STARTUP | SHUTDOWN }
dmitryshulga Jun 8, 2026
2a927ad
MDEV-40064: Memory leak with unparseble trigger for startup body
dmitryshulga Aug 5, 2026
c4a06e7
MDEV-40071: Assertion `ret == false' failed in mysql_drop_sys_or_ddl_…
dmitryshulga Aug 5, 2026
51408cf
MDEV-40074: Create or replace does not work for trigger for startup/s…
dmitryshulga Aug 6, 2026
aa48ed8
MDEV-40076: ASAN global-buffer-overflow in reconstruct_create_trigger…
dmitryshulga Aug 21, 2026
39aa4ad
MDEV-40083: Compound triggers for startup/shutdown are stored without…
dmitryshulga Aug 21, 2026
99cd491
MDEV-40091: ASAN: heap-use-after-free with concurrent create/drop sys…
dmitryshulga Aug 21, 2026
0fd1806
MDEV-40106: Sever crashes in store_trigger_metadata after 2nd executi…
dmitryshulga Aug 31, 2026
ee1f35f
MDEV-40076: ASAN global-buffer-overflow in reconstruct_create_trigger…
dmitryshulga Sep 6, 2026
6a07681
MDEV-40947: ASAN global-buffer-overflow in events_to_string/reconstru…
dmitryshulga Sep 6, 2026
7fb2a5f
MDEV-40952: CREATE TRIGGER fails with ER_EVENT_STORE_FAILED after unr…
dmitryshulga Sep 6, 2026
508318c
MDEV-40105: Information_schema.triggers doesn't show schema for syste…
dmitryshulga Sep 6, 2026
496a5ee
MDEV-40076: Follow-up commit to fix compiler error on Win64
dmitryshulga Sep 7, 2026
e8affe4
MDEV-40095:Server doesn't start if system triggers not loaded (if can…
dmitryshulga Sep 9, 2026
a9b879b
MDEV-40067: mysqldump --sys-triggers creates unloadable dump
dmitryshulga Sep 11, 2026
2aebf3a
MDEV-40072: Server crashes in my_hash_first/name_hash_search after lo…
dmitryshulga Sep 20, 2026
b69d95f
MDEV-30645: CREATE TRIGGER FOR { STARTUP | SHUTDOWN }
dmitryshulga Sep 22, 2026
81a54c9
MDEV-40951: System triggers give no visibility into slow/failed execu…
dmitryshulga Sep 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 108 additions & 2 deletions client/mysqldump.cc
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@
*/
#define FIRST_SEQUENCE_VERSION 100300

#define FIRST_SYS_TRIGGER_VERSION 130100

#include <my_global.h>
#include <my_sys.h>
#include <my_user.h>
Expand Down Expand Up @@ -133,7 +135,8 @@ static my_bool verbose= 0, opt_no_create_info= 0, opt_no_data= 0, opt_no_data_m
opt_events= 0, opt_comments_used= 0,
opt_alltspcs=0, opt_notspcs= 0, opt_logging,
opt_header=0, opt_update_history= 0,
opt_drop_trigger= 0, opt_dump_history= 0, opt_wildcards= 0;
opt_drop_trigger= 0, opt_dump_history= 0, opt_wildcards= 0,
opt_dump_sys_triggers= 0;
static my_bool opt_galera_info= 0;

#define OPT_SYSTEM_ALL 1
Expand Down Expand Up @@ -605,6 +608,9 @@ static struct my_option my_long_options[] =
{"triggers", 0, "Dump triggers for each dumped table.",
&opt_dump_triggers, &opt_dump_triggers, 0, GET_BOOL,
NO_ARG, 1, 0, 0, 0, 0, 0},
{"sys_triggers", 0, "Dump system triggers.",
&opt_dump_sys_triggers, &opt_dump_sys_triggers, 0, GET_BOOL,
NO_ARG, 0, 0, 0, 0, 0, 0},
{"tz-utc", 0,
"Set connection time zone to UTC before commencing the dump and add "
"SET TIME_ZONE=´+00:00´ to the top of the dump file.",
Expand Down Expand Up @@ -5601,12 +5607,26 @@ static int dump_all_databases()
MYSQL_ROW row;
MYSQL_RES *tableres;
int result=0;
char mysql_db[]= "mysql";

if (mysql_query_with_error_report(mysql, &tableres, "SHOW DATABASES"))
return 1;

/*
First dump mysql database since it contains the table mysql.event where
triggers' metadata stored
*/
if (dump_all_tables_in_db(mysql_db))
return 1;

while ((row= mysql_fetch_row(tableres)))
{
if (is_IS_or_PS(row[0]) || is_SyS(row[0]))
if (is_IS_or_PS(row[0]) || is_SyS(row[0]) ||
/*
Skip the `mysql` database since it is dumped before entering into
the while loop
*/
!cmp_database(row[0], mysql_db))
continue;

if (include_database(row[0]))
Expand Down Expand Up @@ -7594,6 +7614,85 @@ void dump_databases_wild(int n_patterns, char **db_patterns)
DBUG_VOID_RETURN;
}

static int init_dumping_sys_triggers(char *qdatabase __attribute__((unused)))
{
return 0;
}

static void dump_sys_triggers()
{
char query_buff[QUERY_LENGTH];
MYSQL_RES *triggers_list_rs= nullptr;

my_snprintf(query_buff, sizeof(query_buff),
"SELECT db, name FROM mysql.event WHERE kind IN "
"('STARTUP', 'SHUTDOWN')");
if (mysql_query_with_error_report(mysql, &triggers_list_rs, query_buff) ||
switch_character_set_results(mysql, "binary"))
{
mysql_free_result(triggers_list_rs);
return;
}

my_bool opt_databases_saved= opt_databases;
opt_databases= true;

if (mysql_num_rows(triggers_list_rs))
{
MYSQL_ROW row;
while ((row= mysql_fetch_row(triggers_list_rs)))
{
MYSQL_RES *show_create_trigger_rs;
char name_buff[NAME_LEN*4+3];
char db_cl_name[MY_CS_COLLATION_NAME_SIZE];
char *db_name;

my_snprintf(query_buff, sizeof (query_buff), "SHOW CREATE TRIGGER %s",
quote_name(row[1], name_buff, true));

db_name= row[0];

if (init_dumping(db_name, init_dumping_sys_triggers))
{
mysql_free_result(triggers_list_rs);
maybe_exit(EX_MYSQLERR);
return;
}

if (fetch_db_collation(db_name, db_cl_name, sizeof (db_cl_name)))
{
mysql_free_result(triggers_list_rs);
maybe_exit(EX_MYSQLERR);
return;
}

if (mysql_query_with_error_report(mysql, &show_create_trigger_rs,
query_buff))
{
mysql_free_result(triggers_list_rs);
maybe_exit(EX_MYSQLERR);
return;
}

if (dump_trigger(md_result_file, show_create_trigger_rs,
db_name, db_cl_name))
{
mysql_free_result(triggers_list_rs);
mysql_free_result(show_create_trigger_rs);
maybe_exit(EX_MYSQLERR);
return;
}

mysql_free_result(show_create_trigger_rs);
}
}

(void)switch_character_set_results(mysql, default_charset);
opt_databases= opt_databases_saved;

mysql_free_result(triggers_list_rs);
}


int main(int argc, char **argv)
{
Expand Down Expand Up @@ -7794,6 +7893,13 @@ int main(int argc, char **argv)
}
}

if (opt_dump_sys_triggers &&
mysql_get_server_version(mysql) >= FIRST_SYS_TRIGGER_VERSION)
{
DBUG_PRINT("info", ("Dumping system trigger"));
dump_sys_triggers();
}

if (opt_system & OPT_SYSTEM_PLUGINS)
dump_all_plugins();

Expand Down
2 changes: 2 additions & 0 deletions libmysqld/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,8 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
../sql/opt_hints.cc ../sql/opt_hints.h
../sql/opt_trace_ddl_info.cc ../sql/opt_trace_ddl_info.h
../sql/sql_path.cc
../sql/sql_sys_or_ddl_trigger.cc
../sql/event_common.cc
${GEN_SOURCES}
${MYSYS_LIBWRAP_SOURCE}
)
Expand Down
9 changes: 9 additions & 0 deletions mysql-test/main/mysql_upgrade-28915.result
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ event CREATE TABLE `event` (
`collation_connection` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`db_collation` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`body_utf8` longblob DEFAULT NULL,
`kind` set('SCHEDULE','STARTUP','SHUTDOWN','LOGON','LOGOFF','DDL') NOT NULL DEFAULT 'SCHEDULE',
`when` enum('BEFORE','AFTER') DEFAULT NULL,
`ddl_type` set('CREATE','ALTER','DROP','TRUNCATE','ANALYZE','RENAME','GRANT','REVOKE','COMMENT','ANY_DDL') DEFAULT NULL,
PRIMARY KEY (`db`,`name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Events'
Phase 1/8: Checking and upgrading mysql database
Expand Down Expand Up @@ -277,6 +280,9 @@ event CREATE TABLE `event` (
`collation_connection` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`db_collation` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`body_utf8` longblob DEFAULT NULL,
`kind` set('SCHEDULE','STARTUP','SHUTDOWN','LOGON','LOGOFF','DDL') NOT NULL DEFAULT 'SCHEDULE',
`when` enum('BEFORE','AFTER') DEFAULT NULL,
`ddl_type` set('CREATE','ALTER','DROP','TRUNCATE','ANALYZE','RENAME','GRANT','REVOKE','COMMENT','ANY_DDL') DEFAULT NULL,
PRIMARY KEY (`db`,`name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Events'
# Emulate that tables were created with utf8mb4 by an older version
Expand Down Expand Up @@ -544,6 +550,9 @@ Create Table CREATE TABLE `event` (
`collation_connection` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`db_collation` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`body_utf8` longblob DEFAULT NULL,
`kind` set('SCHEDULE','STARTUP','SHUTDOWN','LOGON','LOGOFF','DDL') NOT NULL DEFAULT 'SCHEDULE',
`when` enum('BEFORE','AFTER') DEFAULT NULL,
`ddl_type` set('CREATE','ALTER','DROP','TRUNCATE','ANALYZE','RENAME','GRANT','REVOKE','COMMENT','ANY_DDL') DEFAULT NULL,
PRIMARY KEY (`db`,`name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Events'
SET GLOBAL event_scheduler=OFF;
Expand Down
2 changes: 1 addition & 1 deletion mysql-test/main/sp2.test

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions mysql-test/main/system_mysql_db.result
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@ event CREATE TABLE `event` (
`collation_connection` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`db_collation` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`body_utf8` longblob DEFAULT NULL,
`kind` set('SCHEDULE','STARTUP','SHUTDOWN','LOGON','LOGOFF','DDL') NOT NULL DEFAULT 'SCHEDULE',
`when` enum('BEFORE','AFTER') DEFAULT NULL,
`ddl_type` set('CREATE','ALTER','DROP','TRUNCATE','ANALYZE','RENAME','GRANT','REVOKE','COMMENT','ANY_DDL') DEFAULT NULL,
PRIMARY KEY (`db`,`name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Events'
show create table general_log;
Expand Down
3 changes: 3 additions & 0 deletions mysql-test/main/system_mysql_db_fix40123.result
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,9 @@ event CREATE TABLE `event` (
`collation_connection` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`db_collation` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`body_utf8` longblob DEFAULT NULL,
`kind` set('SCHEDULE','STARTUP','SHUTDOWN','LOGON','LOGOFF','DDL') NOT NULL DEFAULT 'SCHEDULE',
`when` enum('BEFORE','AFTER') DEFAULT NULL,
`ddl_type` set('CREATE','ALTER','DROP','TRUNCATE','ANALYZE','RENAME','GRANT','REVOKE','COMMENT','ANY_DDL') DEFAULT NULL,
PRIMARY KEY (`db`,`name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Events'
show create table general_log;
Expand Down
3 changes: 3 additions & 0 deletions mysql-test/main/system_mysql_db_fix50030.result
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,9 @@ event CREATE TABLE `event` (
`collation_connection` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`db_collation` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`body_utf8` longblob DEFAULT NULL,
`kind` set('SCHEDULE','STARTUP','SHUTDOWN','LOGON','LOGOFF','DDL') NOT NULL DEFAULT 'SCHEDULE',
`when` enum('BEFORE','AFTER') DEFAULT NULL,
`ddl_type` set('CREATE','ALTER','DROP','TRUNCATE','ANALYZE','RENAME','GRANT','REVOKE','COMMENT','ANY_DDL') DEFAULT NULL,
PRIMARY KEY (`db`,`name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Events'
show create table general_log;
Expand Down
3 changes: 3 additions & 0 deletions mysql-test/main/system_mysql_db_fix50117.result
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,9 @@ event CREATE TABLE `event` (
`collation_connection` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`db_collation` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`body_utf8` longblob DEFAULT NULL,
`kind` set('SCHEDULE','STARTUP','SHUTDOWN','LOGON','LOGOFF','DDL') NOT NULL DEFAULT 'SCHEDULE',
`when` enum('BEFORE','AFTER') DEFAULT NULL,
`ddl_type` set('CREATE','ALTER','DROP','TRUNCATE','ANALYZE','RENAME','GRANT','REVOKE','COMMENT','ANY_DDL') DEFAULT NULL,
PRIMARY KEY (`db`,`name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Events'
show create table general_log;
Expand Down
3 changes: 3 additions & 0 deletions mysql-test/main/system_mysql_db_fix50568.result
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,9 @@ event CREATE TABLE `event` (
`collation_connection` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`db_collation` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`body_utf8` longblob DEFAULT NULL,
`kind` set('SCHEDULE','STARTUP','SHUTDOWN','LOGON','LOGOFF','DDL') NOT NULL DEFAULT 'SCHEDULE',
`when` enum('BEFORE','AFTER') DEFAULT NULL,
`ddl_type` set('CREATE','ALTER','DROP','TRUNCATE','ANALYZE','RENAME','GRANT','REVOKE','COMMENT','ANY_DDL') DEFAULT NULL,
PRIMARY KEY (`db`,`name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Events'
show create table general_log;
Expand Down
2 changes: 1 addition & 1 deletion mysql-test/main/trigger.result
Original file line number Diff line number Diff line change
Expand Up @@ -2131,7 +2131,7 @@ insert into t2 values (1),(2);
delete from t1 where i=1;
show status like 'Opened_tables';
Variable_name Value
Opened_tables 6
Opened_tables 7
select * from t1;
i
2
Expand Down
Loading
Loading