mariadb/mysql-test/suite/gcol/t/gcol_rollback.test
Thirunarayanan Balathandayuthapani 81faf41786 MDEV-30597 Assertion `flag == 1' failed in row_build_index_entry_low
- InnoDB tries to build the previous version of the record for
the virtual index, but the undo log record doesn't contain
virtual column information. This leads to assert failure while
building the tuple.
2023-02-14 14:28:27 +05:30

136 lines
2.9 KiB
Text

--source include/have_debug.inc
--source include/have_innodb.inc
--source include/have_debug_sync.inc
--source include/not_embedded.inc
# Save the initial number of concurrent sessions.
--source include/count_sessions.inc
# Make sure there are no unexpected open tables from previous tests
--disable_query_log
FLUSH TABLES;
--enable_query_log
CREATE TABLE t (
a INTEGER,
b BLOB GENERATED ALWAYS AS (a) VIRTUAL,
INDEX (b(57))
)ENGINE=INNODB;
INSERT INTO t (a) VALUES (9);
BEGIN;
SAVEPOINT a;
UPDATE t set a = 12;
DELETE FROM t where a = 12;
ROLLBACK TO SAVEPOINT a;
COMMIT;
CHECK TABLE t;
SELECT * FROM t;
BEGIN;
INSERT INTO t (a) VALUES (10);
--let $shutdown_timeout= 0
--source include/restart_mysqld.inc
SELECT * FROM t;
DROP TABLE t;
CREATE TABLE t (
a INTEGER,
b BLOB GENERATED ALWAYS AS (a) VIRTUAL,
c INTEGER
)ENGINE=INNODB;
INSERT INTO t (a,c) VALUES (9, 10);
SELECT * FROM t;
connect (con1,localhost,root,,);
connection con1;
# This DEBUG_SYNC should not kick in yet, because the duplicate key will be
# detected before we get a chance to apply the online log.
SET DEBUG_SYNC = 'row_log_apply_after SIGNAL created WAIT_FOR dml_done';
--send
ALTER TABLE t ADD KEY(b(57)), ALGORITHM=INPLACE;
connection default;
SET DEBUG_SYNC = 'now WAIT_FOR created';
BEGIN;
INSERT INTO t (a,c) VALUES (10, 12);
SELECT * FROM t;
ROLLBACK;
SET DEBUG_SYNC = 'now SIGNAL dml_done';
connection con1;
reap;
disconnect con1;
connection default;
SELECT * FROM t;
DROP TABLE t;
# drop virtual column and alter index
CREATE TABLE t (
a INT,
b INT,
c INT GENERATED ALWAYS AS(a+b),
d INT GENERATED ALWAYS AS(a+b+b),
KEY(c, d)
)ENGINE=INNODB;
INSERT INTO t (a,b) VALUES (9, 10);
SELECT * FROM t;
connect (con1,localhost,root,,);
connection con1;
# This DEBUG_SYNC should not kick in yet, because the duplicate key will be
# detected before we get a chance to apply the online log.
SET DEBUG_SYNC = 'row_log_apply_after SIGNAL created WAIT_FOR dml_done';
--send
ALTER TABLE t DROP COLUMN c, ALGORITHM=INPLACE;
connection default;
SET DEBUG_SYNC = 'now WAIT_FOR created';
BEGIN;
INSERT INTO t (a,b) VALUES (10, 12);
SELECT * FROM t;
ROLLBACK;
SET DEBUG_SYNC = 'now SIGNAL dml_done';
connection con1;
reap;
connection default;
SELECT * FROM t;
DROP TABLE t;
SET DEBUG_SYNC = 'RESET';
--echo #
--echo # MDEV-30597 Assertion `flag == 1' failed in
--echo # row_build_index_entry_low
--echo #
CREATE TABLE t1 (
col1 INT PRIMARY KEY, col_text TEXT,
col_text_g TEXT GENERATED ALWAYS AS (SUBSTR(col_text,1,499))
) ENGINE = InnoDB ROW_FORMAT = Compact;
connection con1;
START TRANSACTION WITH CONSISTENT SNAPSHOT;
connection default;
INSERT INTO t1 (col1) VALUES (1) ;
DELETE FROM t1 WHERE col1 = 1;
ALTER TABLE t1 ADD UNIQUE INDEX (col_text_g(9));
BEGIN;
INSERT INTO t1 (col1) VALUES (1);
ROLLBACK;
disconnect con1;
DROP TABLE t1;
# Wait till all disconnects are completed
--source include/wait_until_count_sessions.inc
--echo # End of 10.4 tests