[MDEV-17834] Server crashes in row_upd_build_difference_binary on LOAD DATA into table with indexed virtual column Created: 2018-11-26  Updated: 2021-06-28  Resolved: 2021-06-28

Status: Closed
Project: MariaDB Server
Component/s: Storage Engine - InnoDB, Virtual Columns
Affects Version/s: 10.2, 10.3, 10.4
Fix Version/s: 10.4.2, 10.2.22, 10.3.13

Type: Bug Priority: Major
Reporter: Elena Stepanova Assignee: Nikita Malyavin
Resolution: Done Votes: 0
Labels: None

Issue Links:
Duplicate
duplicates MDEV-20618 Assertion `btr_validate_index(index, ... Closed
Relates
relates to MDEV-18486 Database crash on a table with indexe... Closed
relates to MDEV-5800 indexes on virtual (not materialized)... Closed

 Description   

--source include/have_innodb.inc
 
CREATE TABLE t1 ( 
  pk INT,
  i TINYINT,
  ts TIMESTAMP NULL,
  vi TINYINT AS (i+1) PERSISTENT,
  vts TIMESTAMP(5) AS (ts) VIRTUAL,
  PRIMARY KEY(pk),
  UNIQUE(vts)
) ENGINE=InnoDB
;
INSERT IGNORE INTO t1 (pk,i) VALUES (1,127);
 
--write_file $MYSQLTEST_VARDIR/tmp/load.data
1	4	2019-01-01 00:00:00
EOF
eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/load.data' REPLACE INTO TABLE t1 (pk,i,ts);
 
# Cleanup
DROP TABLE t1;
--remove_file $MYSQLTEST_VARDIR/tmp/load.data

10.2 3728b11f8

#3  <signal handler called>
#4  0x000055934f4153ac in row_upd_build_difference_binary (index=0x7f277806b2b8, entry=0x7f2778099f68, rec=0x7f27ca00007e "\200", offsets=0x7f27c07f4460, no_sys=true, trx=0x7f27ca333148, heap=0x7f277800b5d0, mysql_table=0x7f277800aa50) at /data/src/10.2/storage/innobase/row/row0upd.cc:1165
#5  0x000055934f39a3ce in row_ins_clust_index_entry_by_modify (pcur=0x7f27c07f4910, flags=0, mode=2, offsets=0x7f27c07f48b0, offsets_heap=0x7f27c07f48a8, heap=0x7f277800b5d0, entry=0x7f2778099f68, thr=0x7f277808c568, mtr=0x7f27c07f4d30) at /data/src/10.2/storage/innobase/row/row0ins.cc:352
#6  0x000055934f39fb06 in row_ins_clust_index_entry_low (flags=0, mode=2, index=0x7f277806b2b8, n_uniq=1, entry=0x7f2778099f68, n_ext=0, thr=0x7f277808c568, dup_chk_only=false) at /data/src/10.2/storage/innobase/row/row0ins.cc:2650
#7  0x000055934f3a125b in row_ins_clust_index_entry (index=0x7f277806b2b8, entry=0x7f2778099f68, thr=0x7f277808c568, n_ext=0, dup_chk_only=false) at /data/src/10.2/storage/innobase/row/row0ins.cc:3170
#8  0x000055934f3a1673 in row_ins_index_entry (index=0x7f277806b2b8, entry=0x7f2778099f68, thr=0x7f277808c568) at /data/src/10.2/storage/innobase/row/row0ins.cc:3292
#9  0x000055934f3a1b7b in row_ins_index_entry_step (node=0x7f277808c298, thr=0x7f277808c568) at /data/src/10.2/storage/innobase/row/row0ins.cc:3442
#10 0x000055934f3a1f6e in row_ins (node=0x7f277808c298, thr=0x7f277808c568) at /data/src/10.2/storage/innobase/row/row0ins.cc:3585
#11 0x000055934f3a2547 in row_ins_step (thr=0x7f277808c568) at /data/src/10.2/storage/innobase/row/row0ins.cc:3811
#12 0x000055934f3bfa3d in row_insert_for_mysql (mysql_rec=0x7f277806abd0 "\341\001", prebuilt=0x7f277808bcb8) at /data/src/10.2/storage/innobase/row/row0mysql.cc:1413
#13 0x000055934f284640 in ha_innobase::write_row (this=0x7f277806c958, record=0x7f277806abd0 "\341\001") at /data/src/10.2/storage/innobase/handler/ha_innodb.cc:8207
#14 0x000055934ef7a567 in handler::ha_write_row (this=0x7f277806c958, buf=0x7f277806abd0 "\341\001") at /data/src/10.2/sql/handler.cc:5961
#15 0x000055934eccffc6 in write_record (thd=0x7f2778000b00, table=0x7f277800aa50, info=0x7f27c07f6040) at /data/src/10.2/sql/sql_insert.cc:1655
#16 0x000055934f1153e4 in read_sep_field (thd=0x7f2778000b00, info=..., table_list=0x7f2778012630, fields_vars=..., set_fields=..., set_values=..., read_info=..., enclosed=..., skip_lines=0, ignore_check_option_errors=false) at /data/src/10.2/sql/sql_load.cc:1256
#17 0x000055934f11357c in mysql_load (thd=0x7f2778000b00, ex=0x7f27780125a8, table_list=0x7f2778012630, fields_vars=..., set_fields=..., set_values=..., handle_duplicates=DUP_REPLACE, ignore=false, read_file_from_client=false) at /data/src/10.2/sql/sql_load.cc:649
#18 0x000055934ecf6dfc in mysql_execute_command (thd=0x7f2778000b00) at /data/src/10.2/sql/sql_parse.cc:4834
#19 0x000055934ed00b5d in mysql_parse (thd=0x7f2778000b00, rawbuf=0x7f2778012448 "LOAD DATA INFILE '/data/bld/10.2/mysql-test/var/tmp/load.data' REPLACE INTO TABLE t1 (pk,i,ts)", length=94, parser_state=0x7f27c07f7200, is_com_multi=false, is_next_command=false) at /data/src/10.2/sql/sql_parse.cc:8013
#20 0x000055934ecee495 in dispatch_command (command=COM_QUERY, thd=0x7f2778000b00, packet=0x7f2778095ec1 "LOAD DATA INFILE '/data/bld/10.2/mysql-test/var/tmp/load.data' REPLACE INTO TABLE t1 (pk,i,ts)", packet_length=94, is_com_multi=false, is_next_command=false) at /data/src/10.2/sql/sql_parse.cc:1824
#21 0x000055934ececdf8 in do_command (thd=0x7f2778000b00) at /data/src/10.2/sql/sql_parse.cc:1378
#22 0x000055934ee3f537 in do_handle_one_connection (connect=0x559351530ea0) at /data/src/10.2/sql/sql_connect.cc:1335
#23 0x000055934ee3f2c4 in handle_one_connection (arg=0x559351530ea0) at /data/src/10.2/sql/sql_connect.cc:1241
#24 0x000055934f264f46 in pfs_spawn_thread (arg=0x55935147c350) at /data/src/10.2/storage/perfschema/pfs.cc:1862
#25 0x00007f27d1e7d494 in start_thread (arg=0x7f27c07f8700) at pthread_create.c:333
#26 0x00007f27d047e93f in clone () from /lib/x86_64-linux-gnu/libc.so.6

Crashes on debug and non-debug builds. ASAN also ends with SEGV.

Not reproducible on 10.1.

There is some resemblance of the test case with MDEV-17837, might be related.



 Comments   
Comment by Marko Mäkelä [ 2018-11-26 ]

The problem is that we have vfield=NULL here, for the value of the indexed virtual column vts:

			dfield_t*	vfield = innobase_get_computed_value(
				update->old_vrow, col, index,
				&v_heap, heap, NULL, thd, mysql_table, record,
				NULL, NULL, NULL);
 
			if (!dfield_data_is_binary_equal(
				dfield, vfield->len,

Maybe the evaluation fails because of the old value ts=NULL? With normal REPLACE or explicit DELETE followed by INSERT, there is no failure:

--source include/have_innodb.inc
CREATE TABLE t1 (
  pk INT PRIMARY KEY,
  i TINYINT,
  ts TIMESTAMP NULL,
  vi TINYINT AS (i+1) PERSISTENT,
  vts TIMESTAMP(5) AS (ts) VIRTUAL,
  UNIQUE(vts)
) ENGINE=InnoDB;
INSERT INTO t1 SET pk=1;
BEGIN;
DELETE FROM t1;
INSERT INTO t1 SET pk=1, ts=now();
COMMIT;
DROP TABLE t1;

Comment by Nikita Malyavin [ 2021-06-28 ]

Fixed by:

commit aa8a31dadd21ada93bc3c739de866c78614e746a
Author: Aditya A <aditya.a@oracle.com>
Date:   Wed Oct 10 18:05:02 2018 +0530
 
    Bug #22990029 GCOLS: INCORRECT BEHAVIOR AFTER DATA INSERTED WITH IGNORE KEYWORD

During MDEV-18338:

commit 3dac4e9f0e2c51afbc2007a9b1b6be92a4e71fd1
Merge: 9a7281a7039 d283f80eae4
Author: Marko Mäkelä <marko.makela@mariadb.com>
Date:   Wed Jan 23 19:48:19 2019 +0200
 
    MDEV-18338 Merge new release of InnoDB 5.7.25 to 10.2

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