mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
9842ed4e6d
Related to 7c2ba9e
: ha_table_exists() is replaced by
dd_frm_type(). ha_table_exists() checked the existence of share and
that succeeded to enter the execution branch of ha_delete_table()
where tdc_remove_table() was called. Now it is skipped because
dd_frm_type() returns TABLE_TYPE_UNKNOWN. Fix it by calling
tdc_remove_table() in this case as well.
226 lines
6.2 KiB
Text
226 lines
6.2 KiB
Text
--source include/have_log_bin.inc
|
|
--source include/have_innodb.inc
|
|
--source include/have_archive.inc
|
|
#
|
|
# This test is based on the orginal test from Tencent for DROP TABLE ... FORCE
|
|
# In MariaDB we did reuse the code but MariaDB does not require the FORCE
|
|
# keyword to drop a table even if the .frm file or some engine files are
|
|
# missing.
|
|
# To make it easy to see the differences between the orginal code and
|
|
# the new one, we have left some references to the original test case
|
|
#
|
|
|
|
CALL mtr.add_suppression("Operating system error number");
|
|
CALL mtr.add_suppression("The error means the system cannot");
|
|
CALL mtr.add_suppression("returned OS error 71");
|
|
|
|
let $DATADIR= `select @@datadir`;
|
|
|
|
--echo #Test1: table with missing .ibd can be dropped directly
|
|
# drop table without ibd
|
|
create table t1(a int)engine=innodb;
|
|
--remove_file $DATADIR/test/t1.ibd
|
|
drop table t1;
|
|
--list_files $DATADIR/test/
|
|
|
|
# Original DROP TABLE .. FORCE required SUPER privilege. MariaDB doesn't
|
|
--echo # Test droping table without frm without super privilege
|
|
|
|
# create table t1 and rm frm
|
|
create table t1(a int) engine=innodb;
|
|
--remove_file $DATADIR/test/t1.frm
|
|
|
|
# create test user
|
|
create user test identified by '123456';
|
|
grant all privileges on test.t1 to 'test'@'%'identified by '123456';
|
|
|
|
# connect as test
|
|
connect (con_test, localhost, test,'123456', );
|
|
--connection con_test
|
|
|
|
# drop table with user test
|
|
drop table t1;
|
|
--error ER_BAD_TABLE_ERROR
|
|
drop table t1;
|
|
|
|
# connect as root
|
|
--connection default
|
|
|
|
--disconnect con_test
|
|
drop user test;
|
|
|
|
# check files in datadir about t1
|
|
--list_files $DATADIR/test/
|
|
|
|
--echo #Test5: drop table with triger, and with missing frm
|
|
# create table t1 with triger and rm frm
|
|
create table t1(a int)engine=innodb;
|
|
create trigger t1_trg before insert on t1 for each row begin end;
|
|
|
|
let $DATADIR= `select @@datadir`;
|
|
--remove_file $DATADIR/test/t1.frm
|
|
|
|
drop table t1;
|
|
--error ER_BAD_TABLE_ERROR
|
|
drop table t1;
|
|
|
|
# check files in datadir about t1
|
|
--list_files $DATADIR/test/
|
|
|
|
--echo #Test6: table with foreign key references can not be dropped
|
|
# create table with foreign key reference and rm frm
|
|
CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB;
|
|
CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE) ENGINE=INNODB;
|
|
--remove_file $DATADIR/test/parent.frm
|
|
|
|
# parent can not be dropped when there are foreign key references
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
drop table parent;
|
|
|
|
# parent can be dropped when there are no foreign key references
|
|
drop table child;
|
|
drop table parent;
|
|
|
|
# check files in datadir about child and parent
|
|
--list_files $DATADIR/test/
|
|
|
|
--echo #Test7: drop table twice
|
|
create table t1(a int)engine=innodb;
|
|
--remove_file $DATADIR/test/t1.frm
|
|
|
|
# first drop table will success
|
|
drop table t1;
|
|
|
|
# check files in datadir about t1
|
|
--list_files $DATADIR/test/
|
|
|
|
# second drop with if exists will also ok
|
|
drop table if exists t1;
|
|
|
|
# check files in datadir about t1
|
|
--list_files $DATADIR/test/
|
|
|
|
--echo #Test9: check compatibility with restrict/cascade
|
|
# create table with foreign key reference and rm frm
|
|
CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB;
|
|
CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE) ENGINE=INNODB;
|
|
|
|
# parent can not be dropped when there are foreign key references
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
drop table parent;
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
drop table parent restrict;
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
drop table parent cascade;
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
drop table parent;
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
drop table parent restrict;
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
drop table parent cascade;
|
|
|
|
# parent can be dropped when there are no foreign key references
|
|
drop table child;
|
|
drop table parent;
|
|
|
|
--echo #Test10: drop non-innodb engine table returns ok
|
|
# create myisam table t1 and rm .frm
|
|
create table t1(a int) engine=myisam;
|
|
--remove_file $DATADIR/test/t1.frm
|
|
--replace_result \\ /
|
|
drop table t1;
|
|
|
|
# create myisam table t1 and rm .MYD
|
|
create table t1(a int) engine=myisam;
|
|
--remove_file $DATADIR/test/t1.MYD
|
|
--replace_result \\ /
|
|
drop table t1;
|
|
|
|
# create myisam table t1 and rm .MYI
|
|
create table t1(a int) engine=myisam;
|
|
--remove_file $DATADIR/test/t1.MYI
|
|
--replace_result \\ /
|
|
drop table t1;
|
|
--list_files $DATADIR/test/
|
|
|
|
# create Aria table t1 and rm .frm and .MAD
|
|
create table t1(a int) engine=aria;
|
|
--remove_file $DATADIR/test/t1.frm
|
|
--remove_file $DATADIR/test/t1.MAD
|
|
--list_files $DATADIR/test/
|
|
--error ER_BAD_TABLE_ERROR
|
|
drop table t1;
|
|
--replace_result \\ /
|
|
show warnings;
|
|
--list_files $DATADIR/test/
|
|
|
|
# create Aria table t2 and rm .frm and .MAI
|
|
create table t2(a int) engine=aria;
|
|
flush tables;
|
|
--remove_file $DATADIR/test/t2.frm
|
|
--remove_file $DATADIR/test/t2.MAI
|
|
--list_files $DATADIR/test/
|
|
--error ER_BAD_TABLE_ERROR
|
|
drop table t2;
|
|
--replace_result \\ /
|
|
show warnings;
|
|
--list_files $DATADIR/test/
|
|
|
|
# create Aria table t2 and rm .MAI and .MAD
|
|
create table t2(a int) engine=aria;
|
|
flush tables;
|
|
--remove_file $DATADIR/test/t2.MAD
|
|
--remove_file $DATADIR/test/t2.MAI
|
|
--list_files $DATADIR/test/
|
|
--replace_result \\ /
|
|
drop table t2;
|
|
|
|
# create CVS table t2 and rm .frm
|
|
create table t2(a int not null) engine=CSV;
|
|
flush tables;
|
|
--remove_file $DATADIR/test/t2.frm
|
|
drop table t2;
|
|
--list_files $DATADIR/test/
|
|
|
|
# create CVS table t2 and rm .frm
|
|
create table t2(a int not null) engine=CSV;
|
|
flush tables;
|
|
--remove_file $DATADIR/test/t2.CSV
|
|
drop table t2;
|
|
--list_files $DATADIR/test/
|
|
|
|
# create Archive table t2 and rm
|
|
# Note that as Archive has discovery, removing the
|
|
# ARZ will automatically remove the .frm
|
|
|
|
create table t2(a int not null) engine=archive;
|
|
flush tables;
|
|
--error 1
|
|
--remove_file $DATADIR/test/t2.frm
|
|
select * from t2;
|
|
flush tables;
|
|
--remove_file $DATADIR/test/t2.ARZ
|
|
--error ER_NO_SUCH_TABLE
|
|
select * from t2;
|
|
--list_files $DATADIR/test/
|
|
--replace_result \\ /
|
|
--error ER_BAD_TABLE_ERROR
|
|
drop table t2;
|
|
|
|
create table t2(a int not null) engine=archive;
|
|
flush tables;
|
|
--remove_file $DATADIR/test/t2.ARZ
|
|
--error ER_BAD_TABLE_ERROR
|
|
drop table t2;
|
|
--list_files $DATADIR/test/
|
|
|
|
--echo #
|
|
--echo # MDEV-23549 CREATE fails after DROP without FRM
|
|
--echo #
|
|
create table t1 (a int);
|
|
select * from t1;
|
|
--remove_file $datadir/test/t1.frm
|
|
|
|
drop table t1;
|
|
create table t1 (a int);
|
|
drop table t1;
|