Commit 8aa1a9e6 authored by Nikita Malyavin's avatar Nikita Malyavin Committed by Sergei Golubchik

MDEV-31812 Add switch to old_mode to disable non-locking ALTER

Add LOCK_ALTER_TABE_COPY bit to old_mode. Disables online copy by default,
but still allows to force it with explicit lock=none
parent a1af5255
......@@ -1416,6 +1416,46 @@ id a b
2 1
drop table t;
set debug_sync= reset;
#
# MDEV-31812 Add switch to old_mode to disable non-locking ALTER
#
set @old_old_mode= @@old_mode;
create or replace table t1 (a int primary key, b int);
set debug_sync= 'alter_table_copy_end SIGNAL copy_end WAIT_FOR proceed';
alter table t1 drop primary key, add primary key(b), algorithm= copy;
connection con2;
set debug_sync= 'now WAIT_FOR copy_end';
select if(max_stage = 4, "online", "old") as mode
from information_schema.processlist where id = @con;
mode
online
set debug_sync= 'now SIGNAL proceed';
connection default;
set old_mode= LOCK_ALTER_TABLE_COPY;
set debug_sync= 'alter_table_copy_end SIGNAL copy_end WAIT_FOR proceed';
alter table t1 drop primary key, add primary key(b), algorithm= copy;
connection con2;
set debug_sync= 'now WAIT_FOR copy_end';
select if(max_stage = 4, "online", "old") as mode
from information_schema.processlist where id = @con;
mode
old
set debug_sync= 'now SIGNAL proceed';
connection default;
set debug_sync= 'alter_table_copy_end SIGNAL copy_end WAIT_FOR proceed';
alter table t1 drop primary key, add primary key(b),
algorithm= copy, lock=none;
connection con2;
set debug_sync= 'now WAIT_FOR copy_end';
select if(max_stage = 4, "online", "old") as mode
from information_schema.processlist where id = @con;
mode
online
set debug_sync= 'now SIGNAL proceed';
connection default;
set old_mode= @old_old_mode;
drop table t1;
set debug_sync= reset;
disconnect con1;
disconnect con2;
#
......
......@@ -1650,6 +1650,52 @@ select * from t;
drop table t;
set debug_sync= reset;
--echo #
--echo # MDEV-31812 Add switch to old_mode to disable non-locking ALTER
--echo #
set @old_old_mode= @@old_mode;
create or replace table t1 (a int primary key, b int);
set debug_sync= 'alter_table_copy_end SIGNAL copy_end WAIT_FOR proceed';
send alter table t1 drop primary key, add primary key(b), algorithm= copy;
--connection con2
set debug_sync= 'now WAIT_FOR copy_end';
select if(max_stage = 4, "online", "old") as mode
from information_schema.processlist where id = @con;
set debug_sync= 'now SIGNAL proceed';
--connection default
--reap
set old_mode= LOCK_ALTER_TABLE_COPY;
set debug_sync= 'alter_table_copy_end SIGNAL copy_end WAIT_FOR proceed';
send alter table t1 drop primary key, add primary key(b), algorithm= copy;
--connection con2
set debug_sync= 'now WAIT_FOR copy_end';
select if(max_stage = 4, "online", "old") as mode
from information_schema.processlist where id = @con;
set debug_sync= 'now SIGNAL proceed';
--connection default
--reap
set debug_sync= 'alter_table_copy_end SIGNAL copy_end WAIT_FOR proceed';
send alter table t1 drop primary key, add primary key(b),
algorithm= copy, lock=none;
--connection con2
set debug_sync= 'now WAIT_FOR copy_end';
select if(max_stage = 4, "online", "old") as mode
from information_schema.processlist where id = @con;
set debug_sync= 'now SIGNAL proceed';
--connection default
--reap
set old_mode= @old_old_mode;
drop table t1;
set debug_sync= reset;
--disconnect con1
--disconnect con2
--echo #
......
......@@ -709,7 +709,8 @@ The following specify which files/extra groups are read (specified before remain
MySQL versions. Any combination of:
NO_DUP_KEY_WARNINGS_WITH_IGNORE, NO_PROGRESS_INFO,
ZERO_DATE_TIME_CAST, UTF8_IS_UTF8MB3,
IGNORE_INDEX_ONLY_FOR_JOIN, COMPAT_5_1_CHECKSUM
IGNORE_INDEX_ONLY_FOR_JOIN, COMPAT_5_1_CHECKSUM,
LOCK_ALTER_TABLE_COPY
--old-passwords Use old password encryption method (needed for 4.0 and
older clients)
--old-style-user-limits
......
......@@ -114,8 +114,8 @@ SET @@global.old_mode = 4;
SELECT @@global.old_mode;
@@global.old_mode
ZERO_DATE_TIME_CAST
SET @@global.old_mode = 64;
ERROR 42000: Variable 'old_mode' can't be set to the value of '64'
SET @@global.old_mode = 128;
ERROR 42000: Variable 'old_mode' can't be set to the value of '128'
SELECT @@global.old_mode;
@@global.old_mode
ZERO_DATE_TIME_CAST
......
......@@ -2289,7 +2289,7 @@ VARIABLE_COMMENT Used to emulate old behavior from earlier MariaDB or MySQL vers
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM
ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM,LOCK_ALTER_TABLE_COPY
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME OLD_PASSWORDS
......
......@@ -2489,7 +2489,7 @@ VARIABLE_COMMENT Used to emulate old behavior from earlier MariaDB or MySQL vers
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM
ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM,LOCK_ALTER_TABLE_COPY
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME OLD_PASSWORDS
......
......@@ -172,7 +172,7 @@ SET @@global.old_mode = 4;
SELECT @@global.old_mode;
--Error ER_WRONG_VALUE_FOR_VAR
SET @@global.old_mode = 64;
SET @@global.old_mode = 128;
SELECT @@global.old_mode;
# use of decimal values
......
......@@ -202,6 +202,7 @@ enum enum_binlog_row_image {
#define OLD_MODE_UTF8_IS_UTF8MB3 (1 << 3)
#define OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN (1 << 4)
#define OLD_MODE_COMPAT_5_1_CHECKSUM (1 << 5)
#define OLD_MODE_LOCK_ALTER_TABLE_COPY (1 << 6)
extern char internal_table_name[2];
extern char empty_c_string[1];
......
......@@ -10172,7 +10172,9 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db,
*/
table_list->required_type= TABLE_TYPE_NORMAL;
if (alter_info->requested_lock > Alter_info::ALTER_TABLE_LOCK_NONE
if ((alter_info->requested_lock == Alter_info::ALTER_TABLE_LOCK_DEFAULT
&& (thd->variables.old_behavior & OLD_MODE_LOCK_ALTER_TABLE_COPY))
|| alter_info->requested_lock > Alter_info::ALTER_TABLE_LOCK_NONE
|| thd->lex->sql_command == SQLCOM_OPTIMIZE
|| alter_info->algorithm(thd) > Alter_info::ALTER_TABLE_ALGORITHM_COPY)
online= false;
......
......@@ -3891,6 +3891,7 @@ static const char *old_mode_names[]=
"UTF8_IS_UTF8MB3",
"IGNORE_INDEX_ONLY_FOR_JOIN",
"COMPAT_5_1_CHECKSUM",
"LOCK_ALTER_TABLE_COPY",
0
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment