polardbxengine/mysql-test/suite/xengine/t/feature_recycle_bin.test

555 lines
14 KiB
Plaintext

--source include/have_debug.inc
--source include/have_binlog_format_row.inc
--source include/master-slave.inc
--source ../include/have_xengine.inc
--disable_ps_protocol
CALL mtr.add_suppression("Fail TO recycle table");
CALL mtr.add_suppression("Incorrect key file");
connection master;
CREATE DATABASE db_recycle;
CREATE DATABASE db_recycle_dummy;
CREATE USER super_1@'%' IDENTIFIED BY 'pass';
CREATE USER super_2@'%' IDENTIFIED BY 'pass';
CREATE USER normal_1@'%' IDENTIFIED BY 'pass';
CREATE USER normal_2@'%' IDENTIFIED BY 'pass';
CREATE USER normal_3@'%' IDENTIFIED BY 'pass';
CREATE USER normal_4@'%' IDENTIFIED BY 'pass';
CREATE USER normal_5@'%' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO super_1@'%';
GRANT ALL ON *.* TO super_2@'%';
GRANT ALL ON db_recycle.* TO normal_1@'%' ;
GRANT ALL ON __recycle_bin__.* TO normal_1@'%' ;
GRANT CREATE TABLESPACE ON *.* TO normal_1@'%' ;
GRANT SYSTEM_VARIABLES_ADMIN on *.* TO normal_1@'%';
GRANT ALL ON db_recycle_dummy.* TO normal_2@'%' ;
GRANT ALL ON db_recycle.* TO normal_3@'%' ;
GRANT ALL ON __recycle_bin__.* TO normal_3@'%' ;
GRANT ALL ON db_recycle_dummy.* TO normal_4@'%' ;
GRANT ALL ON __recycle_bin__.* TO normal_5@'%' ;
--sync_slave_with_master
connect(m_super_1, 127.0.0.1, super_1, pass, db_recycle, $MASTER_MYPORT);
connect(s_super_2, 127.0.0.1, super_1, pass, db_recycle, $SLAVE_MYPORT);
connect(m_normal_1, 127.0.0.1, normal_1, pass, db_recycle, $MASTER_MYPORT);
connect(m_normal_2, 127.0.0.1, normal_2, pass, test, $MASTER_MYPORT);
connect(m_normal_5, 127.0.0.1, normal_5, pass, , $MASTER_MYPORT);
connect(s_normal_3, 127.0.0.1, normal_3, pass, db_recycle, $SLAVE_MYPORT);
connect(s_normal_4, 127.0.0.1, normal_4, pass, test, $SLAVE_MYPORT);
connection slave;
SET @start_read_only = @@global.read_only;
SET GLOBAL read_only = true;
--echo ------------------------------------------------------
--echo 1. Privileges
--echo -- Still require related privileges if want to
--echo show recycle bin db;
--echo -- No one can alter db except super_acl user;
--echo ------------------------------------------------------
connection m_normal_1;
SHOW DATABASES;
connection s_normal_3;
SHOW DATABASES;
connection m_normal_2;
SHOW DATABASES;
connection s_normal_4;
SHOW DATABASES;
connection m_normal_1;
USE __recycle_bin__;
--error ER_DBACCESS_DENIED_ERROR
CREATE TABLE t1 (id int);
SHOW TABLES;
--echo ------------------------------------------------------
--echo 1.1 dbms_recycle.purge_table still require db.table privileges;
--echo ------------------------------------------------------
connection m_super_1;
SET GLOBAL recycle_scheduler=off;
connection m_normal_1;
USE db_recycle;
CREATE TABLE t1(id INT);
DROP TABLE t1;
--replace_column 5 # 6 #
CALL dbms_recycle.show_tables();
connection m_normal_2;
let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
--error ER_TABLEACCESS_DENIED_ERROR
eval CALL dbms_recycle.purge_table("$table_name");
connection m_normal_5;
let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
--error ER_TABLEACCESS_DENIED_ERROR
eval CALL dbms_recycle.purge_table("$table_name");
connection m_super_1;
--let $pos_before= query_get_value(show master status,Position,1)
connection m_normal_1;
show grants;
let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
eval CALL dbms_recycle.purge_table("$table_name");
connection m_super_1;
--let $assert_text= assert that the purge has not been added TO binlog
--let $assert_cond= [SHOW MASTER STATUS, Position,1] = $pos_before
--source include/assert.inc
connection m_super_1;
SET GLOBAL recycle_scheduler=on;
--echo ------------------------------------------------------
--echo 2. Drop table
--echo -- Related object:
--echo Foreign key(XEngine doesn't support):
--echo Trigger:
--echo View:
--echo Constraint:
--echo ------------------------------------------------------
connection m_super_1;
SET GLOBAL recycle_scheduler=off;
connection m_normal_1;
use db_recycle;
CREATE TABLE p1 (
id INT NOT NULL,
PRIMARY KEY (id)
);
# XEngine doesn't support foreign key
#CREATE TABLE c1 (
# id INT,
# parent_id INT,
# INDEX par_ind (parent_id),
# FOREIGN KEY (parent_id)
# REFERENCES p1(id)
# ON DELETE CASCADE
#);
CREATE TABLE l1(id INT);
delimiter //;
CREATE TRIGGER tri_1
BEFORE INSERT ON p1 FOR EACH ROW
BEGIN
INSERT INTO l1 value(1);
END//
delimiter ;//
CREATE VIEW v1 AS SELECT * FROM p1;
--echo 1.1 confirm the trigger, view
DROP TABLE p1;
let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
eval SHOW CREATE TABLE __recycle_bin__.$table_name;
--error ER_TRG_DOES_NOT_EXIST
SHOW CREATE TRIGGER tri_1;
SHOW CREATE VIEW v1;
--error ER_VIEW_INVALID
SELECT * FROM v1;
DROP TABLE l1;
DROP VIEW v1;
connection m_super_1;
SET GLOBAL recycle_scheduler=on;
--sleep 3
--echo ------------------------------------------------------
--echo 3. Drop parent table(XEngine doesn't support foreign key)
--echo ------------------------------------------------------
#connection m_super_1;
#SET GLOBAL recycle_scheduler=off;
#
#connection m_normal_1;
#use db_recycle;
#
# XEngine doesn't support foreign key
#CREATE TABLE p1 (
# id INT NOT NULL,
# PRIMARY KEY (id)
#);
#
#CREATE TABLE c1 (
# id INT,
# parent_id INT,
# INDEX par_ind (parent_id),
# FOREIGN KEY (parent_id)
# REFERENCES p1(id)
# ON DELETE CASCADE
#);
#
#--echo 1.1 foreign key.
#--error ER_FK_CANNOT_DROP_PARENT
#DROP TABLE p1;
#
#SET foreign_key_checks=off;
#DROP TABLE p1;
#INSERT INTO c1 VALUES(1, 2);
#COMMIT;
#SHOW CREATE TABLE c1;
#SET foreign_key_checks=on;
#
#--replace_column 5 # 6 #
#CALL dbms_recycle.show_tables();
#let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
#
#eval SHOW CREATE TABLE __recycle_bin__.$table_name;
#
#DROP TABLE c1;
#connection m_super_1;
#SET GLOBAL recycle_scheduler=on;
#
#--sleep 3
--echo ------------------------------------------------------
--echo 4. Drop in procedure
--echo ------------------------------------------------------
connection m_super_1;
SET GLOBAL recycle_scheduler=off;
connection m_normal_1;
USE db_recycle;
CREATE TABLE p1 (
id INT NOT NULL,
PRIMARY KEY (id)
);
delimiter //;
CREATE PROCEDURE proc_1()
BEGIN
DROP TABLE p1;
END//
delimiter ;//
CALL proc_1();
--replace_column 5 # 6 #
CALL dbms_recycle.show_tables();
let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
eval SHOW CREATE TABLE __recycle_bin__.$table_name;
DROP procedure proc_1;
connection m_super_1;
SET GLOBAL recycle_scheduler=on;
--sleep 3
--echo ------------------------------------------------------
--echo 5. Drop database
--echo ------------------------------------------------------
connection m_super_1;
SET GLOBAL recycle_scheduler=off;
connection m_normal_1;
USE db_recycle;
CREATE TABLE p2 (
id INT NOT NULL,
PRIMARY KEY (id)
);
# XEngine doesn't support foreign key
#CREATE TABLE c2 (
# id INT,
# parent_id INT,
# self_id INT,
# INDEX id_ind (id),
# INDEX par_ind (parent_id),
# INDEX sel_ind (self_id),
# FOREIGN KEY (self_id)
# REFERENCES c2(id),
# FOREIGN KEY (parent_id)
# REFERENCES p2(id)
# ON DELETE CASCADE
#);
CREATE TABLE l2(id int);
delimiter //;
CREATE TRIGGER tri_1
BEFORE INSERT ON p2 FOR EACH ROW
BEGIN
INSERT INTO l2 value(1);
END//
delimiter ;//
CREATE VIEW v2 AS SELECT * FROM p2;
DROP DATABASE db_recycle;
--replace_column 5 # 6 #
CALL dbms_recycle.show_tables();
let $table_name1=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
let $table_name2=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 2);
eval SHOW CREATE TABLE __recycle_bin__.$table_name1;
eval SHOW CREATE TABLE __recycle_bin__.$table_name2;
connection m_super_1;
CREATE DATABASE db_recycle;
SET GLOBAL recycle_scheduler=on;
--sleep 3
--echo ------------------------------------------------------
--echo 6. read only
--echo ------------------------------------------------------
connection m_super_1;
SET GLOBAL recycle_scheduler=off;
connection m_normal_1;
USE db_recycle;
CREATE TABLE t2 (id int);
DROP TABLE t2;
--replace_column 5 # 6 #
CALL dbms_recycle.show_tables();
connection m_super_1;
SET GLOBAL read_only = on;
connection m_normal_1;
let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
--error ER_OPTION_PREVENTS_STATEMENT
eval CALL dbms_recycle.purge_table("$table_name");
connection m_super_1;
SET GLOBAL read_only = off;
connection m_normal_1;
let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
eval CALL dbms_recycle.purge_table("$table_name");
connection m_super_1;
SET GLOBAL recycle_scheduler=on;
--echo ------------------------------------------------------
--echo 7. partition table or general tablespace
--echo (XEngine doesn't support partitioned table and tablespace)
--echo ------------------------------------------------------
#connection m_super_1;
#SET GLOBAL recycle_scheduler=off;
#
#connection m_normal_1;
#use db_recycle;
#
#CREATE TABLE t3 (
# firstname VARCHAR(25) NOT NULL,
# lastname VARCHAR(25) NOT NULL,
# username VARCHAR(16) NOT NULL,
# email VARCHAR(35),
# joined DATE NOT NULL
#)
#PARTITION BY RANGE( YEAR(joined) ) (
# PARTITION p0 VALUES LESS THAN (1960),
# PARTITION p1 VALUES LESS THAN (1970),
# PARTITION p2 VALUES LESS THAN (1980),
# PARTITION p3 VALUES LESS THAN (1990),
# PARTITION p4 VALUES LESS THAN MAXVALUE
#);
#
#DROP TABLE t3;
#
#--replace_column 5 # 6 #
#CALL dbms_recycle.show_tables();
#
#let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
#eval SHOW CREATE TABLE __recycle_bin__.$table_name;
#eval CALL dbms_recycle.purge_table("$table_name");
#CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
#CREATE TABLE t4(id int) tablespace ts1;
#DROP TABLE t4;
#
#--replace_column 5 # 6 #
#CALL dbms_recycle.show_tables();
#
#let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
#eval SHOW CREATE TABLE __recycle_bin__.$table_name;
#eval CALL dbms_recycle.purge_table("$table_name");
#
#connection m_super_1;
#SET GLOBAL recycle_scheduler=on;
#
#--sleep 3
#connection master;
#--sync_slave_with_master
#
#connection m_normal_1;
#DROP TABLEspace ts1;
--echo ------------------------------------------------------
--echo 8. recycle_bin table exists error
--echo ------------------------------------------------------
connection m_super_1;
SET GLOBAL recycle_scheduler=off;
connection m_normal_1;
use db_recycle;
CREATE TABLE t5(id int);
DROP TABLE t5;
CREATE TABLE t5(id int);
DROP TABLE t5;
--replace_column 5 # 6 #
CALL dbms_recycle.show_tables();
let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
eval CALL dbms_recycle.purge_table("$table_name");
connection m_super_1;
SET GLOBAL recycle_scheduler=on;
--echo ------------------------------------------------------
--echo 9 fts table didn't support to be recycled
--echo (XEngine doesn't support FULLTEXT index)
--echo ------------------------------------------------------
#connection m_super_1;
#SET GLOBAL recycle_scheduler=off;
#
#connection m_normal_1;
#use db_recycle;
#
#CREATE TABLE t1 (
# id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
# title VARCHAR(200),
# content TEXT,
# FULLTEXT INDEX ft_content (content)
#) ENGINE=InnoDB DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;
#
#DROP TABLE t1;
#
#CALL dbms_recycle.show_tables();
#
#connection m_super_1;
#SET GLOBAL recycle_scheduler=on;
--echo ------------------------------------------------------
--echo 10. purge normal table or nonexist table
--echo ------------------------------------------------------
connection m_super_1;
SET GLOBAL recycle_scheduler=off;
connection m_normal_1;
use db_recycle;
connection m_super_1;
CREATE TABLE __recycle_bin__.x5(id INT);
connection m_normal_1;
--error ER_PREPARE_RECYCLE_TABLE_ERROR
CALL dbms_recycle.purge_table("x5");
--error ER_PREPARE_RECYCLE_TABLE_ERROR
CALL dbms_recycle.purge_table("x6");
--replace_column 5 # 6 #
CALL dbms_recycle.show_tables();
connection m_super_1;
DROP TABLE __recycle_bin__.x5;
SET GLOBAL recycle_scheduler=on;
--echo ------------------------------------------------------
--echo 11. simulate handler rename failed.
--echo ------------------------------------------------------
connection m_super_1;
SET GLOBAL recycle_scheduler=off;
connection m_normal_1;
USE db_recycle;
CREATE TABLE t6(id INT);
INSERT INTO t6 VALUES(1);
COMMIT;
SET @@SESSION.debug = "+d,simulate_crashed_table_error";
--error 126
DROP TABLE t6;
SET @@SESSION.debug = "-d,simulate_crashed_table_error";
SHOW CREATE TABLE t6;
SELECT * FROM t6;
DROP TABLE t6;
--replace_column 5 # 6 #
CALL dbms_recycle.show_tables();
let $table_name=query_get_value(CALL dbms_recycle.show_tables(), TABLE, 1);
eval CALL dbms_recycle.purge_table("$table_name");
--echo ------------------------------------------------------
--echo 12. with lock mode
--echo ------------------------------------------------------
connection m_super_1;
CREATE TABLE test.t1(id INT);
SET SESSION recycle_bin=on;
LOCK TABLES test.t1 write;
DROP TABLE test.t1;
--error ER_NO_SUCH_TABLE
show create table t1;
--replace_column 5 # 6 #
CALL dbms_recycle.show_tables();
UNLOCK tables;
connection m_super_1;
SET GLOBAL recycle_scheduler=on;
connection master;
drop database db_recycle;
drop database db_recycle_dummy;
drop user super_1@'%';
drop user super_2@'%';
drop user normal_1@'%';
drop user normal_2@'%';
drop user normal_3@'%';
drop user normal_4@'%';
drop user normal_5@'%';
connection slave;
SET GLOBAL read_only = @start_read_only;
connection master;
--sync_slave_with_master
--source include/rpl_end.inc
--enable_ps_protocol
--source suite/xengine/include/check_xengine_log_error.inc