MDEV-8831 : enforce_storage_engine doesn't block table creation on other nodes
Check if the engine is supported/allowed before replicating the statement.
This commit is contained in:
parent
accf9b5675
commit
38f3b99d46
22
mysql-test/suite/galera/r/enforce_storage_engine.result
Normal file
22
mysql-test/suite/galera/r/enforce_storage_engine.result
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#
|
||||||
|
# MDEV-8831 : enforce_storage_engine doesn't block table creation on
|
||||||
|
# other nodes (galera cluster)
|
||||||
|
#
|
||||||
|
SET @@enforce_storage_engine=INNODB;
|
||||||
|
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||||
|
CREATE TABLE t2(i INT) ENGINE=MYISAM;
|
||||||
|
ERROR 42000: Unknown storage engine 'MyISAM'
|
||||||
|
INSERT INTO t1 VALUES(1);
|
||||||
|
SHOW TABLES;
|
||||||
|
Tables_in_test
|
||||||
|
t1
|
||||||
|
SELECT COUNT(*)=1 FROM t1;
|
||||||
|
COUNT(*)=1
|
||||||
|
1
|
||||||
|
CREATE TABLE t2(i INT) ENGINE=MYISAM;
|
||||||
|
SHOW TABLES;
|
||||||
|
Tables_in_test
|
||||||
|
t1
|
||||||
|
t2
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
# End of tests
|
33
mysql-test/suite/galera/t/enforce_storage_engine.test
Normal file
33
mysql-test/suite/galera/t/enforce_storage_engine.test
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
--source include/galera_cluster.inc
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
# enforce_storage_engine should prevent the creation of tables with
|
||||||
|
# non-enforced storage engines on the master node and the command
|
||||||
|
# should also not replicate to other nodes.
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-8831 : enforce_storage_engine doesn't block table creation on
|
||||||
|
--echo # other nodes (galera cluster)
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
SET @@enforce_storage_engine=INNODB;
|
||||||
|
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||||
|
--error ER_UNKNOWN_STORAGE_ENGINE
|
||||||
|
CREATE TABLE t2(i INT) ENGINE=MYISAM;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES(1);
|
||||||
|
|
||||||
|
--connection node_2
|
||||||
|
SHOW TABLES;
|
||||||
|
SELECT COUNT(*)=1 FROM t1;
|
||||||
|
|
||||||
|
CREATE TABLE t2(i INT) ENGINE=MYISAM;
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
SHOW TABLES;
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
--echo # End of tests
|
@ -3440,11 +3440,16 @@ mysql_execute_command(THD *thd)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* in STATEMENT format, we probably have to replicate also temporary
|
/*
|
||||||
tables, like mysql replication does
|
In STATEMENT format, we probably have to replicate also temporary
|
||||||
|
tables, like mysql replication does. Also check if the requested
|
||||||
|
engine is allowed/supported.
|
||||||
*/
|
*/
|
||||||
if (WSREP(thd) && (!thd->is_current_stmt_binlog_format_row() ||
|
if (WSREP(thd) &&
|
||||||
!create_info.tmp_table()))
|
!check_engine(thd, create_table->db, create_table->table_name,
|
||||||
|
&create_info) &&
|
||||||
|
(!thd->is_current_stmt_binlog_format_row() ||
|
||||||
|
!create_info.tmp_table()))
|
||||||
{
|
{
|
||||||
WSREP_TO_ISOLATION_BEGIN(create_table->db, create_table->table_name, NULL)
|
WSREP_TO_ISOLATION_BEGIN(create_table->db, create_table->table_name, NULL)
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,6 @@ static int copy_data_between_tables(THD *thd, TABLE *from,TABLE *to,
|
|||||||
Alter_table_ctx *alter_ctx);
|
Alter_table_ctx *alter_ctx);
|
||||||
|
|
||||||
static bool prepare_blob_field(THD *thd, Create_field *sql_field);
|
static bool prepare_blob_field(THD *thd, Create_field *sql_field);
|
||||||
static bool check_engine(THD *, const char *, const char *, HA_CREATE_INFO *);
|
|
||||||
static int mysql_prepare_create_table(THD *, HA_CREATE_INFO *, Alter_info *,
|
static int mysql_prepare_create_table(THD *, HA_CREATE_INFO *, Alter_info *,
|
||||||
uint *, handler *, KEY **, uint *, int);
|
uint *, handler *, KEY **, uint *, int);
|
||||||
static uint blob_length_by_type(enum_field_types type);
|
static uint blob_length_by_type(enum_field_types type);
|
||||||
@ -9816,8 +9815,8 @@ err:
|
|||||||
@retval true Engine not available/supported, error has been reported.
|
@retval true Engine not available/supported, error has been reported.
|
||||||
@retval false Engine available/supported.
|
@retval false Engine available/supported.
|
||||||
*/
|
*/
|
||||||
static bool check_engine(THD *thd, const char *db_name,
|
bool check_engine(THD *thd, const char *db_name,
|
||||||
const char *table_name, HA_CREATE_INFO *create_info)
|
const char *table_name, HA_CREATE_INFO *create_info)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("check_engine");
|
DBUG_ENTER("check_engine");
|
||||||
handlerton **new_engine= &create_info->db_type;
|
handlerton **new_engine= &create_info->db_type;
|
||||||
|
@ -284,4 +284,6 @@ uint explain_filename(THD* thd, const char *from, char *to, uint to_length,
|
|||||||
extern MYSQL_PLUGIN_IMPORT const char *primary_key_name;
|
extern MYSQL_PLUGIN_IMPORT const char *primary_key_name;
|
||||||
extern mysql_mutex_t LOCK_gdl;
|
extern mysql_mutex_t LOCK_gdl;
|
||||||
|
|
||||||
|
bool check_engine(THD *, const char *, const char *, HA_CREATE_INFO *);
|
||||||
|
|
||||||
#endif /* SQL_TABLE_INCLUDED */
|
#endif /* SQL_TABLE_INCLUDED */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user