diff options
author | Jan Lindström <jan.lindstrom@mariadb.com> | 2019-10-02 13:24:34 +0300 |
---|---|---|
committer | Jan Lindström <jan.lindstrom@mariadb.com> | 2020-02-11 15:17:50 +0200 |
commit | e6a50e41da5e9e55031b978fba19a2b3ec4928b8 (patch) | |
tree | 1a0c544ca982ce3059d0f8107735051d311371a4 /sql/sql_trigger.cc | |
parent | 41541a7c48697cf139cee309211226dce1f21d72 (diff) | |
download | mariadb-git-e6a50e41da5e9e55031b978fba19a2b3ec4928b8.tar.gz |
MDEV-20051: Add new mode to wsrep_OSU_method in which Galera checks storage engine of the effected table
Introduced a new wsrep_strict_ddl configuration variable in which
Galera checks storage engine of the effected table. If table is not
InnoDB (only storage engine currently fully supporting Galera
replication) DDL-statement will return error code:
ER_GALERA_REPLICATION_NOT_SUPPORTED
eng "DDL-statement is forbidden as table storage engine does not support Galera replication"
However, when wsrep_replicate_myisam=ON we allow DDL-statements to
MyISAM tables. If effected table is allowed storage engine Galera
will run normal TOI.
This new setting should be for now set globally on all
nodes in a cluster. When this setting is set following DDL-clauses
accessing tables not supporting Galera replication are refused:
* CREATE TABLE (e.g. CREATE TABLE t1(a int) engine=Aria
* ALTER TABLE
* TRUNCATE TABLE
* CREATE VIEW
* CREATE TRIGGER
* CREATE INDEX
* DROP INDEX
* RENAME TABLE
* DROP TABLE
Statements on PROCEDURE, EVENT, FUNCTION are allowed as effected
tables are known only at execution. Furthermore, USER, ROLE, SERVER,
DATABASE statements are also allowed as they do not really have
effected table.
Diffstat (limited to 'sql/sql_trigger.cc')
-rw-r--r-- | sql/sql_trigger.cc | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 5802d2c811e..0ae3d58b11f 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -507,9 +507,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) goto end; } -#ifdef WITH_WSREP WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, tables); -#endif /* We should have only one table in table list. */ DBUG_ASSERT(tables->next_global == 0); @@ -550,6 +548,12 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) } table= tables->table; +#ifdef WITH_WSREP + if (WSREP(thd) && + !wsrep_should_replicate_ddl(thd, table->s->db_type()->db_type)) + goto wsrep_error_label; +#endif + /* Later on we will need it to downgrade the lock */ mdl_ticket= table->mdl_ticket; |