[MDEV-15950] LOAD DATA INTO compex_view crashed Created: 2018-04-20  Updated: 2019-01-30  Resolved: 2019-01-30

Status: Closed
Project: MariaDB Server
Component/s: Views
Affects Version/s: 10.0, 10.1, 5.5.59, 10.3.6, 10.2
Fix Version/s: 10.4.3, 10.1.38, 5.5.63, 10.0.38, 10.2.22, 10.3.13

Type: Bug Priority: Major
Reporter: Eugene Kosov (Inactive) Assignee: Varun Gupta (Inactive)
Resolution: Fixed Votes: 0
Labels: None

Issue Links:
Blocks
blocks MDEV-15645 Assertion `table->insert_values' fail... Closed

 Description   

CREATE OR REPLACE TABLE t1 (a INT, b INT, PRIMARY KEY (a), UNIQUE(b));
INSERT INTO t1 VALUES (1,1);
CREATE OR REPLACE TABLE t2 (c INT);
CREATE OR REPLACE VIEW v AS SELECT t1.* FROM t1 JOIN t2;
SELECT a, b FROM t1 INTO OUTFILE '15645.data';
LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b);
LOAD DATA INFILE '15645.data' REPLACE INTO TABLE v (a,b);

(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at raise.c:51
#1  __GI_abort () at abort.c:90
#2  __assert_fail_base (fmt=<optimized out>, assertion=assertion@entry=0x1633a98 "table", file=file@entry=0x14ac53f "/work/mariadb/sql/sql_base.cc", line=line@entry=1010, function=function@entry=0x14ae051 "TABLE_LIST *find_dup_table(THD *, TABLE_LIST *, TABLE_LIST *, bool)") at assert.c:92
#3  __GI___assert_fail (assertion=0x1633a98 "table", file=0x14ac53f "/work/mariadb/sql/sql_base.cc", line=1010, function=0x14ae051 "TABLE_LIST *find_dup_table(THD *, TABLE_LIST *, TABLE_LIST *, bool)") at assert.c:101
#4  find_dup_table (thd=0x7fffa0000ce8, table=0x0, table_list=0x7fffa0016d18, check_alias=false) at sql_base.cc:1010
#5  unique_table (thd=0x7fffa0000ce8, table=0x7fffa0014138, table_list=0x7fffa0016d18, check_alias=false) at sql_base.cc:1139
#6  mysql_load (thd=0x7fffa0000ce8, ex=0x7fffa00140b0, table_list=0x7fffa0014138, fields_vars=List<Item> with 2 elements, set_fields=List<Item> with 0 elements, set_values=List<Item> with 0 elements, handle_duplicates=DUP_ERROR, ignore=true, read_file_from_client=false) at sql_load.cc:421
#7  mysql_execute_command (thd=0x7fffa0000ce8) at sql_parse.cc:5122
#8  mysql_parse (thd=0x7fffa0000ce8, rawbuf=0x7fffa0013fc0 "LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b)", length=55, parser_state=0x7fffedca0400, is_com_multi=false, is_next_command=false) at sql_parse.cc:8001
#9  dispatch_command (command=COM_QUERY, thd=0x7fffa0000ce8, packet=0x7fffa000ab19 "LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b)", packet_length=55, is_com_multi=false, is_next_command=false) at sql_parse.cc:1845
#10 do_command (thd=0x7fffa0000ce8) at sql_parse.cc:1390
#11 do_handle_one_connection (connect=0x2c96bb8) at sql_connect.cc:1402
#12 handle_one_connection (arg=0x2c96bb8) at sql_connect.cc:1308
#13 pfs_spawn_thread (arg=0x2ca3858) at pfs.cc:1862
#14 start_thread (arg=0x7fffedca1700) at pthread_create.c:465
#15 clone () at clone.S:95



 Comments   
Comment by Eugene Kosov (Inactive) [ 2018-04-20 ]

In 5.5 crash looks like this:

CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a), UNIQUE(b));
INSERT INTO t1 VALUES (1,1);
CREATE TABLE t2 (c INT);
CREATE VIEW v AS SELECT t1.* FROM t1 JOIN t2;
SELECT a, b FROM t1 INTO OUTFILE '15645.data';
LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b);
LOAD DATA INFILE '15645.data' REPLACE INTO TABLE v (a,b);

Thread 18 "mysqld" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff7f7b700 (LWP 31005)]
0x00000000005e4be8 in handler::increment_statistics (this=0x7fffe6451818, offset=&system_status_var::ha_write_count) at sql_class.h:4230
4230      status_var_increment(table->in_use->status_var.*offset);
(gdb) bt
#0  handler::increment_statistics (this=0x7fffe6451818, offset=&system_status_var::ha_write_count) at sql_class.h:4230
#1  handler::ha_write_row (this=0x7fffe6451818, buf=0x7fffe6467548 "\377") at handler.cc:5202
#2  write_record (thd=0x7ffff17e8000, table=0x7fffe64fb018, info=0x7ffff7f783e8) at sql_insert.cc:1844
#3  read_sep_field (thd=0x7ffff17e8000, info=..., table_list=0x7fffe658a190, fields_vars=List<Item> with 2 elements, set_fields=List<Item> with 0 elements, set_values=List<Item> with 0 elements, read_info=..., enclosed=String 0xec69e8 "" length 0, skip_lines=0, ignore_check_option_errors=true) at sql_load.cc:1125
#4  mysql_load (thd=0x7ffff17e8000, ex=0x7fffe658a108, table_list=0x7fffe658a190, fields_vars=List<Item> with 2 elements, set_fields=List<Item> with 0 elements, set_values=List<Item> with 0 elements, handle_duplicates=DUP_ERROR, ignore=true, read_file_from_client=false) at sql_load.cc:520
#5  mysql_execute_command (thd=0x7ffff17e8000) at sql_parse.cc:3233
#6  mysql_parse (thd=0x7ffff17e8000, rawbuf=0x7fffe658a018 "LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b)", length=55, parser_state=0x7ffff7f7a7c8) at sql_parse.cc:5923
#7  dispatch_command (command=COM_QUERY, thd=0x7ffff17e8000, packet=0x7ffff17f8001 "LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b)", packet_length=55) at sql_parse.cc:1066
#8  do_command (thd=0x7ffff17e8000) at sql_parse.cc:793
#9  do_handle_one_connection (thd_arg=0x7ffff17e8000) at sql_connect.cc:1268
#10 handle_one_connection (arg=0x7ffff17e8000) at sql_connect.cc:1184
#11 pfs_spawn_thread (arg=0x7ffff2bff250) at pfs.cc:1015
#12 start_thread (arg=0x7ffff7f7b700) at pthread_create.c:465
#13 clone () at clone.S:95
 
(gdb) p table
$1 = (TABLE *) 0x0

Comment by Elena Stepanova [ 2018-05-24 ]

Adding assertion failure and stack traces to make it somewhat more searchable in JIRA

10.3 15425767e debug

mysqld: /data/src/10.3/sql/sql_base.cc:1010: TABLE_LIST* find_dup_table(THD*, TABLE_LIST*, TABLE_LIST*, bool): Assertion `table' failed.
180524 13:50:22 [ERROR] mysqld got signal 6 ;
 
#6  0x00007f3095f44266 in __assert_fail_base (fmt=0x7f309607cf18 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x7f30991ec68e "table", file=file@entry=0x7f30991ec280 "/data/src/10.3/sql/sql_base.cc", line=line@entry=1010, function=function@entry=0x7f30991edfc0 <find_dup_table(THD*, TABLE_LIST*, TABLE_LIST*, bool)::__PRETTY_FUNCTION__> "TABLE_LIST* find_dup_table(THD*, TABLE_LIST*, TABLE_LIST*, bool)") at assert.c:92
#7  0x00007f3095f44312 in __GI___assert_fail (assertion=0x7f30991ec68e "table", file=0x7f30991ec280 "/data/src/10.3/sql/sql_base.cc", line=1010, function=0x7f30991edfc0 <find_dup_table(THD*, TABLE_LIST*, TABLE_LIST*, bool)::__PRETTY_FUNCTION__> "TABLE_LIST* find_dup_table(THD*, TABLE_LIST*, TABLE_LIST*, bool)") at assert.c:101
#8  0x00007f3098608721 in find_dup_table (thd=0x7f3080000b00, table=0x0, table_list=0x7f3080017a40, check_alias=false) at /data/src/10.3/sql/sql_base.cc:1010
#9  0x00007f3098608b6f in unique_table (thd=0x7f3080000b00, table=0x7f3080014e60, table_list=0x7f3080017a40, check_alias=false) at /data/src/10.3/sql/sql_base.cc:1139
#10 0x00007f3098688ada in mysql_load (thd=0x7f3080000b00, ex=0x7f3080014dd8, table_list=0x7f3080014e60, fields_vars=..., set_fields=..., set_values=..., handle_duplicates=DUP_ERROR, ignore=true, read_file_from_client=false) at /data/src/10.3/sql/sql_load.cc:421
#11 0x00007f309869e631 in mysql_execute_command (thd=0x7f3080000b00) at /data/src/10.3/sql/sql_parse.cc:5125
#12 0x00007f30986a77db in mysql_parse (thd=0x7f3080000b00, rawbuf=0x7f3080014ce8 "LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b)", length=55, parser_state=0x7f30902be5e0, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:8019
#13 0x00007f3098694c1d in dispatch_command (command=COM_QUERY, thd=0x7f3080000b00, packet=0x7f308000b1f1 "LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b)", packet_length=55, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:1846
#14 0x00007f3098693641 in do_command (thd=0x7f3080000b00) at /data/src/10.3/sql/sql_parse.cc:1391
#15 0x00007f30987f8ce1 in do_handle_one_connection (connect=0x7f309b551320) at /data/src/10.3/sql/sql_connect.cc:1402
#16 0x00007f30987f8a65 in handle_one_connection (arg=0x7f309b551320) at /data/src/10.3/sql/sql_connect.cc:1308
#17 0x00007f3098baf083 in pfs_spawn_thread (arg=0x7f309b564bc0) at /data/src/10.3/storage/perfschema/pfs.cc:1862
#18 0x00007f3097bab064 in start_thread (arg=0x7f30902bf700) at pthread_create.c:309
#19 0x00007f3095ffe62d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

10.3 7ad9b3588f5 RelWithDebInfo

#2  <signal handler called>
#3  0x00007f9f72f9a832 in find_table_in_list (table=0x7f9f500143d8, link=link@entry=&TABLE_LIST::next_global, db_name=db_name@entry=0x18, table_name=table_name@entry=0x28) at /data/src/10.3/sql/sql_base.cc:938
#4  0x00007f9f72f9a918 in find_table_in_global_list (table_name=0x28, db_name=0x18, table=<optimized out>) at /data/src/10.3/sql/sql_base.h:355
#5  find_dup_table (thd=thd@entry=0x7f9f500009a8, table=0x0, table_list=0x7f9f500143d8, check_alias=false) at /data/src/10.3/sql/sql_base.cc:1035
#6  0x00007f9f72f9ab08 in unique_table (thd=thd@entry=0x7f9f500009a8, table=<optimized out>, table@entry=0x7f9f500117f8, table_list=<optimized out>, check_alias=check_alias@entry=false) at /data/src/10.3/sql/sql_base.cc:1139
#7  0x00007f9f72fed741 in mysql_load (thd=thd@entry=0x7f9f500009a8, ex=0x7f9f50011770, table_list=table_list@entry=0x7f9f500117f8, fields_vars=..., set_fields=..., set_values=..., handle_duplicates=DUP_ERROR, ignore=true, read_file_from_client=false) at /data/src/10.3/sql/sql_load.cc:421
#8  0x00007f9f72ffa752 in mysql_execute_command (thd=thd@entry=0x7f9f500009a8) at /data/src/10.3/sql/sql_parse.cc:5125
#9  0x00007f9f72ffec1a in mysql_parse (thd=0x7f9f500009a8, rawbuf=<optimized out>, length=55, parser_state=0x7f9f675805f0, is_com_multi=<optimized out>, is_next_command=<optimized out>) at /data/src/10.3/sql/sql_parse.cc:8019
#10 0x00007f9f730013dd in dispatch_command (command=command@entry=COM_QUERY, thd=thd@entry=0x7f9f500009a8, packet=packet@entry=0x7f9f50009319 "LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b)", packet_length=packet_length@entry=55, is_com_multi=is_com_multi@entry=false, is_next_command=is_next_command@entry=false) at /data/src/10.3/sql/sql_parse.cc:1846
#11 0x00007f9f73001d7c in do_command (thd=0x7f9f500009a8) at /data/src/10.3/sql/sql_parse.cc:1391
#12 0x00007f9f730dcb92 in do_handle_one_connection (connect=connect@entry=0x7f9f756a8ec8) at /data/src/10.3/sql/sql_connect.cc:1402
#13 0x00007f9f730dcd2d in handle_one_connection (arg=arg@entry=0x7f9f756a8ec8) at /data/src/10.3/sql/sql_connect.cc:1308
#14 0x00007f9f7336ce61 in pfs_spawn_thread (arg=0x7f9f756b2998) at /data/src/10.3/storage/perfschema/pfs.cc:1862
#15 0x00007f9f7261b064 in start_thread (arg=0x7f9f67581700) at pthread_create.c:309
#16 0x00007f9f714fc62d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

Comment by Eugene Kosov (Inactive) [ 2018-06-20 ]

insert IGNORE into v (a, b) select a, b from t1;

This query doesn't crash. It inserts data into t1. It tries to choose between VIEWs underlying tables. It happens in check_view_single_update(). In contrast LOAD DATA doesn't do it. Proposed fix is to performs something similar for LOAD DATA` too.

Comment by Oleksandr Byelkin [ 2018-11-07 ]

As I can see the function was made from check_view_single_update(). IMHO it is better to use original one instead of code copying. The "bool insert" can be just changed with name of the operation. I will do it as queue come to it.

Comment by Varun Gupta (Inactive) [ 2019-01-29 ]

Patch
http://lists.askmonty.org/pipermail/commits/2019-January/013343.html

Comment by Oleksandr Byelkin [ 2019-01-29 ]

OK to push as we agreed

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