mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
69724805bc
Syntax for CONVERT TABLE ALTER TABLE tbl_name CONVERT TABLE tbl_name TO PARTITION partition_name partition_spec Examples: ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 VALUES LESS THAN MAX_VALUE(); New ALTER_PARTITION_CONVERT_IN command for fast_alter_partition_table() is done in alter_partition_convert_in() function which basically does ha_rename_table(). Table structure and data check is basically the same as in EXCHANGE PARTITION command. And these are done by compare_table_with_partition() and check_table_data(). Atomic DDL is done by the scheme from MDEV-22166 (see the corresponding commit message). The only differnce is that it also has to drop source table frm and that is done by WFRM_DROP_CONVERTED_FROM. Initial patch was done by Dmitry Shulga <dmitry.shulga@mariadb.com>
174 lines
4.5 KiB
Text
174 lines
4.5 KiB
Text
--source include/have_partition.inc
|
|
--source include/have_debug.inc
|
|
--source include/have_sequence.inc
|
|
--source include/binlog_combinations.inc
|
|
--source include/have_binlog_format_row_or_statement.inc
|
|
--source include/not_valgrind.inc
|
|
|
|
let $default_engine=InnoDB;
|
|
let $extra_option=;
|
|
let $save_debug=`select @@debug_dbug`;
|
|
|
|
if ($MTR_COMBINATION_MYISAM)
|
|
{
|
|
let $default_engine=MyISAM;
|
|
}
|
|
if ($MTR_COMBINATION_ARIA)
|
|
{
|
|
let $default_engine=Aria;
|
|
let $extra_option=transactional=1;
|
|
}
|
|
|
|
if ($MTR_COMBINATION_STMT)
|
|
{
|
|
let $binlog_format=include/set_binlog_format_statement.sql;
|
|
}
|
|
if ($MTR_COMBINATION_ROW)
|
|
{
|
|
let $binlog_format=include/set_binlog_format_row.sql;
|
|
}
|
|
|
|
--disable_query_log
|
|
--eval set @@default_storage_engine=$default_engine
|
|
--enable_query_log
|
|
|
|
--echo # Crash recovery
|
|
|
|
let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
|
|
|
let $crash_count= 14;
|
|
let $crash_points='crash_create_before_create_frm',
|
|
'crash_alter_partition_after_create_frm',
|
|
'crash_alter_partition_after_write_frm',
|
|
'crash_convert_partition_1',
|
|
'crash_convert_partition_2',
|
|
'crash_convert_partition_3',
|
|
'crash_convert_partition_4',
|
|
'crash_convert_partition_5',
|
|
'crash_convert_partition_6',
|
|
'crash_convert_partition_7',
|
|
'crash_convert_partition_8',
|
|
'crash_convert_partition_9',
|
|
'crash_convert_partition_10',
|
|
'crash_convert_partition_11';
|
|
|
|
#let $crash_count= 1;
|
|
#let $crash_points= 'crash_convert_partition_10';
|
|
|
|
let $statement_count= 2;
|
|
let $statements= 'ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1',
|
|
'ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)';
|
|
|
|
#let $statement_count= 1;
|
|
#let $statements= 'ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)';
|
|
|
|
--delimiter $
|
|
create or replace procedure prepare_table(r int)
|
|
begin
|
|
create or replace table t1 (x int)
|
|
with system versioning
|
|
partition by range(x) (
|
|
partition p0 values less than (10),
|
|
partition p1 values less than (20),
|
|
partition pn values less than (30));
|
|
insert into t1 values (2), (12), (22);
|
|
|
|
if r > 1 then
|
|
create or replace table tp2 (x int)
|
|
with system versioning;
|
|
insert into tp2 values (32), (39);
|
|
end if;
|
|
|
|
flush tables;
|
|
end $
|
|
--delimiter ;
|
|
|
|
let $old_debug=`select @@debug_dbug`;
|
|
|
|
let $keep_include_silent=1;
|
|
let $grep_script=ALTER;
|
|
--disable_query_log
|
|
|
|
let $r=0;
|
|
while ($r < $statement_count)
|
|
{
|
|
inc $r;
|
|
let $statement=`select ELT($r, $statements)`;
|
|
--echo # QUERY: $statement
|
|
|
|
let $c=0;
|
|
while ($c < $crash_count)
|
|
{
|
|
inc $c;
|
|
let $crash=`select ELT($c, $crash_points)`;
|
|
|
|
--eval set @@default_storage_engine=$default_engine
|
|
eval call prepare_table($r);
|
|
if (!$c)
|
|
{
|
|
lock tables t1 write;
|
|
}
|
|
|
|
--source $binlog_format
|
|
|
|
RESET MASTER;
|
|
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
--disable_reconnect
|
|
--eval set @@debug_dbug="+d,$crash"
|
|
let $errno=0;
|
|
--error 0,2013
|
|
--eval $statement;
|
|
let $error=$errno;
|
|
--enable_reconnect
|
|
--source include/wait_until_connected_again.inc
|
|
--disable_query_log
|
|
--eval set @@debug_dbug="$old_debug"
|
|
|
|
if ($error == 0)
|
|
{
|
|
--echo # NO CRASH: $crash
|
|
}
|
|
if ($error)
|
|
{
|
|
--echo # CRASH: $crash
|
|
}
|
|
# Check which tables still exists
|
|
--replace_result MAI MYI MAD MYD
|
|
--list_files $MYSQLD_DATADIR/test t*
|
|
--replace_regex /backup-\d+/backup/
|
|
--list_files $MYSQLD_DATADIR/test *sql*
|
|
--remove_files_wildcard $MYSQLD_DATADIR/test *sql-backup-*
|
|
|
|
--let $binlog_file=master-bin.000001
|
|
--source include/show_binlog_events.inc
|
|
if ($error)
|
|
{
|
|
--let $binlog_file=master-bin.000002
|
|
--source include/show_binlog_events.inc
|
|
}
|
|
|
|
--replace_result $default_engine DEFAULT_ENGINE ' PAGE_CHECKSUM=1' ''
|
|
show create table t1;
|
|
select * from t1;
|
|
--replace_result $default_engine DEFAULT_ENGINE ' PAGE_CHECKSUM=1' ''
|
|
--error 0, ER_NO_SUCH_TABLE
|
|
show create table tp1;
|
|
--error 0, ER_NO_SUCH_TABLE
|
|
select * from tp1;
|
|
--replace_result $default_engine DEFAULT_ENGINE ' PAGE_CHECKSUM=1' ''
|
|
--error 0, ER_NO_SUCH_TABLE
|
|
show create table tp2;
|
|
--error 0, ER_NO_SUCH_TABLE
|
|
select * from tp2;
|
|
# Drop the tables. The warnings will show what was dropped
|
|
--disable_warnings
|
|
drop table t1;
|
|
drop table if exists tp1;
|
|
--enable_warnings
|
|
}
|
|
}
|
|
drop table if exists t1;
|
|
drop procedure prepare_table;
|
|
--eval set @@debug_dbug="$save_debug"
|
|
|
|
--enable_query_log
|