summaryrefslogtreecommitdiff
path: root/mysql-test/suite/gcol/t/innodb_virtual_debug.test
blob: cd2b860400ce4f2346222583a36d05ebb808fe10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
--source include/have_innodb.inc
--source include/have_debug_sync.inc
--source include/have_debug.inc
--source include/count_sessions.inc

set default_storage_engine=innodb;
CREATE TABLE `t` (
  `a` VARCHAR(100),
  `b` VARCHAR(100),
  `c` VARCHAR(200) GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
  `h` VARCHAR(10) DEFAULT NULL,
  `i` int
) ENGINE=InnoDB;

INSERT INTO t VALUES (REPEAT('g', 100), REPEAT('x', 10), DEFAULT, "kk", 1);
INSERT INTO t VALUES (REPEAT('a', 100), REPEAT('b', 100), DEFAULT, "mm", 2);

CREATE INDEX idx ON t(c(100));

SET session debug_dbug="+d,ib_alter_add_virtual_fail";
--error ER_WRONG_KEY_COLUMN
ALTER TABLE t ADD COLUMN x VARCHAR(200) GENERATED ALWAYS AS (a) VIRTUAL,
ALGORITHM = INPLACE;
--error ER_WRONG_KEY_COLUMN
ALTER TABLE t DROP COLUMN c, ALGORITHM = INPLACE;
SET session debug_dbug="";
DROP TABLE t;

#online test
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, "mx");

SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
--send CREATE INDEX idx ON t(c)

connect (con1,localhost,root,,);

SET DEBUG_SYNC = 'now WAIT_FOR start_create';
update t set a=0 where a = 11;
start transaction;
update t set a=1 where a = 0;
ROLLBACK;
SET DEBUG_SYNC = 'now SIGNAL go_ahead';

connection default;
reap;

SELECT c FROM t;
SHOW CREATE TABLE t;
SELECT * FROM t;

--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE t FORCE, LOCK=NONE;
if (0) {# MDEV-14341 TODO: re-enable this
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
--send ALTER TABLE t FORCE

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;
reap;

check table t;
SELECT c FROM t;

SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
--send ALTER TABLE t FORCE

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;
reap;

SELECT c FROM t;
}

disconnect con1;
DROP TABLE t;

SET DEBUG_SYNC = 'RESET';


# Test add virtual column and add index at the same time
# introduce some error

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_1 on t(c);

SET @saved_dbug = @@SESSION.debug_dbug;
SET debug_dbug = '+d,create_index_fail';

--enable_info
--error ER_DUP_ENTRY
ALTER TABLE t ADD COLUMN x INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (x),
ADD INDEX idcx (c,x);

UPDATE t SET a=a+1;

--error ER_DUP_ENTRY
ALTER TABLE t ADD INDEX idc(c);
SET debug_dbug = @saved_dbug;
--disable_info

UPDATE t SET b=b-1;

SHOW CREATE TABLE t;

SELECT c FROM t;

DROP TABLE t;

if (0) {# MDEV-14341 TODO: re-enable LOCK=NONE and these tests
--echo #
--echo # Bug#22018532 ASSERTION WHEN ONLINE REAPPLY REBUILD LOG ON
--echo # MULTIPLE INDEXED VIRTUAL COLUMNS
--echo #

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';
--send optimize table t

connect (con1,localhost,root,,);

SET DEBUG_SYNC = 'now WAIT_FOR start_create';
insert ignore into t values();
SET DEBUG_SYNC = 'now SIGNAL go_ahead';

connection default;
--echo /* connection default */ optimize table t;
reap;
SELECT c FROM t;
SHOW CREATE TABLE t;
SELECT * FROM t;
DROP TABLE t;

# Do another test without duplicate error

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';
--send 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;
--echo /* connection default */ optimize table t;
reap;

SELECT c FROM t;

disconnect con1;

DROP TABLE t;

--echo #
--echo #  Bug#22951879 - ASSERTS RELATED TO ONLINE DDL AND GCOL
--echo #

# Create a table with 2 virtual column, one (vbidxcol) is indexed and
# the other one (vbcol) is not
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;

# Do an alter table rebuild table and also create a new index on this
# non-indexed virtual column
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
--send alter table ibstd_14  row_format=compressed key_block_size=4,add  key kn3 (d,c,vbcol,b)

# Do a concurrent insert, and make sure this newly indexed virtual column
# is also logged
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);

# Also do an concurrent update, make sure this is performed
update ibstd_14 set b='11111' where b='aaaa';

SET DEBUG_SYNC = 'now SIGNAL go_ahead';

connection default;
reap;

select * from ibstd_14;

# This will use the newly added "kn3" index, to check materialized vbcol
# after log reapply
select d,c,vbcol,b from  ibstd_14;

# check the value is inserted into the index
select vbcol from ibstd_14;

drop table ibstd_14;

--echo #
--echo # Bug#22018745 CORRUPTION IN ONLINE TABLE REBUILD
--echo # (ROW_FORMAT=REDUNDANT, INDEXED VIRTUAL COLUMN)
--echo #

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';
--send 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;
reap;

connection default;
CHECK TABLE t;
SELECT * FROM t;
DROP TABLE t;

disconnect con1;
}
SET DEBUG_SYNC = 'RESET';


--echo #
--echo # Bug#28825718 - ASSERTION FAILURE: TRX0REC.CC:NNN:N_IDX > 0 WHILE DOING REPLACE/INSERT
--echo #

CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT GENERATED ALWAYS AS(b+1) VIRTUAL) ENGINE=InnoDB;

INSERT INTO t1(a, b) VALUES(1, 1);

connect (con1,localhost,root,,);
SET DEBUG_SYNC = 'row_log_apply_after SIGNAL s1 WAIT_FOR s2';
SET lock_wait_timeout = 1;
--send ALTER TABLE t1 ADD UNIQUE INDEX(c, b)

connection default;
SET DEBUG_SYNC = 'now WAIT_FOR s1';
SET DEBUG_SYNC = 'row_log_insert_handle SIGNAL s2 WAIT_FOR s3';
--send INSERT INTO t1(a, b) VALUES(2, 2)

connection con1;
--error ER_LOCK_WAIT_TIMEOUT
reap;
SET DEBUG_SYNC = 'now SIGNAL s3';
disconnect con1;
connection default;
reap;
SET DEBUG_SYNC = 'RESET';
ALTER TABLE t1 ADD KEY(b);
INSERT INTO t1(a, b) VALUES(3, 3);
SELECT * FROM t1;
CHECK TABLE t1;
DROP TABLE t1;

--echo #
--echo # MDEV-28806 Assertion `flag == 1' failure in
--echo # row_build_index_entry_low upon concurrent ALTER and UPDATE
--echo #

CREATE TABLE t1(a CHAR(8), b INT, c INT AS (b), KEY(a)) ENGINE=InnoDB;
INSERT INTO t1(b) VALUES (1),(2);

--connect (con1,localhost,root,,test)
SET DEBUG_SYNC="alter_table_inplace_before_lock_upgrade SIGNAL dml_start WAIT_FOR dml_commit";
send ALTER TABLE t1 ADD KEY ind (c);

--connection default
SET DEBUG_SYNC="now WAIT_FOR dml_start";
UPDATE t1 SET a ='foo';
SET DEBUG_SYNC="now SIGNAL dml_commit";

# Cleanup
--connection con1
--reap
CHECK TABLE t1;
DROP TABLE t1;
--disconnect con1
connection default;
SET DEBUG_SYNC=RESET;

--source include/wait_until_count_sessions.inc