@@ -263,3 +263,120 @@ if (0)
263
263
DROP TABLE t1;
264
264
SET sql_mode = default;
265
265
}
266
+
267
+ --echo #
268
+ --echo # Bug #30556595 FAILING ASSERTION: !CURSOR->INDEX->IS_COMMITTED()
269
+ --echo # ON TABLE WITH GCOLS
270
+ --echo #
271
+
272
+ --echo # Testcase-1
273
+ CREATE TABLE t (pid int PRIMARY KEY,
274
+ uid int,
275
+ vid int AS (uid) VIRTUAL);
276
+ connect(con1,localhost,root,,);
277
+ --echo # Create index on virtual column and stop before applying row logs.
278
+ SET DEBUG_SYNC = 'row_log_apply_before SIGNAL start_dml WAIT_FOR resume_ddl';
279
+ --send ALTER TABLE t ADD INDEX idx_vid(vid), algorithm=inplace
280
+ connection default;
281
+ SET DEBUG_SYNC= 'now WAIT_FOR start_dml';
282
+ --echo # Insert a record to generate an insert row log for the new index.
283
+ --echo # LOG-1 idx_vid : INSERT [10, 1]
284
+ INSERT INTO t(pid, uid) VALUES (1,10);
285
+ --echo # Update the record changing PK. It should generate 2 row logs for the new index.
286
+ --echo # LOG-2 idx_vid : DELETE [10, 1]
287
+ --echo # LOG-3 idx_vid : INSERT [10, 2]
288
+ UPDATE t SET pid = 2 WHERE pid = 1;
289
+ SELECT * FROM t;
290
+ SET DEBUG_SYNC= 'now SIGNAL resume_ddl';
291
+ connection con1;
292
+ --reap
293
+ connection default;
294
+ --echo # Insert a record to re-use the delete marked record in idx_vid [10, 1]
295
+ INSERT INTO t(pid, uid) VALUES (1,10);
296
+ SELECT * FROM t;
297
+ disconnect con1;
298
+ DROP TABLE t;
299
+
300
+ --echo # Testcase-2
301
+ CREATE TABLE t (pid int PRIMARY KEY,
302
+ uid int,
303
+ vid int AS (uid) VIRTUAL);
304
+ connect(con1,localhost,root,,);
305
+ --echo # Create index on virtual column and stop before applying row logs.
306
+ SET DEBUG_SYNC = 'row_log_apply_before SIGNAL start_dml WAIT_FOR resume_ddl';
307
+ --send ALTER TABLE t ADD INDEX idx_vid(vid), algorithm=inplace
308
+ connection default;
309
+ SET DEBUG_SYNC= 'now WAIT_FOR start_dml';
310
+ --echo # Start transaction
311
+ BEGIN;
312
+ --echo # Insert a record to generate an insert row log for the new index.
313
+ --echo # LOG-1 idx_vid : INSERT [10, 1]
314
+ INSERT INTO t(pid, uid) VALUES (1,10);
315
+ --echo # Update the record changing PK. It should generate 2 row logs for the new index.
316
+ --echo # LOG-2 idx_vid : DELETE [10, 1]
317
+ --echo # LOG-3 idx_vid : INSERT [10, 2]
318
+ UPDATE t SET pid = 2 WHERE pid = 1;
319
+ SELECT * FROM t;
320
+ --echo # Rollback transaction
321
+ --echo # LOG-4 idx_vid : DELETE [10, 2]
322
+ --echo # LOG-5 idx_vid : INSERT [10, 1]
323
+ --echo # LOG-6 idx_vid : DELETE [10, 1]
324
+ ROLLBACK;
325
+ SET DEBUG_SYNC= 'now SIGNAL resume_ddl';
326
+ connection con1;
327
+ --reap
328
+ connection default;
329
+ --echo # Insert a record to check valid entry in idx_vid [NULL, 1]
330
+ INSERT INTO t(pid) VALUES (1);
331
+ SELECT * FROM t;
332
+ disconnect con1;
333
+ DROP TABLE t;
334
+
335
+ --echo # Testcase-3
336
+ CREATE TABLE t (pid int PRIMARY KEY,
337
+ uid int,
338
+ vid int AS (uid) VIRTUAL);
339
+ INSERT INTO t(pid, uid) VALUES (1,10);
340
+ connect(con1,localhost,root,,);
341
+ --echo # Create index on virtual column and stop before applying row logs.
342
+ SET DEBUG_SYNC = 'row_log_apply_before SIGNAL start_dml WAIT_FOR resume_ddl';
343
+ --send ALTER TABLE t ADD INDEX idx_vid(vid), algorithm=inplace
344
+ connection default;
345
+ SET DEBUG_SYNC= 'now WAIT_FOR start_dml';
346
+ --echo # Update the record changing PK. It should generate 2 row logs for the new index.
347
+ --echo # LOG-2 idx_vid : DELETE [10, 1]
348
+ --echo # LOG-3 idx_vid : INSERT [10, 2]
349
+ UPDATE t SET pid = 2 WHERE pid = 1;
350
+ SET DEBUG_SYNC= 'now SIGNAL resume_ddl';
351
+ connection con1;
352
+ --reap
353
+ connection default;
354
+ --echo # Read [2, 10, 10] row using idx_vid index key.
355
+ --sleep 1
356
+ select * from t where VID=10;
357
+ disconnect con1;
358
+ DROP TABLE t;
359
+
360
+ --echo # Testcase-4
361
+ CREATE TABLE t (pid int PRIMARY KEY,
362
+ uid int,
363
+ vid int AS (uid) VIRTUAL);
364
+ INSERT INTO t(pid, uid) VALUES (1,10);
365
+ connect(con1,localhost,root,,);
366
+ --echo # Create index on virtual column and stop before applying row logs.
367
+ SET DEBUG_SYNC = 'row_log_apply_before SIGNAL start_dml WAIT_FOR resume_ddl';
368
+ --send ALTER TABLE t ADD INDEX idx_vid(vid), algorithm=inplace
369
+ connection default;
370
+ SET DEBUG_SYNC= 'now WAIT_FOR start_dml';
371
+ --echo # Update the record changing PK. It should generate 2 row logs for the new index.
372
+ --echo # LOG-2 idx_vid : DELETE [10, 1]
373
+ --echo # LOG-3 idx_vid : INSERT [10, 2]
374
+ UPDATE t SET pid = 2 WHERE pid = 1;
375
+ SET DEBUG_SYNC= 'now SIGNAL resume_ddl';
376
+ connection con1;
377
+ --reap
378
+ connection default;
379
+ --echo # Delete a record.
380
+ delete from t limit 1;
381
+ disconnect con1;
382
+ DROP TABLE t;
0 commit comments