mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MDEV-13795/MDEV-14332 Corruption during online table-rebuilding ALTER when VIRTUAL columns exist
When MySQL 5.7 introduced indexed virtual columns, it introduced several bugs into the online table-rebuilding ALTER, that is, the row_log_table_apply() family of functions. The online_log format that was introduced for online table-rebuilding ALTER in MySQL 5.6 should be sufficient. Ideally, any indexed virtual column values would be evaluated based on the log records in the temporary file. There is no need to log virtual column values. (For ADD INDEX, that is row_log_apply(), we always must log the values of the keys, no matter if the columns are virtual.) Because omitting the virtual column values removes any chance of row_log_table_apply() working with indexed virtual columns, we will for now refuse LOCK=NONE in table-rebuilding ALTER operations when indexes on virtual columns exist. This restriction would be lifted in MDEV-14341. innobase_indexed_virtual_exist(): New predicate, to determine if indexed virtual columns exist in a table definition. ha_innobase::check_if_supported_inplace_alter(): Refuse online rebuild if indexed virtual columns exist. rec_get_converted_size_temp_v(), rec_convert_dtuple_to_temp_v(): Remove. row_log_table_delete(), row_log_table_update(, row_log_table_insert(): Remove parameters for virtual columns. trx_undo_read_v_rows(): Remove the col_map parameter. row_log_table_apply(): Do not deal with virtual columns.
This commit is contained in:
@@ -53,46 +53,8 @@ a b c h
|
||||
18 1 19 mm
|
||||
28 1 29 mm
|
||||
NULL NULL NULL mx
|
||||
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
|
||||
ALTER TABLE t ADD COLUMN x INT;
|
||||
connection con1;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
|
||||
start transaction;
|
||||
update t set a=1 where a = 0;
|
||||
rollback;
|
||||
start transaction;
|
||||
delete from t;
|
||||
insert into t values(1,null,default,null);
|
||||
rollback;
|
||||
start transaction;
|
||||
update t set b=b+1;
|
||||
rollback;
|
||||
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
|
||||
connection default;
|
||||
check table t;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t check status OK
|
||||
SELECT c FROM t;
|
||||
c
|
||||
NULL
|
||||
3
|
||||
19
|
||||
29
|
||||
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
|
||||
ALTER TABLE t ADD COLUMN x2 INT;
|
||||
connection con1;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
|
||||
start transaction;
|
||||
DELETE FROM t WHERE a = 0;
|
||||
ROLLBACK;
|
||||
DELETE FROM t WHERE a = 0;
|
||||
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
|
||||
connection default;
|
||||
SELECT c FROM t;
|
||||
c
|
||||
NULL
|
||||
19
|
||||
29
|
||||
ALTER TABLE t FORCE, LOCK=NONE;
|
||||
ERROR 0A000: LOCK=NONE is not supported. Reason: online rebuild with indexed virtual columns. Try LOCK=SHARED
|
||||
disconnect con1;
|
||||
DROP TABLE t;
|
||||
SET DEBUG_SYNC = 'RESET';
|
||||
@@ -123,135 +85,4 @@ NULL
|
||||
19
|
||||
29
|
||||
DROP TABLE t;
|
||||
#
|
||||
# Bug#22018532 ASSERTION WHEN ONLINE REAPPLY REBUILD LOG ON
|
||||
# MULTIPLE INDEXED VIRTUAL COLUMNS
|
||||
#
|
||||
create table t (
|
||||
a int as (1) virtual,
|
||||
b int,
|
||||
c int as (1) virtual,
|
||||
unique(b),
|
||||
unique(c),
|
||||
key(a)
|
||||
) engine=innodb;
|
||||
insert ignore into t values();
|
||||
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
|
||||
optimize table t;
|
||||
connect con1,localhost,root,,;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
|
||||
insert ignore into t values();
|
||||
Warnings:
|
||||
Warning 1062 Duplicate entry '1' for key 'c'
|
||||
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
|
||||
connection default;
|
||||
/* connection default */ optimize table t;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t optimize note Table does not support optimize, doing recreate + analyze instead
|
||||
test.t optimize error Duplicate entry '1' for key 'a'
|
||||
test.t optimize status Operation failed
|
||||
Warnings:
|
||||
Error 1062 Duplicate entry '1' for key 'a'
|
||||
SELECT c FROM t;
|
||||
c
|
||||
1
|
||||
SHOW CREATE TABLE t;
|
||||
Table Create Table
|
||||
t CREATE TABLE `t` (
|
||||
`a` int(11) GENERATED ALWAYS AS (1) VIRTUAL,
|
||||
`b` int(11) DEFAULT NULL,
|
||||
`c` int(11) GENERATED ALWAYS AS (1) VIRTUAL,
|
||||
UNIQUE KEY `b` (`b`),
|
||||
UNIQUE KEY `c` (`c`),
|
||||
KEY `a` (`a`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
SELECT * FROM t;
|
||||
a b c
|
||||
1 NULL 1
|
||||
DROP TABLE t;
|
||||
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
|
||||
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
|
||||
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
|
||||
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
|
||||
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
|
||||
CREATE INDEX idx ON t(c);
|
||||
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_rebuild WAIT_FOR go_ahead';
|
||||
optimize table t;
|
||||
connection con1;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR start_rebuild';
|
||||
INSERT INTO t VALUES (48, 2, DEFAULT, 'xx');
|
||||
INSERT INTO t VALUES (68, 3, DEFAULT, 'sx');
|
||||
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
|
||||
connection default;
|
||||
/* connection default */ optimize table t;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t optimize note Table does not support optimize, doing recreate + analyze instead
|
||||
test.t optimize status OK
|
||||
SELECT c FROM t;
|
||||
c
|
||||
NULL
|
||||
14
|
||||
19
|
||||
29
|
||||
50
|
||||
71
|
||||
disconnect con1;
|
||||
DROP TABLE t;
|
||||
#
|
||||
# Bug#22951879 - ASSERTS RELATED TO ONLINE DDL AND GCOL
|
||||
#
|
||||
create table ibstd_14 (a int not null, d int not null, b varchar(198) not null, c char(181), vadcol int as (a+length(d)) stored, vbcol char(2) as (substr(b,2,2)) virtual, vbidxcol char(3) as (substr(b,1,3)) virtual , index(d), index(a), index(vbidxcol), index(a,vbidxcol), index(vbidxcol,d), unique key (b(10), a, d), index(c(99), b(31)), index(b(5), c(10), a) , index(a,d)) engine=InnoDB stats_persistent=1 row_format=dynamic;
|
||||
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
|
||||
alter table ibstd_14 row_format=compressed key_block_size=4,add key kn3 (d,c,vbcol,b);
|
||||
connect con1,localhost,root;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
|
||||
insert into ibstd_14 (a,d,b,c, vbidxcol, vbcol) values ('118','6',repeat('oacolaarlruoacuroauurloraarucoooarcooauoolacalllaulrruarrrucruuooclacuoouccarrcoocloccorrrrarourcooalloocooccouruolaorlcaocualolc','1'),repeat('lolrrlalcocroraaulauclaaucolcorcuooaolruaooooluooooouaoorlarucorullalcrrloccououaooaorluorraclrcooouuolocoaolcocaaculruoocucoocoooauuolarcoraraocaoolulolarru','1'),default,default);
|
||||
insert into ibstd_14 (a,d,b,c, vbidxcol, vbcol) values ('118','6', 'aaaa', 'lll', default, default);
|
||||
update ibstd_14 set b='11111' where b='aaaa';
|
||||
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
|
||||
connection default;
|
||||
select * from ibstd_14;
|
||||
a d b c vadcol vbcol vbidxcol
|
||||
118 6 oacolaarlruoacuroauurloraarucoooarcooauoolacalllaulrruarrrucruuooclacuoouccarrcoocloccorrrrarourcooalloocooccouruolaorlcaocualolc lolrrlalcocroraaulauclaaucolcorcuooaolruaooooluooooouaoorlarucorullalcrrloccououaooaorluorraclrcooouuolocoaolcocaaculruoocucoocoooauuolarcoraraocaoolulolarru 119 ac oac
|
||||
118 6 11111 lll 119 11 111
|
||||
select d,c,vbcol,b from ibstd_14;
|
||||
d c vbcol b
|
||||
6 lll 11 11111
|
||||
6 lolrrlalcocroraaulauclaaucolcorcuooaolruaooooluooooouaoorlarucorullalcrrloccououaooaorluorraclrcooouuolocoaolcocaaculruoocucoocoooauuolarcoraraocaoolulolarru ac oacolaarlruoacuroauurloraarucoooarcooauoolacalllaulrruarrrucruuooclacuoouccarrcoocloccorrrrarourcooalloocooccouruolaorlcaocualolc
|
||||
select vbcol from ibstd_14;
|
||||
vbcol
|
||||
11
|
||||
ac
|
||||
drop table ibstd_14;
|
||||
#
|
||||
# Bug#22018745 CORRUPTION IN ONLINE TABLE REBUILD
|
||||
# (ROW_FORMAT=REDUNDANT, INDEXED VIRTUAL COLUMN)
|
||||
#
|
||||
CREATE TABLE t (
|
||||
b char(5) PRIMARY KEY,
|
||||
v char(3) GENERATED ALWAYS AS (substr(b,1,3)) VIRTUAL, KEY(v)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT;
|
||||
connection con1;
|
||||
SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL prepared WAIT_FOR apply';
|
||||
OPTIMIZE TABLE t;
|
||||
connection default;
|
||||
SET DEBUG_SYNC='now WAIT_FOR prepared';
|
||||
INSERT INTO t SET b='fubar';
|
||||
BEGIN;
|
||||
DELETE FROM t;
|
||||
ROLLBACK;
|
||||
SET DEBUG_SYNC='now SIGNAL apply';
|
||||
connection con1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t optimize note Table does not support optimize, doing recreate + analyze instead
|
||||
test.t optimize status OK
|
||||
connection default;
|
||||
CHECK TABLE t;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t check status OK
|
||||
SELECT * FROM t;
|
||||
b v
|
||||
fubar fub
|
||||
DROP TABLE t;
|
||||
disconnect con1;
|
||||
SET DEBUG_SYNC = 'RESET';
|
||||
|
Reference in New Issue
Block a user