279 lines
9.5 KiB
Plaintext
279 lines
9.5 KiB
Plaintext
################################################################################
|
|
# The intent of this test is to verify if the validations that were
|
|
# created within the Group Replication plugin in the runtime process
|
|
# are fully functional.
|
|
#
|
|
# It will test the invalid scenarios:
|
|
# - Table with no primary key
|
|
# - Table without InnoDB storage engine
|
|
# - Table without both
|
|
# - Table with 'CASCADE' referential key
|
|
# - Table with 'SET NULL' referential key
|
|
#
|
|
# It will cycle all cases in which the runtime validation is verified.
|
|
#
|
|
# Afterwards the plugin will be stopped and one of the cases will be tested in
|
|
# order to assess that the verification is no longer accomplished.
|
|
#
|
|
# One will test in a valid table that dynamic variables that can change in
|
|
# runtime will also cause a failure in validation if they have incorrect values.
|
|
#
|
|
# Table t4 in the test case was added because of BUG#21909427 DMLS ON
|
|
# BLACKHOLE TABLES ARE ALLOWED IN GR, as BLACKHOLE storage engine tables are
|
|
# considered to be transactional.
|
|
|
|
# Tables t5, t6, t7 and t8 in the test case were added because of
|
|
# BUG#21918361 GR CAN GENERATE INCONSISTENCIES IF THERE ARE MULTIPLE FK
|
|
# DEPENDENCIES. The decision is to block DML updates if the table contains
|
|
# foreign key with 'CASCADE' clause.
|
|
#
|
|
# Test:
|
|
# 0. The test requires one server.
|
|
#
|
|
# 1. With member being ONLINE.
|
|
# - Create table without primary key.
|
|
# - Create table with non-transactional(MyISAM) engine.
|
|
# - Create table without primary key and with non-transactional(MyISAM) engine.
|
|
# - Create table without InnoDB storage engine.
|
|
# - Create auxiliary table with primary key and with InnoDB engine.
|
|
# - Create table with 'ON UPDATE CASCADE' foreign key.
|
|
# - Create table with 'ON DELETE CASCADE' foreign key.
|
|
# - Create table with 'ON DELETE SET NULL' foreign key.
|
|
# - Create table with 'ON UPDATE SET NULL' foreign key.
|
|
#
|
|
# 2. Testing all tables that will fail with following DMLs:
|
|
# INSERT, UPDATE, INSERT...SELECT, DELETE, LOAD DATA, REPLACE,
|
|
# REPLACE...SELECT, DELETE_MULTI, UPDATE_MULTI
|
|
#
|
|
# 3. Test global variables that might change in runtime and which values are
|
|
# not allowed in GR. Following settings are tested with DML operation on
|
|
# auxiliary table:
|
|
# binlog_checksum=CRC32, binlog_format=STATEMENT,
|
|
# transaction_write_set_extraction=OFF
|
|
#
|
|
# 4. Stop GR on member. Now, check following must succeed or fail with other
|
|
# errors that not related to GR:
|
|
# INSERT, UPDATE, INSERT...SELECT, DELETE, LOAD DATA, REPLACE,
|
|
# REPLACE...SELECT, DELETE_MULTI, UPDATE_MULTI
|
|
#
|
|
# 5. Clean up.
|
|
################################################################################
|
|
|
|
--let $group_replication_group_name= 36236980-4307-11e4-916c-0800200c9a67
|
|
--source include/have_group_replication_plugin.inc
|
|
|
|
--source include/start_and_bootstrap_group_replication.inc
|
|
|
|
#Lets create several tables. They will all breach 1 or more rules
|
|
SET SESSION sql_log_bin= 0;
|
|
call mtr.add_suppression("Table .* does not use the InnoDB storage engine. This is not compatible with Group Replication.");
|
|
SET SESSION sql_log_bin= 1;
|
|
|
|
#Wrong table without Primary Key
|
|
CREATE TABLE t1 (c1 char(50)) ENGINE=InnoDB;
|
|
|
|
#Wrong table without Transactional engine
|
|
CREATE TABLE t2 (c1 char(50) NOT NULL PRIMARY KEY) ENGINE=MyISAM;
|
|
|
|
#Wrong table with both criteria
|
|
CREATE TABLE t3 (c1 char(50)) ENGINE=MyISAM;
|
|
|
|
#Wrong table without InnoDB storage engine
|
|
CREATE TABLE t4 (c1 char(50) NOT NULL PRIMARY KEY) ENGINE=Blackhole;
|
|
|
|
#Auxiliary test table
|
|
CREATE TABLE tn (cn char(50) NOT NULL PRIMARY KEY) ENGINE=InnoDB;
|
|
|
|
# Wrong table with 'ON UPDATE CASCADE' foreign key.
|
|
CREATE TABLE t5 (c1 char(50) NOT NULL PRIMARY KEY, FOREIGN KEY (c1) REFERENCES tn(cn) ON UPDATE CASCADE) ENGINE = InnoDB;
|
|
|
|
# Wrong table with 'ON UPDATE CASCADE' foreign key.
|
|
CREATE TABLE t6 (c1 char(50) NOT NULL PRIMARY KEY, FOREIGN KEY (c1) REFERENCES
|
|
tn(cn) ON UPDATE CASCADE ON DELETE RESTRICT) ENGINE = InnoDB;
|
|
|
|
# Wrong table with 'ON DELETE CASCADE' foreign key.
|
|
CREATE TABLE t7 (c1 char(50) NOT NULL PRIMARY KEY, FOREIGN KEY (c1) REFERENCES tn(cn) ON DELETE CASCADE) ENGINE = InnoDB;
|
|
|
|
# Wrong table with 'ON DELETE CASCADE' foreign key.
|
|
CREATE TABLE t8 (c1 char(50) NOT NULL PRIMARY KEY, FOREIGN KEY (c1) REFERENCES
|
|
tn(cn) ON DELETE CASCADE ON UPDATE RESTRICT) ENGINE = InnoDB;
|
|
|
|
# Wrong table with 'ON DELETE SET NULL' foreign key.
|
|
CREATE TABLE t9 (c1 char(50), c2 char(50) NOT NULL PRIMARY KEY, FOREIGN KEY (c1) REFERENCES
|
|
tn(cn) ON DELETE SET NULL) ENGINE = InnoDB;
|
|
|
|
# Wrong table with 'ON UPDATE SET NULL' foreign key.
|
|
CREATE TABLE t10 (c1 char(50), c2 char(50) NOT NULL PRIMARY KEY, FOREIGN KEY (c1) REFERENCES
|
|
tn(cn) ON UPDATE SET NULL) ENGINE = InnoDB;
|
|
|
|
#
|
|
# The tests begin here.
|
|
#
|
|
# The use cases to test are the following:
|
|
# - SQLCOM_UPDATE
|
|
# - SQLCOM_INSERT
|
|
# - SQLCOM_INSERT_SELECT
|
|
# - SQLCOM_DELETE
|
|
# - SQLCOM_LOAD
|
|
# - SQLCOM_REPLACE
|
|
# - SQLCOM_REPLACE_SELECT
|
|
# - SQLCOM_DELETE_MULTI
|
|
# - SQLCOM_UPDATE_MULTI
|
|
#
|
|
|
|
--echo #
|
|
--echo # Testing all tables that will fail.
|
|
--echo #
|
|
|
|
--let $wrong_tables_count=10
|
|
while ($wrong_tables_count)
|
|
{
|
|
#Test the INSERT instruction
|
|
if ($wrong_tables_count >= 9)
|
|
{
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval INSERT INTO t$wrong_tables_count VALUES('a','a')
|
|
}
|
|
if ($wrong_tables_count < 9)
|
|
{
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval INSERT INTO t$wrong_tables_count VALUES('a')
|
|
}
|
|
|
|
#Test the UPDATE instruction
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval UPDATE t$wrong_tables_count SET c1 = 'a'
|
|
|
|
#Test the INSERT...SELECT instruction
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval UPDATE t$wrong_tables_count SET c1 = 'a'
|
|
|
|
#Test the INSERT...SELECT instruction
|
|
if ($wrong_tables_count >= 9)
|
|
{
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval INSERT INTO t$wrong_tables_count (c1,c2) SELECT tn.cn,'a' FROM tn
|
|
}
|
|
if ($wrong_tables_count < 9)
|
|
{
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval INSERT INTO t$wrong_tables_count (c1) SELECT tn.cn FROM tn
|
|
}
|
|
|
|
#Test the DELETE instruction
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval DELETE FROM t$wrong_tables_count
|
|
|
|
#Test the load instruction
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE t$wrong_tables_count
|
|
|
|
#Test the REPLACE instruction
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval REPLACE INTO t$wrong_tables_count(c1) VALUES('a')
|
|
|
|
#Test the REPLACE...SELECT instruction
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval REPLACE INTO t$wrong_tables_count (c1) SELECT tn.cn FROM tn
|
|
|
|
#Test the DELETE_MULTI instruction
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval DELETE t$wrong_tables_count, tn FROM t$wrong_tables_count, tn
|
|
|
|
#Test the UPDATE_MULTI instruction
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
--eval UPDATE t$wrong_tables_count, tn SET c1 = 'a'
|
|
|
|
#clean up this table
|
|
--eval DROP TABLE t$wrong_tables_count
|
|
|
|
--dec $wrong_tables_count
|
|
}
|
|
|
|
--echo #
|
|
--echo # Lets test the global variables that might change in
|
|
--echo # runtime and which values are not allowed.
|
|
--echo #
|
|
|
|
#Test the value of binlog checksum.
|
|
|
|
--let $binlog_checksum_backup= `SELECT @@GLOBAL.binlog_checksum;`
|
|
SET GLOBAL binlog_checksum= CRC32;
|
|
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
INSERT INTO tn VALUES ('a');
|
|
|
|
--eval SET GLOBAL binlog_checksum= $binlog_checksum_backup
|
|
|
|
#Test the value of binlog format.
|
|
|
|
--let $binlog_format_backup= `SELECT @@GLOBAL.binlog_format`
|
|
|
|
SET SESSION binlog_format= STATEMENT;
|
|
|
|
--error ER_BEFORE_DML_VALIDATION_ERROR
|
|
INSERT INTO tn VALUES ('a');
|
|
|
|
--eval SET SESSION binlog_format= "$binlog_format_backup"
|
|
|
|
#Test the value of transaction_write_set_extraction cannot be changed
|
|
|
|
--let $transaction_write_set_extraction_backup= `SELECT @@GLOBAL.transaction_write_set_extraction`
|
|
|
|
--error ER_GROUP_REPLICATION_RUNNING
|
|
SET SESSION transaction_write_set_extraction=OFF;
|
|
|
|
INSERT INTO tn VALUES ('hash');
|
|
|
|
--echo #
|
|
--echo # Now, lets repeat all the tests with group replication stopped.
|
|
--echo # They all must succeed or fail with other errors that not the
|
|
--echo # ones from validation.
|
|
--echo #
|
|
--echo # It will be a single table simpler test just to assess that the
|
|
--echo # hook is not longer active.
|
|
--echo #
|
|
--source include/stop_group_replication.inc
|
|
|
|
#Wrong table without Primary Key
|
|
CREATE TABLE t1 (c1 char(50)) ENGINE=InnoDB;
|
|
|
|
#Test the UPDATE instruction
|
|
--eval UPDATE t1 SET c1 = 'a'
|
|
|
|
#Test the INSERT instruction
|
|
--eval INSERT INTO t1 VALUES('a')
|
|
|
|
#Test the INSERT...SELECT instruction
|
|
--eval INSERT INTO t1 (c1) SELECT tn.cn FROM tn
|
|
|
|
#Test the DELETE instruction
|
|
--eval DELETE FROM t1
|
|
|
|
#Test the load instruction
|
|
--eval LOAD DATA INFILE '../../std_data/words2.dat' INTO TABLE t1
|
|
|
|
#Test the REPLACE instruction
|
|
--eval REPLACE INTO t1(c1) VALUES('a')
|
|
|
|
#Test the REPLACE...SELECT instruction
|
|
--eval REPLACE INTO t1 (c1) SELECT tn.cn FROM tn
|
|
|
|
#Test the DELETE_MULTI instruction
|
|
--eval DELETE t1, tn FROM t1, tn
|
|
|
|
#Test the UPDATE_MULTI instruction
|
|
--eval UPDATE t1, tn SET c1 = 'a'
|
|
|
|
#clean up
|
|
DROP TABLE t1, tn;
|
|
|
|
call mtr.add_suppression("Table.*is not transactional. This is not compatible with Group Replication");
|
|
call mtr.add_suppression("Table.*does not have any PRIMARY KEY. This is not compatible with Group Replication.");
|
|
call mtr.add_suppression("Table.*has a foreign key with 'CASCADE' clause. This is not compatible with Group Replication.");
|
|
call mtr.add_suppression("binlog_checksum should be NONE for Group Replication");
|
|
call mtr.add_suppression("Binlog format should be ROW for Group Replication");
|
|
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
|
|
|
|
--source include/gr_clear_configuration.inc
|