[MDEV-22149] Assertion `!table->pos_in_locked_tables' failed in tc_release_table or unexpected ER_TABLE_NOT_LOCKED upon DDL on partitioned table Created: 2020-04-05  Updated: 2022-09-10

Status: Open
Project: MariaDB Server
Component/s: Data Definition - Alter Table, Partitioning
Affects Version/s: 10.4, 10.5
Fix Version/s: 10.4, 10.5

Type: Bug Priority: Major
Reporter: Elena Stepanova Assignee: Oleksandr Byelkin
Resolution: Unresolved Votes: 0
Labels: None


 Description   

--source include/have_partition.inc
 
CREATE TABLE t1 (i INT, col_blob BLOB NOT NULL DEFAULT '') PARTITION BY RANGE(i) (PARTITION p0 VALUES LESS THAN (10));
CREATE TABLE t2 (a INT);
SET SQL_MODE= 'EMPTY_STRING_IS_NULL';
LOCK TABLE t1 WRITE, t2 WRITE;
--error ER_INVALID_DEFAULT
ALTER TABLE t1 ADD PARTITION (PARTITION p1 VALUES LESS THAN (20));
 
DROP TABLE t1, t2;

10.4 aa7f2578

mysqld: /data/src/10.4/sql/table_cache.cc:463: void tc_release_table(TABLE*): Assertion `!table->pos_in_locked_tables' failed.
200405  2:57:37 [ERROR] mysqld got signal 6 ;
 
#7  0x00007f2ab124b102 in __GI___assert_fail (assertion=0x564c891b5300 "!table->pos_in_locked_tables", file=0x564c891b4da0 "/data/src/10.4/sql/table_cache.cc", line=463, function=0x564c891b6460 <tc_release_table(TABLE*)::__PRETTY_FUNCTION__> "void tc_release_table(TABLE*)") at assert.c:101
#8  0x0000564c8782944a in tc_release_table (table=0x62000003e0f0) at /data/src/10.4/sql/table_cache.cc:463
#9  0x0000564c87073b6e in close_thread_table (thd=0x62b00005b270, table_ptr=0x62b00005b350) at /data/src/10.4/sql/sql_base.cc:1078
#10 0x0000564c87e814aa in handle_alter_part_error (lpt=0x7f2aa8296720, action_completed=false, drop_partition=false, frm_install=false, close_table=false) at /data/src/10.4/sql/sql_partition.cc:6956
#11 0x0000564c87e82d97 in fast_alter_partition_table (thd=0x62b00005b270, table=0x62000003d0f0, alter_info=0x7f2aa8299750, create_info=0x7f2aa8299830, table_list=0x62b0000623f0, db=0x7f2aa8297d70, table_name=0x7f2aa8297d80) at /data/src/10.4/sql/sql_partition.cc:7375
#12 0x0000564c87468a78 in mysql_alter_table (thd=0x62b00005b270, new_db=0x62b00005fa30, new_name=0x62b00005fe38, create_info=0x7f2aa8299830, table_list=0x62b0000623f0, alter_info=0x7f2aa8299750, order_num=0, order=0x0, ignore=false) at /data/src/10.4/sql/sql_table.cc:9875
#13 0x0000564c875e2f7b in Sql_cmd_alter_table::execute (this=0x62b0000632d8, thd=0x62b00005b270) at /data/src/10.4/sql/sql_alter.cc:502
#14 0x0000564c872154c7 in mysql_execute_command (thd=0x62b00005b270) at /data/src/10.4/sql/sql_parse.cc:6101
#15 0x0000564c8722147a in mysql_parse (thd=0x62b00005b270, rawbuf=0x62b000062290 "ALTER TABLE t1 ADD PARTITION (PARTITION p1 VALUES LESS THAN (20))", length=65, parser_state=0x7f2aa829e5d0, is_com_multi=false, is_next_command=false) at /data/src/10.4/sql/sql_parse.cc:7900
#16 0x0000564c871f62ef in dispatch_command (command=COM_QUERY, thd=0x62b00005b270, packet=0x629000226271 "ALTER TABLE t1 ADD PARTITION (PARTITION p1 VALUES LESS THAN (20))", packet_length=65, is_com_multi=false, is_next_command=false) at /data/src/10.4/sql/sql_parse.cc:1841
#17 0x0000564c871f2a98 in do_command (thd=0x62b00005b270) at /data/src/10.4/sql/sql_parse.cc:1359
#18 0x0000564c875cadd4 in do_handle_one_connection (connect=0x6110000083f0) at /data/src/10.4/sql/sql_connect.cc:1412
#19 0x0000564c875ca676 in handle_one_connection (arg=0x6110000083f0) at /data/src/10.4/sql/sql_connect.cc:1316
#20 0x0000564c88c0866d in pfs_spawn_thread (arg=0x61600000ccf0) at /data/src/10.4/storage/perfschema/pfs.cc:1869
#21 0x00007f2ab1ac5fa3 in start_thread (arg=<optimized out>) at pthread_create.c:486
#22 0x00007f2ab13144cf in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Non-debug build does not crash, ALTER fails with ER_INVALID_DEFAULT which is probably okay, but DROP TABLE causes an unexpected error ER_TABLE_NOT_LOCKED:

10.4 non-debug

mysqltest: At line 10: query 'DROP TABLE t1, t2' failed: 1100: Table 't2' was not locked with LOCK TABLES

Reproducible on 10.4, 10.5 with at least InnoDB and MyISAM.
Not reproducible on 10.3, but because on 10.3 ADD PARTITION passes, it doesn't cause ER_INVALID_DEFAULT.



 Comments   
Comment by Roel Van de Paar [ 2022-09-10 ]

Does not seem to crash any version anymore. However what is interesting is this;

10.4.27 3101751f505f39d2ccecd03a916ecdbf2f380740 (Optimized)

10.4.27-opt>CREATE TABLE t1 (i INT, col_blob BLOB NOT NULL DEFAULT '');
Query OK, 0 rows affected (0.012 sec)
 
10.4.27-opt>SET SQL_MODE= 'EMPTY_STRING_IS_NULL';
Query OK, 0 rows affected (0.000 sec)
 
10.4.27-opt>CREATE TABLE t2 (i INT, col_blob BLOB NOT NULL DEFAULT '');
ERROR 1067 (42000): Invalid default value for 'col_blob'

Not sure what to make of this. If the latter is correct (as it looks to be), then the former table defenition still exists after the SQL mode was changed. I guess it's a catch-22.

Comment by Roel Van de Paar [ 2022-09-10 ]

Note MDEV-29506 (looks unrelated, but testcase has similarities). Further info here.

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