[MDEV-29155] CREATE OR REPLACE with self-referencing CHECK hangs forever, cannot be killed Created: 2022-07-22  Updated: 2024-01-31

Status: Stalled
Project: MariaDB Server
Component/s: Data Definition - Create Table, Server, Virtual Columns
Affects Version/s: 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 10.10
Fix Version/s: 10.4, 10.5, 10.6

Type: Bug Priority: Major
Reporter: Elena Stepanova Assignee: Aleksey Midenkov
Resolution: Unresolved Votes: 0
Labels: None


 Description   

create table t (a int);
create or replace table t (a int, check(exists (select * from t)));

CREATE OR REPLACE above hangs with the state Closing tables in the process list.
The stack trace from the still running query:

10.3 dbe39f14

Thread 31 (Thread 0x7fe664446700 (LWP 3982519) "mysqld"):
#0  futex_wait_cancelable (private=0, expected=0, futex_word=0x7fe60401dca8) at ../sysdeps/nptl/futex-internal.h:186
#1  __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fe60401dbf8, cond=0x7fe60401dc80) at pthread_cond_wait.c:508
#2  __pthread_cond_wait (cond=0x7fe60401dc80, mutex=0x7fe60401dbf8) at pthread_cond_wait.c:638
#3  0x0000565170941346 in safe_cond_wait (cond=0x7fe60401dc80, mp=0x7fe60401dbd0, file=0x565170a439f0 "/data/src/10.3/include/mysql/psi/mysql_thread.h", line=1185) at /data/src/10.3/mysys/thr_mutex.c:492
#4  0x000056516ffec3d3 in inline_mysql_cond_wait (that=0x7fe60401dc80, mutex=0x7fe60401dbd0, src_file=0x565170a43b58 "/data/src/10.3/sql/table_cache.cc", src_line=1178) at /data/src/10.3/include/mysql/psi/mysql_thread.h:1185
#5  0x000056516ffefbab in tdc_remove_table (thd=0x7fe604000d90, remove_type=TDC_RT_REMOVE_ALL, db=0x7fe604011db0 "test", table_name=0x7fe604011700 "t", kill_delayed_threads=false) at /data/src/10.3/sql/table_cache.cc:1178
#6  0x000056516fe7a92f in mysql_rm_table_no_locks (thd=0x7fe604000d90, tables=0x7fe664444030, if_exists=false, drop_temporary=false, drop_view=false, drop_sequence=false, dont_log_query=true, dont_free_locks=true) at /data/src/10.3/sql/sql_table.cc:2517
#7  0x000056516fe822e2 in create_table_impl (thd=0x7fe604000d90, orig_db=0x7fe604011768, orig_table_name=0x7fe604011778, db=0x7fe604011768, table_name=0x7fe604011778, path=0x7fe664444770 "./test/t", options=..., create_info=0x7fe664444bc0, alter_info=0x7fe664444b00, create_table_mode=0, is_trans=0x7fe6644449ce, key_info=0x7fe664444750, key_count=0x7fe664444744, frm=0x7fe664444760) at /data/src/10.3/sql/sql_table.cc:5027
#8  0x000056516fe82e0f in mysql_create_table_no_lock (thd=0x7fe604000d90, db=0x7fe604011768, table_name=0x7fe604011778, create_info=0x7fe664444bc0, alter_info=0x7fe664444b00, is_trans=0x7fe6644449ce, create_table_mode=0, table_list=0x7fe604011750) at /data/src/10.3/sql/sql_table.cc:5239
#9  0x000056516fe8322f in mysql_create_table (thd=0x7fe604000d90, create_table=0x7fe604011750, create_info=0x7fe664444bc0, alter_info=0x7fe664444b00) at /data/src/10.3/sql/sql_table.cc:5334
#10 0x000056516fe954c7 in Sql_cmd_create_table_like::execute (this=0x7fe604011730, thd=0x7fe604000d90) at /data/src/10.3/sql/sql_table.cc:11451
#11 0x000056516fdacbc8 in mysql_execute_command (thd=0x7fe604000d90) at /data/src/10.3/sql/sql_parse.cc:6075
#12 0x000056516fdb21aa in mysql_parse (thd=0x7fe604000d90, rawbuf=0x7fe604011608 "create or replace table t (a int, check(not exists (select * from t)))", length=70, parser_state=0x7fe664445600, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:7870
#13 0x000056516fd9e9df in dispatch_command (command=COM_QUERY, thd=0x7fe604000d90, packet=0x7fe604019981 "create or replace table t (a int, check(not exists (select * from t)))", packet_length=70, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:1852
#14 0x000056516fd9d39d in do_command (thd=0x7fe604000d90) at /data/src/10.3/sql/sql_parse.cc:1398
#15 0x000056516ff1a956 in do_handle_one_connection (connect=0x565172f19130) at /data/src/10.3/sql/sql_connect.cc:1403
#16 0x000056516ff1a6c1 in handle_one_connection (arg=0x565172f19130) at /data/src/10.3/sql/sql_connect.cc:1308
#17 0x00007fe67aec6ea7 in start_thread (arg=<optimized out>) at pthread_create.c:477
#18 0x00007fe67adf6def in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Killing the thread doesn't interrupt the query:

|  9 | root        | localhost:41414 | test | Killed  |  393 | Closing tables           | create or replace table t (a int, check(not exists (select * from t))) |    0.000 |

It further causes a hang upon server shutdown.

Reproducible on 10.3+, MyISAM and InnoDB, debug and release.



 Comments   
Comment by Aleksey Midenkov [ 2023-10-03 ]

Please review bb-10.4-midenok

Comment by Oleksandr Byelkin [ 2023-11-10 ]

as we discussed we do not need complex comparison when we need equal or not

Generated at Thu Feb 08 10:06:19 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.