Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-17548

Incorrect access to off-page column for indexed virtual column

    XMLWordPrintable

    Details

      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.
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                marko Marko Mäkelä
                Reporter:
                marko Marko Mäkelä
              • Votes:
                0 Vote for this issue
                Watchers:
                1 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: