Description:
Hi
Up to MySQL 8.0.19 version, MySQL server crashed when I DROP TABLE which has invalid COMPRESSION clause such as "COMPRESSION='zlibX' ", the table was created within INNODB_STRICT_MODE = OFF;
The backtrace as below:
mysqld: sql/sql_table.cc:2771: bool drop_base_table(THD*, const Drop_tables_ctx&, TABLE_LIST*, bool, std::set<handlerton*>*, Foreign_key_parents_invalidator*, std::vector<MDL_ticket*>*): Assertion `!atomic || (error != 2 && error != 155)' failed.
07:01:26 UTC - mysqld got signal 6 ;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
Thread pointer: 0x62700032f900
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 7f2c77c629d0 thread_stack 0x46000
/usr/lib64/libasan.so.4(+0x55610) [0x7f2ca1b63610]
runtime_output_directory/mysqld(my_print_stacktrace(unsigned char*, unsigned long)+0xbb) [0x665e7b9]
runtime_output_directory/mysqld(handle_fatal_signal+0x561) [0x3a7764f]
/usr/lib64/libpthread.so.0(+0xf620) [0x7f2ca1901620]
/usr/lib64/libc.so.6(gsignal+0x37) [0x7f2ca04f5277]
/usr/lib64/libc.so.6(abort+0x148) [0x7f2ca04f6968]
/usr/lib64/libc.so.6(+0x2f096) [0x7f2ca04ee096]
/usr/lib64/libc.so.6(+0x2f142) [0x7f2ca04ee142]
runtime_output_directory/mysqld() [0x36dc4c3]
runtime_output_directory/mysqld(mysql_rm_table_no_locks(THD*, TABLE_LIST*, ...) [0x36dec30]
runtime_output_directory/mysqld(mysql_rm_table(THD*, TABLE_LIST*, bool, bool)+0x935) [0x36d4d5b]
runtime_output_directory/mysqld(mysql_execute_command(THD*, bool)+0x531c) [0x3559e8c]
runtime_output_directory/mysqld(mysql_parse(THD*, Parser_state*)+0xddd) [0x356817a]
runtime_output_directory/mysqld(dispatch_command(THD*, COM_DATA const*, enum_server_command)+0x2918) [0x354f509]
/
Through the codes, maybe, function format_validate() in dict/dict0dd.cc should judge the variable INNODB_STRICT_MODE if err == DB_UNSUPPORTED as below:
1282 if (const char *algorithm =
1283 form->s->compress.length > 0 ? form->s->compress.str : nullptr) {
1284 Compression compression;
1285 dberr_t err = Compression::check(algorithm, &compression);
1286
1287 if (err == DB_UNSUPPORTED) {
1288 my_error(ER_WRONG_VALUE, MYF(0), "COMPRESSION", algorithm);
1289 invalid = true;
1290 } else if (compression.m_type != Compression::NONE) {
1291 if (*zip_ssize != 0) {
How to repeat:
see the test case file. require debug mode.