[MDEV-23977] FK Reference issue in Aria (or InnoDB) + Assertion `!parse_error || lex.sphead == 0' failed in Table_triggers_list::check_n_load Created: 2020-10-17  Updated: 2023-04-27

Status: Open
Project: MariaDB Server
Component/s: Storage Engine - Aria
Affects Version/s: 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7
Fix Version/s: 10.4, 10.5, 10.6

Type: Bug Priority: Major
Reporter: Roel Van de Paar Assignee: Michael Widenius
Resolution: Unresolved Votes: 0
Labels: None

Issue Links:
Relates
relates to MDEV-18496 Crashes, asserts, errors and hangs wh... Closed
relates to MDEV-22883 Assertion `!parse_error || lex.sphead... Stalled

 Description   

Whereas this bug is very similar and likely related to MDEV-22883 and MDEV-18496 in that there is something very Aria-specific happening. In InnoDB:

10.5.6 2bac9782aa81ad386beaf00eb126ccf2d15031a1 (Debug)

10.5.6>USE test;
Database changed
10.5.6>SET SQL_MODE='';
Query OK, 0 rows affected (0.000 sec)
10.5.6>CREATE TABLE t (C1 CHAR (1) PRIMARY KEY, FOREIGN KEY(C1) REFERENCES t (C1)) ENGINE=InnoDB;
ERROR 1005 (HY000): Can't create table `test`.`t` (errno: 150 "Foreign key constraint is incorrectly formed")

And in Aria:

10.5.6 2bac9782aa81ad386beaf00eb126ccf2d15031a1 (Debug)

10.5.6>USE test;
Database changed
10.5.6>SET SQL_MODE='';
Query OK, 0 rows affected (0.000 sec)
10.5.6>CREATE TABLE t (C1 CHAR (1) PRIMARY KEY, FOREIGN KEY(C1) REFERENCES t (C1)) ENGINE=Aria;
Query OK, 0 rows affected (0.011 sec)

Note that no encryption is used, and Aria allowed the FK reference which InnoDB rejects.

The surrounding issue is that a crash can be generated if encryption is enabled.

USE test;
SET SQL_MODE='';
SET GLOBAL aria_encrypt_tables=ON;
CREATE TABLE t (C1 CHAR (1) PRIMARY KEY, FOREIGN KEY(C1) REFERENCES t (C1)) ENGINE=Aria;
CREATE TRIGGER tr1_bi BEFORE INSERT ON t FOR EACH ROW SET @a:=1;
INSERT INTO t VALUES (str_to_date ('abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz'));
RENAME TABLE t TO t3,t TO t,t2 TO t;

Leads to:

10.5.6 2bac9782aa81ad386beaf00eb126ccf2d15031a1 (Debug)

mysqld: /test/10.5_dbg/sql/sql_trigger.cc:1460: static bool Table_triggers_list::check_n_load(THD*, const LEX_CSTRING*, const LEX_CSTRING*, TABLE*, bool): Assertion `!parse_error || lex.sphead == 0' failed.

10.5.6 2bac9782aa81ad386beaf00eb126ccf2d15031a1 (Debug)

Core was generated by `/test/MD150920-mariadb-10.5.6-linux-x86_64-dbg/bin/mysqld --no-defaults --core-'.
Program terminated with signal SIGABRT, Aborted.
#0  __pthread_kill (threadid=<optimized out>, signo=signo@entry=6)
    at ../sysdeps/unix/sysv/linux/pthread_kill.c:57
[Current thread is 1 (Thread 0x14fd8fd15700 (LWP 3550511))]
(gdb) bt
#0  __pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at ../sysdeps/unix/sysv/linux/pthread_kill.c:57
#1  0x000055e157f8985a in my_write_core (sig=sig@entry=6) at /test/10.5_dbg/mysys/stacktrace.c:424
#2  0x000055e1577503a9 in handle_fatal_signal (sig=6) at /test/10.5_dbg/sql/signal_handler.cc:330
#3  <signal handler called>
#4  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#5  0x000014fd8dfab8b1 in __GI_abort () at abort.c:79
#6  0x000014fd8df9b42a in __assert_fail_base (fmt=0x14fd8e122a38 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x55e158127f60 "!parse_error || lex.sphead == 0", file=file@entry=0x55e158127bc0 "/test/10.5_dbg/sql/sql_trigger.cc", line=line@entry=1460, function=function@entry=0x55e1581288e0 <Table_triggers_list::check_n_load(THD*, st_mysql_const_lex_string const*, st_mysql_const_lex_string const*, TABLE*, bool)::__PRETTY_FUNCTION__> "static bool Table_triggers_list::check_n_load(THD*, const LEX_CSTRING*, const LEX_CSTRING*, TABLE*, bool)") at assert.c:92
#7  0x000014fd8df9b4a2 in __GI___assert_fail (assertion=assertion@entry=0x55e158127f60 "!parse_error || lex.sphead == 0", file=file@entry=0x55e158127bc0 "/test/10.5_dbg/sql/sql_trigger.cc", line=line@entry=1460, function=function@entry=0x55e1581288e0 <Table_triggers_list::check_n_load(THD*, st_mysql_const_lex_string const*, st_mysql_const_lex_string const*, TABLE*, bool)::__PRETTY_FUNCTION__> "static bool Table_triggers_list::check_n_load(THD*, const LEX_CSTRING*, const LEX_CSTRING*, TABLE*, bool)") at assert.c:101
#8  0x000055e157580e98 in Table_triggers_list::check_n_load (thd=thd@entry=0x14fd6bc15088, db=db@entry=0x14fd6bc741e0, table_name=table_name@entry=0x14fd6bc741f0, table=table@entry=0x14fd8fd134c0, names_only=names_only@entry=true) at /test/10.5_dbg/sql/sql_trigger.cc:1460
#9  0x000055e157581eb6 in Table_triggers_list::change_table_name (thd=thd@entry=0x14fd6bc15088, db=db@entry=0x14fd6bc741e0, old_alias=old_alias@entry=0x14fd8fd13a00, old_table=old_table@entry=0x14fd6bc741f0, new_db=new_db@entry=0x14fd6bc748c0, new_table=new_table@entry=0x14fd8fd13a10) at /test/10.5_dbg/sql/sql_trigger.cc:2106
#10 0x000055e1574c6a4f in do_rename (force_if_exists=0x14fd8fd13adf, if_exists=false, skip_error=false, new_table_alias=0x14fd6bc748f0, new_table_name=0x14fd6bc748d0, new_db=0x14fd6bc748c0, ren_table=0x14fd6bc741c8, thd=0x14fd6bc15088) at /test/10.5_dbg/sql/sql_rename.cc:345
#11 rename_tables (thd=thd@entry=0x14fd6bc15088, table_list=table_list@entry=0x14fd6bc741c8, skip_error=skip_error@entry=false, if_exists=if_exists@entry=false, force_if_exists=force_if_exists@entry=0x14fd8fd13adf) at /test/10.5_dbg/sql/sql_rename.cc:421
#12 0x000055e1574c6dbb in mysql_rename_tables (thd=thd@entry=0x14fd6bc15088, table_list=table_list@entry=0x14fd6bc741c8, silent=silent@entry=false, if_exists=<optimized out>) at /test/10.5_dbg/sql/sql_rename.cc:159
#13 0x000055e15749e279 in mysql_execute_command (thd=thd@entry=0x14fd6bc15088) at /test/10.5_dbg/sql/sql_parse.cc:4314
#14 0x000055e1574aa324 in mysql_parse (thd=thd@entry=0x14fd6bc15088, rawbuf=<optimized out>, length=<optimized out>, parser_state=parser_state@entry=0x14fd8fd14350, is_com_multi=is_com_multi@entry=false, is_next_command=is_next_command@entry=false) at /test/10.5_dbg/sql/sql_parse.cc:7994
#15 0x000055e157496d54 in dispatch_command (command=command@entry=COM_QUERY, thd=thd@entry=0x14fd6bc15088, packet=packet@entry=0x14fd6bc67089 "RENAME TABLE t TO t3,t TO t,t2 TO t", packet_length=packet_length@entry=35, is_com_multi=is_com_multi@entry=false, is_next_command=is_next_command@entry=false) at /test/10.5_dbg/sql/sql_parse.cc:1867
#16 0x000055e15749553e in do_command (thd=0x14fd6bc15088) at /test/10.5_dbg/sql/sql_parse.cc:1348
#17 0x000055e1575f4893 in do_handle_one_connection (connect=<optimized out>, connect@entry=0x14fd6f0d4808, put_in_cache=put_in_cache@entry=true) at /test/10.5_dbg/sql/sql_connect.cc:1410
#18 0x000055e1575f4fb7 in handle_one_connection (arg=arg@entry=0x14fd6f0d4808) at /test/10.5_dbg/sql/sql_connect.cc:1312
#19 0x000055e157a5f5c2 in pfs_spawn_thread (arg=0x14fd8c846508) at /test/10.5_dbg/storage/perfschema/pfs.cc:2201
#20 0x000014fd8ec8e6db in start_thread (arg=0x14fd8fd15700) at pthread_create.c:463
#21 0x000014fd8e08ca3f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Bug confirmed present in:
MariaDB: 10.1.47 (dbg), 10.2.34 (dbg), 10.3.25 (dbg), 10.4.15 (dbg), 10.5.6 (dbg), 10.6.0 (dbg), 10.7.0 (dbg)

Bug confirmed not present in:
MariaDB: 10.1.47 (opt), 10.2.34 (opt), 10.3.25 (opt), 10.4.15 (opt), 10.5.6 (opt), 10.6.0 (opt)
MySQL: 5.5.62 (dbg), 5.5.62 (opt), 5.6.49 (dbg), 5.6.49 (opt), 5.7.31 (dbg), 5.7.31 (opt), 8.0.21 (dbg), 8.0.21 (opt)



 Comments   
Comment by Roel Van de Paar [ 2021-07-28 ]

Slightly different stack in 10.7

10.7.0 71ed8c136fa203b9b3a678a6d5cc72235ef73ef7 (Debug)

mysqld: /test/10.7_dbg/sql/sql_trigger.cc:1627: static bool Table_triggers_list::check_n_load(THD*, const LEX_CSTRING*, const LEX_CSTRING*, TABLE*, bool): Assertion `!parse_error || lex.sphead == 0' failed.

10.7.0 71ed8c136fa203b9b3a678a6d5cc72235ef73ef7 (Debug)

Core was generated by `/test/MD200721-mariadb-10.7.0-linux-x86_64-dbg/bin/mysqld --no-defaults --core-'.
Program terminated with signal SIGABRT, Aborted.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
[Current thread is 1 (Thread 0x145f200f2700 (LWP 1574012))]
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x0000145f21757859 in __GI_abort () at abort.c:79
#2  0x0000145f21757729 in __assert_fail_base (fmt=0x145f218ed588 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x55e7491427c8 "!parse_error || lex.sphead == 0", file=0x55e749142008 "/test/10.7_dbg/sql/sql_trigger.cc", line=1627, function=<optimized out>) at assert.c:92
#3  0x0000145f21768f36 in __GI___assert_fail (assertion=assertion@entry=0x55e7491427c8 "!parse_error || lex.sphead == 0", file=file@entry=0x55e749142008 "/test/10.7_dbg/sql/sql_trigger.cc", line=line@entry=1627, function=function@entry=0x55e749142758 "static bool Table_triggers_list::check_n_load(THD*, const LEX_CSTRING*, const LEX_CSTRING*, TABLE*, bool)") at assert.c:101
#4  0x000055e7485a3ef6 in Table_triggers_list::check_n_load (thd=thd@entry=0x145edc000db8, db=db@entry=0x145edc013dc8, table_name=table_name@entry=0x145edc013dd8, table=table@entry=0x145f200f0a20, names_only=names_only@entry=true) at /test/10.7_dbg/sql/sql_trigger.cc:1627
#5  0x000055e7485a4e72 in Table_triggers_list::prepare_for_rename (thd=thd@entry=0x145edc000db8, param=param@entry=0x145f200f0a20, db=db@entry=0x145edc013dc8, old_alias=old_alias@entry=0x145f200f09e0, old_table=old_table@entry=0x145edc013dd8, new_db=new_db@entry=0x145edc0144b8, new_table=0x145f200f09f0) at /test/10.7_dbg/sql/sql_trigger.cc:2267
#6  0x000055e7484dc43a in do_rename (force_if_exists=<synthetic pointer>, skip_error=false, new_db=0x145edc0144b8, ren_table=0x145edc013db0, ddl_log_state=0x145f200f0960, param=0x145f200f09e0, thd=0x145edc000db8) at /test/10.7_dbg/sql/sql_rename.cc:368
#7  rename_tables (force_if_exists=<synthetic pointer>, if_exists=false, skip_error=false, ddl_log_state=0x145f200f0960, table_list=0x145edc013db0, thd=0x145edc000db8) at /test/10.7_dbg/sql/sql_rename.cc:533
#8  mysql_rename_tables (thd=thd@entry=0x145edc000db8, table_list=table_list@entry=0x145edc013db0, silent=silent@entry=false, if_exists=false) at /test/10.7_dbg/sql/sql_rename.cc:164
#9  0x000055e7484ad7b2 in mysql_execute_command (thd=thd@entry=0x145edc000db8, is_called_from_prepared_stmt=is_called_from_prepared_stmt@entry=false) at /test/10.7_dbg/sql/structs.h:568
#10 0x000055e748498ead in mysql_parse (thd=thd@entry=0x145edc000db8, rawbuf=<optimized out>, length=<optimized out>, parser_state=parser_state@entry=0x145f200f1400) at /test/10.7_dbg/sql/sql_parse.cc:8026
#11 0x000055e7484a79f8 in dispatch_command (command=command@entry=COM_QUERY, thd=thd@entry=0x145edc000db8, packet=packet@entry=0x145edc00b749 "RENAME TABLE t TO t3,t TO t,t2 TO t", packet_length=packet_length@entry=35, blocking=blocking@entry=true) at /test/10.7_dbg/sql/sql_class.h:1340
#12 0x000055e7484aae05 in do_command (thd=0x145edc000db8, blocking=blocking@entry=true) at /test/10.7_dbg/sql/sql_parse.cc:1404
#13 0x000055e748620f48 in do_handle_one_connection (connect=<optimized out>, connect@entry=0x55e74c584eb8, put_in_cache=put_in_cache@entry=true) at /test/10.7_dbg/sql/sql_connect.cc:1410
#14 0x000055e74862154d in handle_one_connection (arg=arg@entry=0x55e74c584eb8) at /test/10.7_dbg/sql/sql_connect.cc:1312
#15 0x000055e748a895b2 in pfs_spawn_thread (arg=0x55e74c4ad618) at /test/10.7_dbg/storage/perfschema/pfs.cc:2201
#16 0x0000145f21c66609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#17 0x0000145f21854293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Generated at Thu Feb 08 09:26:31 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.