[MDEV-17548] Incorrect access to off-page column for indexed virtual column Created: 2018-10-25  Updated: 2018-10-25  Resolved: 2018-10-25

Status: Closed
Project: MariaDB Server
Component/s: Storage Engine - InnoDB
Affects Version/s: 10.2.2, 10.3.0
Fix Version/s: 10.3.11, 10.2.19

Type: Bug Priority: Blocker
Reporter: Marko Mäkelä Assignee: Marko Mäkelä
Resolution: Fixed Votes: 0
Labels: upstream

Issue Links:
Blocks
blocks MDEV-17536 Merge new release of InnoDB 5.7.24 to... Closed
Relates
relates to MDEV-14134 gcol.innodb_virtual_debug sporadicall... Closed
relates to MDEV-16222 Assertion `0' failed in row_purge_rem... Closed

 Description   

The function row_build_index_entry_low() is attempting to fetch the value of a virtual TEXT column from a cache of stored off-page column prefixes, causing a failure.

Bug #27968952 INNODB CRASH/CORRUPTION WITH TEXT PREFIX INDEXES in MySQL 5.7.24 addresses this.

Here is a little clearer and somewhat extended test case:

CREATE TABLE t1(
  a INT NOT NULL UNIQUE,
  b INT NOT NULL,
  c TEXT GENERATED ALWAYS AS (a <> b) VIRTUAL,
  d TEXT NOT NULL,
  UNIQUE KEY (c(1)), KEY(d(1))
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
SET @t = REPEAT('t',@@innodb_page_size);
INSERT INTO t1 (a,b,d) VALUES (1,0,@t), (0,0,@t);
--error ER_DUP_ENTRY
UPDATE t1 SET b = a;
REPLACE INTO t1 SET a = 0, b = 1, d = 'd';
SELECT * FROM t1;
CHECK TABLE t1;
DROP TABLE t1;
 
CREATE TABLE t1(
  a VARCHAR(1000) GENERATED ALWAYS AS ('1') VIRTUAL,
  b VARCHAR(1000) NOT NULL,
  c VARCHAR(1000) GENERATED ALWAYS AS (b) STORED,
  KEY (b(1)),
  KEY (a(1))
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1;
INSERT INTO t1(b) VALUES(REPEAT('b',1000));
DELETE FROM t1;
DROP TABLE t1;

10.2 a21e01a53d309c4c949d41f85a43211008bac1fc

mysqltest: At line …: query 'UPDATE t1 SET b = a' failed with wrong errno 2013: 'Lost connection to MySQL server during query', instead of 1062...
Version: '10.2.19-MariaDB-debug-log'  socket: '/dev/shm/10.2/mysql-test/var/tmp/mysqld.1.sock'  port: 16000  Source distribution
2018-10-25 16:57:29 140274706073344 [ERROR] InnoDB: Record in index `c` of table `test`.`t1` was not found on update: TUPLE (info_bits=0, 2 fields): {[1]t(0x74),[4]    (0x80000001)} at: COMPACT RECORD(info_bits=0, 2 fields): {[1]1(0x31),[4]    (0x80000001)}
mysqld: /mariadb/10.2m/storage/innobase/row/row0upd.cc:2436: dberr_t row_upd_sec_index_entry(upd_node_t*, que_thr_t*): Assertion `0' failed.


Generated at Thu Feb 08 08:37:18 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.