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
|
--source include/have_innodb.inc
--source include/count_sessions.inc
SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent;
SET GLOBAL innodb_stats_persistent = 0;
--echo #
--echo # Bug#21869656 UNDO LOG DOES NOT CONTAIN ENOUGH INFORMATION
--echo # ON INDEXED VIRTUAL COLUMNS
--echo #
CREATE TABLE t1 (a INT, b INT,
a1 INT GENERATED ALWAYS AS (a) VIRTUAL, INDEX(a1)
) ENGINE=InnoDB;
INSERT INTO t1 (a,b) VALUES(1,1);
connect (con1,localhost,root,,);
# disable purge
CREATE TABLE t0 (a INT) ENGINE=InnoDB;
BEGIN; SELECT * FROM t0;
connection default;
# write the problematic update_undo log record
UPDATE t1 SET a=0;
ALTER TABLE t1 DROP COLUMN a1, ALGORITHM=INPLACE;
ALTER TABLE t1 ADD COLUMN b1 INT GENERATED ALWAYS AS (b) VIRTUAL, ADD
INDEX(b1),
ALGORITHM=INPLACE;
connection con1;
# enable purge
COMMIT;
UPDATE t1 SET a=1;
connection default;
--source ../../innodb/include/wait_all_purged.inc
CHECK TABLE t1 EXTENDED;
SELECT b1 FROM t1;
# Create multi-virtual column, more ADD/DROP to test it
ALTER TABLE t1
ADD COLUMN a1 INT GENERATED ALWAYS AS (a) VIRTUAL,
ADD COLUMN a2 INT GENERATED ALWAYS AS (a + b) VIRTUAL,
ADD COLUMN a3 INT GENERATED ALWAYS AS (a - b) VIRTUAL,
ADD COLUMN a4 INT GENERATED ALWAYS AS (a - b) VIRTUAL,
ADD INDEX(a1), ADD INDEX(a2), ADD INDEX(a3), ALGORITHM=INPLACE;
CREATE TABLE t2 (
a BLOB,
b BLOB,
c BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
h VARCHAR(10) DEFAULT NULL
) ENGINE=InnoDB;
INSERT INTO t2 VALUES (REPEAT('g', 16000), REPEAT('x', 16000), DEFAULT, 'kk');
INSERT INTO t2 VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, 'mm');
CREATE INDEX idx ON t2(c(100));
INSERT INTO t1 (a, b) VALUES(1,1);
connection con1;
# disable purge
BEGIN; SELECT * FROM t0;
connection default;
--enable_info
# write the problematic update_undo log record
UPDATE t1 SET a=0;
UPDATE t1 SET b=0;
ALTER TABLE t1 DROP COLUMN a3, ALGORITHM=INPLACE;
UPDATE t1 SET a=2;
ALTER TABLE t1 DROP COLUMN a2, ALGORITHM=INPLACE;
UPDATE t1 SET b=3;
ALTER TABLE t1 ADD COLUMN b2 INT GENERATED ALWAYS AS (b) VIRTUAL,
ADD INDEX(b2), ALGORITHM=INPLACE;
UPDATE t1 SET b=9;
ALTER TABLE t1 ADD COLUMN b3 INT GENERATED ALWAYS AS (a) VIRTUAL,
ADD INDEX(b3), ALGORITHM=INPLACE;
UPDATE t1 SET b=10;
ALTER TABLE t2 DROP COLUMN c;
UPDATE t2 SET a = REPEAT('s', 6000) WHERE a like 'aaa%';
ALTER TABLE t2 ADD COLUMN x1 BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
ADD COLUMN x2 BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
ADD INDEX(x1(100), x2(120)), ADD INDEX (x1(20));
UPDATE t1 SET a=5;
UPDATE t2 SET a = REPEAT('m', 16000) WHERE a like 'sss%';
ALTER TABLE t1 DROP COLUMN b2, ALGORITHM=INPLACE;
UPDATE t1 SET a=6;
ALTER TABLE t2 DROP COLUMN x1, DROP COLUMN x2, ALGORITHM=INPLACE;
UPDATE t2 SET a = REPEAT('x', 1000) WHERE a like 'mmm%';
ALTER TABLE t1 DROP INDEX b3;
UPDATE t1 SET a=100;
--disable_info
connection con1;
# enable purge
COMMIT;
disconnect con1;
connection default;
--source ../../innodb/include/wait_all_purged.inc
CHECK TABLE t1 EXTENDED;
SELECT b1 FROM t1;
SELECT * FROM t1;
CHECK TABLE t2 EXTENDED;
DROP TABLE t2, t1, t0;
CREATE TABLE t1 (a VARCHAR(30), b INT, a2 VARCHAR(30) GENERATED ALWAYS AS (a) VIRTUAL);
--error ER_DUP_FIELDNAME
CREATE INDEX idx ON t1(a2(10), b, a2(20));
DROP TABLE t1;
--echo #
--echo # MDEV-17540 Server crashes in row_purge after TRUNCATE TABLE
--echo #
# Note: this test case is nondeterministic and should depend on
# MDEV-12288 to trigger the needed purge activity.
# The test does not seem to repeat the bug on MariaDB 10.2.
CREATE TABLE t1 (a BIT(14)) ENGINE=InnoDB;
INSERT INTO t1 VALUES
(b'01110110101011'),(b'01100111111000'),(b'00001011110100'),
(b'01110110111010'),(b'10001010101011'),(b'01100111001111');
CREATE TABLE t2 (
pk INT DEFAULT 1,
b YEAR,
c BIT(14),
d YEAR AS (b),
e BIT(14) AS (c),
UNIQUE(pk),
KEY(e)
) ENGINE=InnoDB;
# Run a few times in order to improve the chances of triggering the bug.
--disable_query_log
let $n=10;
while ($n) {
REPLACE INTO t2 (c) SELECT a FROM t1;
TRUNCATE TABLE t2;
dec $n;
}
--enable_query_log
DROP TABLE t1, t2;
--echo #
--echo # MDEV-30024 InnoDB: tried to purge non-delete-marked record
--echo # of an index on a virtual column prefix
--echo #
CREATE TABLE t(a BINARY(8), b CHAR(8) AS (a) VIRTUAL, KEY(b(4)))
CHARACTER SET utf8 ENGINE=InnoDB;
INSERT INTO t (a) VALUES (''),('');
UPDATE t SET a = 'x';
UPDATE t SET a = '';
SET GLOBAL innodb_max_purge_lag_wait=0;
CHECK TABLE t EXTENDED;
DROP TABLE t;
SET GLOBAL innodb_stats_persistent = @save_stats_persistent;
--source include/wait_until_count_sessions.inc
|