Bug #6378 Lost Connection when deleting using left joins with InnoDB tables
| Submitted: | 2 Nov 2004 4:27 | Modified: | 21 Nov 2004 21:21 |
|---|---|---|---|
| Reporter: | Brian Hibma | Email Updates: | |
| Status: | Duplicate | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S2 (Serious) |
| Version: | 4.0.22 & 4.1.7 | OS: | Linux (Linux Mandrake 9.1) |
| Assigned to: | Assigned Account | CPU Architecture: | Any |
[2 Nov 2004 4:27]
Brian Hibma
[2 Nov 2004 7:39]
Heikki Tuuri
Hi! Thank you for the bug report. I am able to repeat this. The reason for the bug is that MySQL is trying to delete a row from table b though b contains no row at all! I guess the multi-table delete code is confused by the left join. gdb reveals that first MySQL asks for a row in table b. InnoDB correctly returns that there is no row. Then MySQL asks for a row in table a. I have assigned this bug to the author of the multi-table delete. Regards, Heikki 041102 9:01:01InnoDB: Assertion failure in thread 147466 in file row0mysql.c li ne 1122 InnoDB: Failing assertion: node->pcur->rel_pos == BTR_PCUR_ON InnoDB: We intentionally generate a memory trap. InnoDB: Submit a detailed bug report to http://bugs.mysql.com. InnoDB: If you get repeated assertion failures or crashes, even InnoDB: immediately after the mysqld startup, there may be InnoDB: corruption in the InnoDB tablespace. Please refer to InnoDB: http://dev.mysql.com/doc/mysql/en/Forcing_recovery.html InnoDB: about forcing recovery. Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 147466 (LWP 1124)] 0x08270551 in row_update_for_mysql (mysql_rec=0x8b3f888 "ÿ", prebuilt=0x402cf068) at row0mysql.c:1122 1122 ut_a(node->pcur->rel_pos == BTR_PCUR_ON); Current language: auto; currently c (gdb) bt #0 0x08270551 in row_update_for_mysql (mysql_rec=0x8b3f888 "ÿ", prebuilt=0x402cf068) at row0mysql.c:1122 #1 0x082009cd in ha_innobase::delete_row(char const*) (this=0x8b3f780, record=0x0) at ha_innodb.cc:2767 #2 0x081c855d in multi_delete::send_data(List<Item>&) (this=0x8b448f8, values=@0x8b46734) at sql_delete.cc:408 #3 0x081b1e3f in end_send (join=0x8b44930, join_tab=0x8b45928, end_of_records=false) at sql_select.cc:6357 #4 0x081b0d37 in sub_select (join=0x8b44930, join_tab=0x8b457e8, end_of_records=false) at sql_select.cc:5781 #5 0x081b0942 in do_select (join=0x8b44930, fields=0x8b457e8, table=0x0, procedure=0x0) at sql_select.cc:5665 #6 0x081a61a7 in JOIN::exec() (this=0x8b44930) at sql_select.cc:1463 #7 0x081a6614 in mysql_select(THD*, Item***, st_table_list*, unsigned, List<Ite m>&, Item*, unsigned, st_order*, st_order*, Item*, st_order*, unsigned long, sel ect_result*, st_select_lex_unit*, st_select_lex*) (thd=0x8b465a8, rref_pointer_array=0x8b467b4, tables=0x8b44610, wild_num=0, fields=@0x0, conds=0x0, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=277105280, result=0x8b448f8, unit=0x8b465ec, select_lex=0x8b466cc) at sql_select.cc:1584 #8 0x0817be12 in mysql_execute_command(THD*) (thd=0x8b465a8) at sql_parse.cc:2822 #9 0x0817edfd in mysql_parse(THD*, char*, unsigned) (thd=0x8b465a8, inBuf=0x8b44450 "DELETE TableA, TableB FROM a As TableA LEFT JOIN b As Table B ON TableB.apk =\nTableA.pk", length=146040288) at sql_parse.cc:4051 #10 0x08178343 in dispatch_command(enum_server_command, THD*, char*, unsigned) (command=COM_QUERY, thd=0x8b465a8, packet=0x8b40419 "DELETE TableA, TableB FROM a As TableA LEFT JOIN b As Tabl eB ON TableB.apk =\nTableA.pk", packet_length=87) at sql_parse.cc:1463 #11 0x08177c57 in do_command(THD*) (thd=0x8b465a8) at sql_parse.cc:1278 #12 0x0817713f in handle_one_connection (arg=0x0) at sql_parse.cc:1022 #13 0x40062f60 in pthread_start_thread () from /lib/i686/libpthread.so.0 #14 0x400630fe in pthread_start_thread_event () from /lib/i686/libpthread.so.0 #15 0x401f5327 in clone () from /lib/i686/libc.so.6 (gdb) print *prebuilt $1 = {magic_n = 78540783, table = 0x402cca68, trx = 0x402cac68, sql_stat_start = 0, mysql_has_locked = 1, clust_index_was_generated = 1, index = 0x402cd468, read_just_key = 0, used_in_HANDLER = 0, template_type = 0, n_template = 2, null_bitmap_len = 1, need_to_access_clustered = 1, templ_contains_blob = 0, mysql_template = 0x402cf868, heap = 0x402cff28, ins_node = 0x0, ins_upd_rec_buff = 0x0, hint_need_to_fetch_extra_cols = 0, upd_node = 0x402cbe10, ins_graph = 0x0, upd_graph = 0x402cc068, pcur = 0x402d0268, clust_pcur = 0x402d0368, sel_graph = 0x402cbd28, search_tuple = 0x402cf128, row_id = "\000\000\000\000\000", clust_ref = 0x402cbc68, select_lock_type = 5, stored_select_lock_type = 5, mysql_row_len = 9, n_rows_fetched = 0, fetch_direction = 4, fetch_cache = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, fetch_cache_first = 0, n_fetch_cached = 0, blob_heap = 0x0, old_vers_heap = 0x0, magic_n2 = 78540783} (gdb) print *table $2 = {id = {high = 0, low = 134322}, type = 1, heap = 0x402cdd28, name = 0x402cb9f8 "test/b", dir_path_of_temp_table = 0x0, space = 0, ibd_file_missing = 0, tablespace_discarded = 0, name_hash = 0x0, id_hash = 0x0, n_def = 6, n_cols = 6, cols = 0x402cb868, indexes = { count = 2, start = 0x402cd468, end = 0x402cd568}, foreign_list = { count = 0, start = 0x0, end = 0x0}, referenced_list = {count = 0, start = 0x0, end = 0x0}, table_LRU = {prev = 0x0, next = 0x402cd668}, mem_fix = 0, n_mysql_handles_opened = 1, n_foreign_key_checks_running = 0, cached = 1, auto_inc_lock = 0x402cb970, query_cache_inv_trx_id = {high = 0, low = 0}, locks = {count = 1, start = 0x402ca668, end = 0x402ca668}, mix_id = {high = 0, low = 0}, mix_len = 0, mix_id_len = 4, mix_id_buf = "\006\000\000\000\000\000\000\000\004\000\000", cluster_name = 0x0, does_not_fit_in_memory = 0, stat_n_rows = 0, stat_clustered_index_size = 1, stat_sum_of_other_index_sizes = 1, stat_initialized = 1, stat_modified_counter = 0, autoinc_mutex = { lock_word = 0, os_fast_mutex = {global = {__m_reserved = 0, __m_count = 0, __m_owner = 0x0, __m_kind = 0, __m_lock = {__status = 0, __spinlock = 0}}, mutex = {__m_reserved = 0, __m_count = 0, __m_owner = 0x0, __m_kind = 3, __m_lock = {__status = 0, __spinlock = 0}}, file = 0x84046b2 "os0sync.c", line = 574, count = 0, thread = 0}, waiters = 0, list = {prev = 0x402ceacc, next = 0x402cfccc}, level = 999, cfile_name = 0x83e629d "dict0mem.c", cline = 87, magic_n = 979585}, autoinc_inited = 0, autoinc = 555127459240, magic_n = 76333786} (gdb) ---------------------------------- Breakpoint 1, row_search_for_mysql (buf=0x8b55a30 "ÿ", mode=1, prebuilt=0x402c4668, match_mode=0, direction=0) at row0sel.c:2787 2787 dict_index_t* index = prebuilt->index; (gdb) next 2788 dtuple_t* search_tuple = prebuilt->search_tuple; (gdb) 2789 btr_pcur_t* pcur = prebuilt->pcur; (gdb) 2790 trx_t* trx = prebuilt->trx; (gdb) print *index $6 = {id = {high = 0, low = 584383}, heap = 0x402cd428, type = 1, name = 0x402cd668 "GEN_CLUST_INDEX", table_name = 0x402c45a0 "test/b", table = 0x402c4468, space = 0, page_no = 899, trx_id_offset = 6, n_user_defined_cols = 0, n_uniq = 1, n_def = 5, n_fields = 5, fields = 0x402cd678, indexes = {prev = 0x0, next = 0x402cd568}, tree = 0x402cd868, tree_indexes = {prev = 0x0, next = 0x0}, cached = 1, search_info = 0x402cd6e0, stat_n_diff_key_vals = 0x402cd728, stat_index_size = 1, stat_n_leaf_pages = 1, magic_n = 76789786} (gdb) next 2797 ulint err = DB_SUCCESS; (gdb) 2803 ibool unique_search = FALSE; (gdb) 2804 ibool unique_search_from_clust_index = FALSE; (gdb) 2805 ibool mtr_has_extra_clust_latch = FALSE; (gdb) 2806 ibool moves_up = FALSE; (gdb) 2807 ibool set_also_gap_locks = TRUE; (gdb) 2820 if (prebuilt->magic_n != ROW_PREBUILT_ALLOCATED) { (gdb) 2833 if (trx->n_mysql_tables_in_use == 0) { (gdb) 2852 if (trx->has_search_latch (gdb) 2869 if (direction == 0) { (gdb) 2870 trx->op_info = "starting index read"; (gdb) 2872 prebuilt->n_rows_fetched = 0; (gdb) 2873 prebuilt->n_fetch_cached = 0; (gdb) 2874 prebuilt->fetch_cache_first = 0; (gdb) 2876 if (prebuilt->sel_graph == NULL) { (gdb) 2941 if (match_mode == ROW_SEL_EXACT (gdb) 2968 mtr_start(&mtr); (gdb) 2979 if (unique_search (gdb) 3083 if (trx->has_search_latch) { (gdb) 3088 trx_start_if_not_started(trx); (gdb) 3090 if (trx->isolation_level <= TRX_ISO_READ_COMMITTED (gdb) 3111 if (direction == 0) { (gdb) 3112 if (mode == PAGE_CUR_GE || mode == PAGE_CUR_G) { (gdb) 3113 moves_up = TRUE; (gdb) 3116 moves_up = TRUE; (gdb) 3119 thr = que_fork_get_first_thr(prebuilt->sel_graph); (gdb) 3121 que_thr_move_to_run_state_for_mysql(thr, trx); (gdb) 3123 clust_index = dict_table_get_first_index(index->table); (gdb) 3125 if (direction != 0) { (gdb) 3132 } else if (dtuple_get_n_fields(search_tuple) > 0) { (gdb) 3138 if (mode == PAGE_CUR_G) { (gdb) 3139 btr_pcur_open_at_index_side(TRUE, index, (gdb) 3147 if (!prebuilt->sql_stat_start) { (gdb) 3160 } else if (prebuilt->select_lock_type == LOCK_NONE) { (gdb) 3167 if (prebuilt->select_lock_type == LOCK_S) { (gdb) 3170 err = lock_table(0, index->table, LOCK_IX, thr); (gdb) 3173 if (err != DB_SUCCESS) { (gdb) 3177 prebuilt->sql_stat_start = FALSE; (gdb) 3184 rec = btr_pcur_get_rec(pcur); (gdb) 3192 if (rec == page_get_infimum_rec(buf_frame_align(rec))) { (gdb) 3570 if (mtr_has_extra_clust_latch) { (gdb) 3591 if (moves_up) { (gdb) 3592 moved = btr_pcur_move_to_next(pcur, &mtr); (gdb) 3597 if (!moved) { (gdb) 3184 rec = btr_pcur_get_rec(pcur); (gdb) 3192 if (rec == page_get_infimum_rec(buf_frame_align(rec))) { (gdb) 3201 if (rec == page_get_supremum_rec(buf_frame_align(rec))) { (gdb) 3203 if (prebuilt->select_lock_type != LOCK_NONE (gdb) 3212 if ( srv_locks_unsafe_for_binlog == FALSE ) (gdb) 3214 err = sel_set_rec_lock(rec, index, (gdb) 3219 if (err != DB_SUCCESS) { (gdb) 3227 goto next_rec; (gdb) 3570 if (mtr_has_extra_clust_latch) { (gdb) 3591 if (moves_up) { (gdb) 3592 moved = btr_pcur_move_to_next(pcur, &mtr); (gdb) 3597 if (!moved) { (gdb) 3598 btr_pcur_store_position(pcur, &mtr); (gdb) 3600 if (match_mode != 0) { (gdb) 3606 goto normal_return; (gdb) 3648 que_thr_stop_for_mysql_no_error(thr, trx); (gdb) 3650 mtr_commit(&mtr); (gdb) 3652 if (prebuilt->n_fetch_cached > 0) { (gdb) 3661 if (ret == DB_SUCCESS) { (gdb) 3665 trx->op_info = ""; (gdb) 3667 return(ret); (gdb) 3668 } (gdb) ha_innobase::index_read(char*, char const*, unsigned, ha_rkey_function) ( this=0x8b55928, buf=0x5dd <Address 0x5dd out of bounds>, key_ptr=0x0, key_len=1501, find_flag=HA_READ_AFTER_KEY) at ha_innodb.cc:179 179 { Current language: auto; currently c++ (gdb) 180 if (srv_thread_concurrency >= 500) { (gdb) 185 srv_conc_exit_innodb(trx); (gdb) 2990 if (ret == DB_SUCCESS) { (gdb) 2994 } else if (ret == DB_RECORD_NOT_FOUND) { (gdb) 2998 } else if (ret == DB_END_OF_INDEX) { (gdb) 2999 error = HA_ERR_KEY_NOT_FOUND; (gdb) 3000 table->status = STATUS_NOT_FOUND; (gdb) 3003 table->status = STATUS_NOT_FOUND; (gdb) 3006 DBUG_RETURN(error); (gdb) 3007 } (gdb) c Continuing. Breakpoint 1, row_search_for_mysql (buf=0x8b47ac0 "ý\001", mode=1, prebuilt=0x402c3068, match_mode=0, direction=0) at row0sel.c:2787 2787 dict_index_t* index = prebuilt->index; Current language: auto; currently c (gdb) next 2788 dtuple_t* search_tuple = prebuilt->search_tuple; (gdb) 2789 btr_pcur_t* pcur = prebuilt->pcur; (gdb) 2790 trx_t* trx = prebuilt->trx; (gdb) 2797 ulint err = DB_SUCCESS; (gdb) 2803 ibool unique_search = FALSE; (gdb) 2804 ibool unique_search_from_clust_index = FALSE; (gdb) print *index $7 = {id = {high = 0, low = 584381}, heap = 0x402c3228, type = 1, name = 0x402c3468 "GEN_CLUST_INDEX", table_name = 0x402cc5a0 "test/a", table = 0x402cc468, space = 0, page_no = 918, trx_id_offset = 6, n_user_defined_cols = 0, n_uniq = 1, n_def = 4, n_fields = 4, fields = 0x402c3478, indexes = {prev = 0x0, next = 0x402c3368}, tree = 0x402c3668, tree_indexes = {prev = 0x0, next = 0x0}, cached = 1, search_info = 0x402c34d0, stat_n_diff_key_vals = 0x402c3518, stat_index_size = 1, stat_n_leaf_pages = 1, magic_n = 76789786} (gdb) next 2805 ibool mtr_has_extra_clust_latch = FALSE; (gdb) 2806 ibool moves_up = FALSE; (gdb) 2807 ibool set_also_gap_locks = TRUE; (gdb) 2820 if (prebuilt->magic_n != ROW_PREBUILT_ALLOCATED) { (gdb) 2833 if (trx->n_mysql_tables_in_use == 0) { (gdb) 2852 if (trx->has_search_latch (gdb) 2869 if (direction == 0) { (gdb) c Continuing. 041102 9:10:40InnoDB: Assertion failure in thread 147466 in file row0mysql.c li ne 1122 InnoDB: Failing assertion: node->pcur->rel_pos == BTR_PCUR_ON InnoDB: We intentionally generate a memory trap. InnoDB: Submit a detailed bug report to http://bugs.mysql.com. InnoDB: If you get repeated assertion failures or crashes, even InnoDB: immediately after the mysqld startup, there may be InnoDB: corruption in the InnoDB tablespace. Please refer to InnoDB: http://dev.mysql.com/doc/mysql/en/Forcing_recovery.html InnoDB: about forcing recovery. Program received signal SIGSEGV, Segmentation fault. 0x08270551 in row_update_for_mysql (mysql_rec=0x8b55a30 "ÿ", prebuilt=0x402c4668) at row0mysql.c:1122 1122 ut_a(node->pcur->rel_pos == BTR_PCUR_ON); (gdb)
[4 Nov 2004 17:14]
MySQL Verification Team
An interim note. A bug exists in 4.0 as well.
[4 Nov 2004 17:30]
Heikki Tuuri
Hi! This may be a duplicate of bug #5837 for which Sergey Petrunia has a patch. I am reassigning this bug report to Sergey. Regards, Heikki
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.060 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.