Description:
Running main.greedy_optimizer (and others like main.subquery_sj* ) MTR tests trigger AddressSanitizer stack-overflow error.
How to repeat:
1. Build the server with the following options:
-DWITH_ASAN=ON -DWITH_ASAN_SCOPE=ON
2. ./mysql-test/mtr main.greedy_optimizer
Result:
ASAN:DEADLYSIGNAL
=================================================================
==4608==ERROR: AddressSanitizer: stack-overflow on address 0x7ff3e3cacef8 (pc 0x7ff40699d1e6 bp 0x7ff3e3cad790 sp 0x7ff3e3cacf00 T38)
#0 0x7ff40699d1e5 (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x5b1e5)
#1 0x55c7dd47c68b in strchr /usr/include/string.h:220
#2 0x55c7dd47c68b in AutoDebugTrace::AutoDebugTrace(char const*, char const*, int) /home/kamil/repo/upstream/8.0/mysql-server/include/my_dbug.h:109
#3 0x55c7dfe1b9a7 in MEM_ROOT::AllocSlow(unsigned long) /home/kamil/repo/upstream/8.0/mysql-server/mysys/my_alloc.cc:87
#4 0x55c7dd47cad6 in MEM_ROOT::Alloc(unsigned long) /home/kamil/repo/upstream/8.0/mysql-server/include/my_alloc.h:154
#5 0x55c7dd4e8e88 in operator new(unsigned long, MEM_ROOT*, std::nothrow_t const&) /home/kamil/repo/upstream/8.0/mysql-server/include/my_alloc.h:362
#6 0x55c7de04c59c in std::unique_ptr<RowIterator, Destroy_only<RowIterator> > NewIterator<TableScanIterator, TABLE*&, QEP_TAB*&, unsigned long long*&>(THD*, TABLE*&, QEP_TAB*&, unsigned long long*&) /home/kamil/repo/upstream/8.0/mysql-server/sql/timing_iterator.h:168
#7 0x55c7de041d3e in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:367
#8 0x55c7de0431c4 in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:528
#9 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#10 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#11 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#12 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#13 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#14 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#15 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#16 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#17 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#18 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#19 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#20 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#21 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#22 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#23 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#24 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#25 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#26 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#27 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#28 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#29 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#30 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#31 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#32 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#33 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#34 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#35 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#36 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#37 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#38 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#39 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#40 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#41 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#42 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#43 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#44 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#45 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#46 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#47 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#48 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#49 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#50 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#51 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#52 0x55c7de04323d in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:530
#53 0x55c7de043eb6 in CreateIteratorFromAccessPath(THD*, AccessPath*, JOIN*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/join_optimizer/access_path.cc:595
#54 0x55c7dd929bee in SELECT_LEX_UNIT::optimize(THD*, TABLE*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/sql_union.cc:811
#55 0x55c7dd7eb1d2 in Sql_cmd_dml::execute_inner(THD*) /home/kamil/repo/upstream/8.0/mysql-server/sql/sql_select.cc:924
#56 0x55c7dd806a6a in Sql_cmd_dml::execute(THD*) /home/kamil/repo/upstream/8.0/mysql-server/sql/sql_select.cc:725
#57 0x55c7dd711e9d in mysql_execute_command(THD*, bool) /home/kamil/repo/upstream/8.0/mysql-server/sql/sql_parse.cc:4344
#58 0x55c7dd714a6d in mysql_parse(THD*, Parser_state*) /home/kamil/repo/upstream/8.0/mysql-server/sql/sql_parse.cc:4965
#59 0x55c7dd717281 in dispatch_command(THD*, COM_DATA const*, enum_server_command) /home/kamil/repo/upstream/8.0/mysql-server/sql/sql_parse.cc:1784
#60 0x55c7dd71a781 in do_command(THD*) /home/kamil/repo/upstream/8.0/mysql-server/sql/sql_parse.cc:1309
#61 0x55c7dda5b0ca in handle_connection /home/kamil/repo/upstream/8.0/mysql-server/sql/conn_handler/connection_handler_per_thread.cc:301
#62 0x55c7e0be180f in pfs_spawn_thread /home/kamil/repo/upstream/8.0/mysql-server/storage/perfschema/pfs.cc:2880
#63 0x7ff40672a6da in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0+0x76da)
#64 0x7ff404ba3a3e in __clone (/lib/x86_64-linux-gnu/libc.so.6+0x121a3e)
SUMMARY: AddressSanitizer: stack-overflow (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x5b1e5)
Thread T38 created by T0 here:
#0 0x7ff406979d2f in __interceptor_pthread_create (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x37d2f)
#1 0x55c7dfe31dfd in my_thread_create(my_thread_handle*, pthread_attr_t const*, void* (*)(void*), void*) /home/kamil/repo/upstream/8.0/mysql-server/mysys/my_thread.cc:59
#2 0x55c7e0be522f in pfs_spawn_thread_vc(unsigned int, my_thread_handle*, pthread_attr_t const*, void* (*)(void*), void*) /home/kamil/repo/upstream/8.0/mysql-server/storage/perfschema/pfs.cc:2930
#3 0x55c7dda5a1d9 in inline_mysql_thread_create /home/kamil/repo/upstream/8.0/mysql-server/include/mysql/psi/mysql_thread.h:140
#4 0x55c7dda5b404 in Per_thread_connection_handler::add_connection(Channel_info*) /home/kamil/repo/upstream/8.0/mysql-server/sql/conn_handler/connection_handler_per_thread.cc:409
#5 0x55c7ddc6d793 in Connection_handler_manager::process_new_connection(Channel_info*) /home/kamil/repo/upstream/8.0/mysql-server/sql/conn_handler/connection_handler_manager.cc:260
#6 0x55c7dd4812c6 in Connection_acceptor<Mysqld_socket_listener>::connection_event_loop() (/home/kamil/repo/upstream/8.0/bld/runtime_output_directory/mysqld+0x388a2c6)
#7 0x55c7dd47badf in mysqld_main(int, char**) /home/kamil/repo/upstream/8.0/mysql-server/sql/mysqld.cc:7466
#8 0x55c7dd454512 in main /home/kamil/repo/upstream/8.0/mysql-server/sql/main.cc:25
#9 0x7ff404aa3b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
==4608==ABORTING
Suggested fix:
I see following problems here:
1. AddressSanitizer adds guards around local variables. This increases functions stacks
2. Default stack size is 280kB (my_thread.h)
3. CreateIteratorFromAccessPath() uses a lot of local variables. Together with ASAN guards this causes the function stack to be c.a. 5kB
4. CreateIteratorFromAccessPath() is called recursively (I didn't analyze it with details, but it does not look safe)
How to fix:
1. I think there is no problem without ASAN, however would be nice to have this alert handled gracefuly
2. Decomposing CreateIteratorFromAccessPath() into separate functions would help as the stack will not grow with variables not needed for particular execution path
3. Test is OK if DEFAULT_THREAD_STACK is set to 16MB