mirror of
https://github.com/MariaDB/server.git
synced 2025-01-27 17:33:44 +01:00
452 lines
13 KiB
Text
452 lines
13 KiB
Text
|
|
||
|
####################################################################
|
||
|
# TC to check truncate table statement atomicity for single #
|
||
|
# tablespace #
|
||
|
# Sceanrio covered: #
|
||
|
# 1. Debug points added for worklog #
|
||
|
# 2. Table with differnt row types #
|
||
|
# 3. Transactional statement. #
|
||
|
####################################################################
|
||
|
|
||
|
|
||
|
--source include/have_innodb.inc
|
||
|
--source include/have_debug.inc
|
||
|
--source include/big_test.inc
|
||
|
--source include/have_innodb_16k.inc
|
||
|
|
||
|
# Valgrind would result in a "long semaphore wait" inside InnoDB
|
||
|
--source include/not_valgrind.inc
|
||
|
# Embedded server does not support crashing
|
||
|
--source include/not_embedded.inc
|
||
|
# Avoid CrashReporter popup on Mac
|
||
|
--source include/not_crashrep.inc
|
||
|
|
||
|
#-----------------------------------------------------------------------
|
||
|
--disable_query_log
|
||
|
let $MYSQL_DATA_DIR= `select @@datadir`;
|
||
|
let $data_directory = data directory='$MYSQL_TMP_DIR/alt_dir';
|
||
|
let $innodb_file_per_table_orig=`select @@innodb_file_per_table`;
|
||
|
|
||
|
call mtr.add_suppression("InnoDB.*table did not exist in the InnoDB data dictionary.*");
|
||
|
call mtr.add_suppression("InnoDB: A page in the doublewrite buffer is not within space bounds.*");
|
||
|
call mtr.add_suppression("InnoDB: Cannot create file.*");
|
||
|
call mtr.add_suppression("InnoDB: Error number 17 means 'File exists'.*");
|
||
|
call mtr.add_suppression("InnoDB: A page in the doublewrite buffer is not within space bounds");
|
||
|
call mtr.add_suppression("InnoDB: Error: table .* does not exist in the InnoDB internal");
|
||
|
--enable_query_log
|
||
|
|
||
|
#-----------------------------------------------------------------------
|
||
|
set global innodb_file_per_table=on;
|
||
|
--echo # Verify that 'TRUNCATE TABLE' statement works fine and the size
|
||
|
--echo # of .ibd file is equal to the initial size after truncation.
|
||
|
|
||
|
#-----------------------------------------------------------------------
|
||
|
drop table if exists t1,t2,t3,t4,t6;
|
||
|
let $cnt = 6;
|
||
|
while ($cnt) {
|
||
|
|
||
|
# table with basic data type + primary ,secondary,composite,prefix index
|
||
|
create table t1(c1 int not null,
|
||
|
c2 int not null,
|
||
|
c3 char(255) not null,
|
||
|
c4 text(500) not null,
|
||
|
c5 blob(500) not null,
|
||
|
c6 varchar(500) not null,
|
||
|
c7 varchar(500) not null,
|
||
|
c8 datetime,
|
||
|
c9 decimal(5,3),
|
||
|
primary key (c1),
|
||
|
index (c3,c4(50),c5(50)),
|
||
|
index (c2))
|
||
|
engine=innodb row_format=redundant;
|
||
|
|
||
|
|
||
|
create table t2(c1 int not null,
|
||
|
c2 int not null,
|
||
|
c3 char(255) not null,
|
||
|
c4 text(500) not null,
|
||
|
c5 blob(500) not null,
|
||
|
c6 varchar(500) not null,
|
||
|
c7 varchar(500) not null,
|
||
|
c8 datetime,
|
||
|
c9 decimal(5,3),
|
||
|
primary key (c1),
|
||
|
index (c3,c4(50),c5(50)),
|
||
|
index (c2))
|
||
|
engine=innodb row_format=compact;
|
||
|
|
||
|
|
||
|
# with row type , key block size = 4K
|
||
|
create table t3(c1 int not null,
|
||
|
c2 int not null,
|
||
|
c3 char(255) not null,
|
||
|
c4 text(500) not null,
|
||
|
c5 blob(500) not null,
|
||
|
c6 varchar(500) not null,
|
||
|
c7 varchar(500) not null,
|
||
|
c8 datetime,
|
||
|
c9 decimal(5,3),
|
||
|
primary key (c1),
|
||
|
index (c3,c4(50),c5(50)),
|
||
|
index (c2))
|
||
|
engine=innodb row_format=compressed key_block_size=4;
|
||
|
|
||
|
|
||
|
create table t4(c1 int not null,
|
||
|
c2 int not null,
|
||
|
c3 char(255) not null,
|
||
|
c4 text(500) not null,
|
||
|
c5 blob(500) not null,
|
||
|
c6 varchar(500) not null,
|
||
|
c7 varchar(500) not null,
|
||
|
c8 datetime,
|
||
|
c9 decimal(5,3),
|
||
|
primary key (c1),
|
||
|
index (c3,c4(50),c5(50)),
|
||
|
index (c2))
|
||
|
engine=innodb row_format=dynamic;
|
||
|
|
||
|
|
||
|
create temporary table t5(c1 int not null,
|
||
|
c2 int not null,
|
||
|
c3 char(255) not null,
|
||
|
c4 text(500) not null,
|
||
|
c5 blob(500) not null,
|
||
|
c6 varchar(500) not null,
|
||
|
c7 varchar(500) not null,
|
||
|
c8 datetime,
|
||
|
c9 decimal(5,3),
|
||
|
primary key (c1),
|
||
|
index (c3,c4(50),c5(50)),
|
||
|
index (c2))
|
||
|
engine=innodb;
|
||
|
|
||
|
create table t6 ( a int ) engine = innodb;
|
||
|
insert into t6 values (50),(100),(150);
|
||
|
|
||
|
--disable_query_log
|
||
|
--disable_result_log
|
||
|
let $n=5;
|
||
|
|
||
|
# load created tables.
|
||
|
while ($n)
|
||
|
{
|
||
|
start transaction;
|
||
|
|
||
|
eval insert ignore into t1 values(
|
||
|
$n, $n,
|
||
|
repeat(concat(' tc3_',$n), 42),
|
||
|
repeat(concat(' tc4_',$n), 300),
|
||
|
repeat(concat(' tc5_',$n), 300),
|
||
|
repeat(concat(' tc6_',$n), 300),
|
||
|
repeat(concat(' tc7_',$n), 300),
|
||
|
now(), (100.55+$n));
|
||
|
|
||
|
eval insert ignore into t2 values(
|
||
|
$n, $n,
|
||
|
repeat(concat(' tc3_',$n), 42),
|
||
|
repeat(concat(' tc4_',$n), 300),
|
||
|
repeat(concat(' tc5_',$n), 300),
|
||
|
repeat(concat(' tc6_',$n), 300),
|
||
|
repeat(concat(' tc7_',$n), 300),
|
||
|
now(), (100.55+$n));
|
||
|
|
||
|
eval insert ignore into t3 values(
|
||
|
$n, $n,
|
||
|
repeat(concat(' tc3_',$n), 42),
|
||
|
repeat(concat(' tc4_',$n), 300),
|
||
|
repeat(concat(' tc5_',$n), 300),
|
||
|
repeat(concat(' tc6_',$n), 300),
|
||
|
repeat(concat(' tc7_',$n), 300),
|
||
|
now(), (100.55+$n));
|
||
|
|
||
|
eval insert ignore into t4 values(
|
||
|
$n, $n,
|
||
|
repeat(concat(' tc3_',$n), 42),
|
||
|
repeat(concat(' tc4_',$n), 300),
|
||
|
repeat(concat(' tc5_',$n), 300),
|
||
|
repeat(concat(' tc6_',$n), 300),
|
||
|
repeat(concat(' tc7_',$n), 300),
|
||
|
now(), (100.55+$n));
|
||
|
|
||
|
eval insert ignore into t5 values(
|
||
|
$n, $n,
|
||
|
repeat(concat(' tc3_',$n), 42),
|
||
|
repeat(concat(' tc4_',$n), 300),
|
||
|
repeat(concat(' tc5_',$n), 300),
|
||
|
repeat(concat(' tc6_',$n), 300),
|
||
|
repeat(concat(' tc7_',$n), 300),
|
||
|
now(), (100.55+$n));
|
||
|
|
||
|
if ($n <= 3)
|
||
|
{
|
||
|
commit;
|
||
|
}
|
||
|
|
||
|
if ($n > 3)
|
||
|
{
|
||
|
rollback;
|
||
|
}
|
||
|
|
||
|
dec $n;
|
||
|
}
|
||
|
|
||
|
# validate loading of the tables.
|
||
|
--enable_result_log
|
||
|
--enable_query_log
|
||
|
select count(*) from t1;
|
||
|
select count(*) from t2;
|
||
|
select count(*) from t3;
|
||
|
select count(*) from t4;
|
||
|
select count(*) from t5;
|
||
|
select count(*) from t6;
|
||
|
|
||
|
# set the debug crash point and exercise them.
|
||
|
if ($cnt == 6)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_during_drop_index_temp_table";
|
||
|
--echo "---debug ib_trunc_crash_during_drop_index_temp_table point---"
|
||
|
}
|
||
|
if ($cnt == 5)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_drop_reinit_done_create_to_start";
|
||
|
--echo "---debug ib_trunc_crash_drop_reinit_done_create_to_start---"
|
||
|
}
|
||
|
|
||
|
if ($cnt >= 5) {
|
||
|
--echo # Write file to make mysql-test-run.pl expect crash and restart
|
||
|
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--echo # Run the crashing query
|
||
|
--error 2013
|
||
|
truncate table t5;
|
||
|
--source include/wait_until_disconnected.inc
|
||
|
--enable_reconnect
|
||
|
--echo # Restart the MySQL server
|
||
|
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--source include/wait_until_connected_again.inc
|
||
|
--disable_reconnect
|
||
|
select count(*) from t1;
|
||
|
select count(*) from t2;
|
||
|
select count(*) from t3;
|
||
|
select count(*) from t4;
|
||
|
--error ER_NO_SUCH_TABLE
|
||
|
select count(*) from t5;
|
||
|
select count(*) from t6;
|
||
|
}
|
||
|
|
||
|
# set the debug crash point and exercise them.
|
||
|
if ($cnt == 6)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_on_drop_of_sec_index";
|
||
|
--echo "---debug ib_trunc_crash_on_drop_of_sec_index point---"
|
||
|
}
|
||
|
if ($cnt == 5)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_on_create_of_sec_index";
|
||
|
--echo "---debug ib_trunc_crash_on_create_of_sec_index---"
|
||
|
}
|
||
|
if ($cnt == 4)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_before_log_removal";
|
||
|
--echo "---debug ib_trunc_crash_before_log_removal point---"
|
||
|
}
|
||
|
if ($cnt == 3)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_truncate_done";
|
||
|
--echo "---debug ib_trunc_crash_after_truncate_done point---"
|
||
|
}
|
||
|
if ($cnt == 2)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_truncate_done";
|
||
|
--echo "---debug ib_trunc_crash_after_truncate_done point---"
|
||
|
}
|
||
|
if ($cnt == 1)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_redo_log_write_complete";
|
||
|
--echo "---debug ib_trunc_crash_after_redo_log_write_complete point---"
|
||
|
}
|
||
|
|
||
|
--echo # Write file to make mysql-test-run.pl expect crash and restart
|
||
|
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--echo # Run the crashing query
|
||
|
--error 2013
|
||
|
truncate table t1;
|
||
|
--source include/wait_until_disconnected.inc
|
||
|
--enable_reconnect
|
||
|
--echo # Restart the MySQL server
|
||
|
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--source include/wait_until_connected_again.inc
|
||
|
--disable_reconnect
|
||
|
select count(*) from t1;
|
||
|
select count(*) from t2;
|
||
|
select count(*) from t3;
|
||
|
select count(*) from t4;
|
||
|
--error ER_NO_SUCH_TABLE
|
||
|
select count(*) from t5;
|
||
|
select count(*) from t6;
|
||
|
|
||
|
if ($cnt == 6)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_on_drop_of_sec_index";
|
||
|
--echo "---debug ib_trunc_crash_on_drop_of_sec_index point---"
|
||
|
}
|
||
|
if ($cnt == 5)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_on_create_of_sec_index";
|
||
|
--echo "---debug ib_trunc_crash_on_create_of_sec_index---"
|
||
|
}
|
||
|
if ($cnt == 4)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_before_log_removal";
|
||
|
--echo "---debug ib_trunc_crash_before_log_removal point---"
|
||
|
}
|
||
|
if ($cnt == 3)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_truncate_done";
|
||
|
--echo "---debug ib_trunc_crash_after_truncate_done point---"
|
||
|
}
|
||
|
if ($cnt == 2)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_truncate_done";
|
||
|
--echo "---debug ib_trunc_crash_after_truncate_done point---"
|
||
|
}
|
||
|
if ($cnt == 1)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_redo_log_write_complete";
|
||
|
--echo "---debug ib_trunc_crash_after_redo_log_write_complete point---"
|
||
|
}
|
||
|
|
||
|
|
||
|
--echo # Write file to make mysql-test-run.pl expect crash and restart
|
||
|
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--echo # Run the crashing query
|
||
|
--error 2013
|
||
|
truncate table t2;
|
||
|
--source include/wait_until_disconnected.inc
|
||
|
--enable_reconnect
|
||
|
--echo # Restart the MySQL server
|
||
|
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--source include/wait_until_connected_again.inc
|
||
|
--disable_reconnect
|
||
|
select count(*) from t1;
|
||
|
select count(*) from t2;
|
||
|
select count(*) from t3;
|
||
|
select count(*) from t4;
|
||
|
--error ER_NO_SUCH_TABLE
|
||
|
select count(*) from t5;
|
||
|
select count(*) from t6;
|
||
|
|
||
|
if ($cnt == 6)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_on_drop_of_sec_index";
|
||
|
--echo "---debug ib_trunc_crash_on_drop_of_sec_index point---"
|
||
|
}
|
||
|
if ($cnt == 5)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_on_create_of_sec_index";
|
||
|
--echo "---debug ib_trunc_crash_on_create_of_sec_index---"
|
||
|
}
|
||
|
if ($cnt == 4)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_before_log_removal";
|
||
|
--echo "---debug ib_trunc_crash_before_log_removal point---"
|
||
|
}
|
||
|
if ($cnt == 3)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_truncate_done";
|
||
|
--echo "---debug ib_trunc_crash_after_truncate_done point---"
|
||
|
}
|
||
|
if ($cnt == 2)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_truncate_done";
|
||
|
--echo "---debug ib_trunc_crash_after_truncate_done point---"
|
||
|
}
|
||
|
if ($cnt == 1)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_redo_log_write_complete";
|
||
|
--echo "---debug ib_trunc_crash_after_redo_log_write_complete point---"
|
||
|
}
|
||
|
|
||
|
|
||
|
--echo # Write file to make mysql-test-run.pl expect crash and restart
|
||
|
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--echo # Run the crashing query
|
||
|
--error 2013
|
||
|
truncate table t3;
|
||
|
--source include/wait_until_disconnected.inc
|
||
|
--enable_reconnect
|
||
|
--echo # Restart the MySQL server
|
||
|
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--source include/wait_until_connected_again.inc
|
||
|
--disable_reconnect
|
||
|
select count(*) from t1;
|
||
|
select count(*) from t2;
|
||
|
select count(*) from t3;
|
||
|
select count(*) from t4;
|
||
|
--error ER_NO_SUCH_TABLE
|
||
|
select count(*) from t5;
|
||
|
select count(*) from t6;
|
||
|
|
||
|
|
||
|
if ($cnt == 6)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_on_drop_of_sec_index";
|
||
|
--echo "---debug ib_trunc_crash_on_drop_of_sec_index point---"
|
||
|
}
|
||
|
if ($cnt == 5)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_on_create_of_sec_index";
|
||
|
--echo "---debug ib_trunc_crash_on_create_of_sec_index---"
|
||
|
}
|
||
|
if ($cnt == 4)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_before_log_removal";
|
||
|
--echo "---debug ib_trunc_crash_before_log_removal point---"
|
||
|
}
|
||
|
if ($cnt == 3)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_truncate_done";
|
||
|
--echo "---debug ib_trunc_crash_after_truncate_done point---"
|
||
|
}
|
||
|
if ($cnt == 2)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_truncate_done";
|
||
|
--echo "---debug ib_trunc_crash_after_truncate_done point---"
|
||
|
}
|
||
|
if ($cnt == 1)
|
||
|
{
|
||
|
set session debug="+d,ib_trunc_crash_after_redo_log_write_complete";
|
||
|
--echo "---debug ib_trunc_crash_after_redo_log_write_complete point---"
|
||
|
}
|
||
|
|
||
|
--echo # Write file to make mysql-test-run.pl expect crash and restart
|
||
|
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--echo # Run the crashing query
|
||
|
--error 2013
|
||
|
truncate table t4;
|
||
|
--source include/wait_until_disconnected.inc
|
||
|
--enable_reconnect
|
||
|
--echo # Restart the MySQL server
|
||
|
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||
|
--source include/wait_until_connected_again.inc
|
||
|
--disable_reconnect
|
||
|
select count(*) from t1;
|
||
|
select count(*) from t2;
|
||
|
select count(*) from t3;
|
||
|
select count(*) from t4;
|
||
|
--error ER_NO_SUCH_TABLE
|
||
|
select count(*) from t5;
|
||
|
select count(*) from t6;
|
||
|
|
||
|
drop table t1, t2, t3, t4, t6;
|
||
|
|
||
|
dec $cnt;
|
||
|
|
||
|
--disable_query_log
|
||
|
eval set global innodb_file_per_table=$innodb_file_per_table_orig;
|
||
|
--enable_query_log
|
||
|
}
|
||
|
|
||
|
|
||
|
|