diff options
author | Kentoku SHIBA <kentokushiba@gmail.com> | 2020-03-03 02:50:40 +0900 |
---|---|---|
committer | Kentoku SHIBA <kentokushiba@gmail.com> | 2020-06-05 17:29:57 +0900 |
commit | e954d9de886aebc68c39240304fe97ae88276dbb (patch) | |
tree | 494f00cae65f3034182245a94785579ae09be99e /storage | |
parent | 8e6e5acef1517ebf0c645a7e704bede8f7366b2d (diff) | |
download | mariadb-git-e954d9de886aebc68c39240304fe97ae88276dbb.tar.gz |
MDEV-19002 Spider performance optimization with partition
Change the following function for batch call instead of each partition
- store_lock
- external_lock
- start_stmt
- extra
- cond_push
- info_push
- top_table
Diffstat (limited to 'storage')
-rw-r--r-- | storage/spider/ha_spider.cc | 2955 | ||||
-rw-r--r-- | storage/spider/ha_spider.h | 69 | ||||
-rw-r--r-- | storage/spider/mysql-test/spider/bugfix/include/insert_select_deinit.inc | 16 | ||||
-rw-r--r-- | storage/spider/mysql-test/spider/bugfix/include/insert_select_init.inc | 43 | ||||
-rw-r--r-- | storage/spider/mysql-test/spider/bugfix/t/insert_select.cnf | 3 | ||||
-rw-r--r-- | storage/spider/mysql-test/spider/bugfix/t/insert_select.test | 99 | ||||
-rw-r--r-- | storage/spider/spd_conn.cc | 43 | ||||
-rw-r--r-- | storage/spider/spd_copy_tables.cc | 16 | ||||
-rw-r--r-- | storage/spider/spd_db_conn.cc | 358 | ||||
-rw-r--r-- | storage/spider/spd_db_include.h | 1 | ||||
-rw-r--r-- | storage/spider/spd_db_mysql.cc | 216 | ||||
-rw-r--r-- | storage/spider/spd_db_oracle.cc | 146 | ||||
-rw-r--r-- | storage/spider/spd_group_by_handler.cc | 20 | ||||
-rw-r--r-- | storage/spider/spd_include.h | 127 | ||||
-rw-r--r-- | storage/spider/spd_table.cc | 456 | ||||
-rw-r--r-- | storage/spider/spd_table.h | 26 | ||||
-rw-r--r-- | storage/spider/spd_trx.cc | 132 | ||||
-rw-r--r-- | storage/spider/spd_trx.h | 4 |
18 files changed, 2794 insertions, 1936 deletions
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index a7cfe45c8f7..c21f2bdb1ae 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -76,11 +76,8 @@ ha_spider::ha_spider( spider_alloc_calc_mem_init(mem_calc, 139); spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this)); share = NULL; - trx = NULL; conns = NULL; need_mons = NULL; - condition = NULL; - cond_check = FALSE; blob_buff = NULL; conn_keys = NULL; spider_thread_id = 0; @@ -90,10 +87,9 @@ ha_spider::ha_spider( trx_hs_w_conn_adjustment = 0; #endif search_link_query_id = 0; - searched_bitmap = NULL; #ifdef WITH_PARTITION_STORAGE_ENGINE partition_handler_share = NULL; - pt_handler_share_creator = NULL; + pt_handler_share_owner = FALSE; #endif #ifdef HA_MRR_USE_DEFAULT_IMPL multi_range_keys = NULL; @@ -102,7 +98,6 @@ ha_spider::ha_spider( append_tblnm_alias = NULL; use_index_merge = FALSE; is_clone = FALSE; - clone_bitmap_init = FALSE; pt_clone_source_handler = NULL; pt_clone_last_searcher = NULL; ft_handler = NULL; @@ -116,6 +111,7 @@ ha_spider::ha_spider( #ifdef SPIDER_HAS_GROUP_BY_HANDLER use_fields = FALSE; #endif + dml_inited = FALSE; use_pre_call = FALSE; use_pre_action = FALSE; #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS @@ -128,10 +124,6 @@ ha_spider::ha_spider( hs_decrement = FALSE; hs_pushed_strref_num = 0; #endif - direct_update_fields = NULL; -#endif -#ifdef INFO_KIND_FORCE_LIMIT_BEGIN - info_limit = 9223372036854775807LL; #endif #ifdef HA_CAN_BULK_ACCESS is_bulk_access_clone = FALSE; @@ -188,11 +180,8 @@ ha_spider::ha_spider( spider_alloc_calc_mem_init(mem_calc, 0); spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this)); share = NULL; - trx = NULL; conns = NULL; need_mons = NULL; - condition = NULL; - cond_check = FALSE; blob_buff = NULL; conn_keys = NULL; spider_thread_id = 0; @@ -202,10 +191,9 @@ ha_spider::ha_spider( trx_hs_w_conn_adjustment = 0; #endif search_link_query_id = 0; - searched_bitmap = NULL; #ifdef WITH_PARTITION_STORAGE_ENGINE partition_handler_share = NULL; - pt_handler_share_creator = NULL; + pt_handler_share_owner = FALSE; #endif #ifdef HA_MRR_USE_DEFAULT_IMPL multi_range_keys = NULL; @@ -214,7 +202,6 @@ ha_spider::ha_spider( append_tblnm_alias = NULL; use_index_merge = FALSE; is_clone = FALSE; - clone_bitmap_init = FALSE; pt_clone_source_handler = NULL; pt_clone_last_searcher = NULL; ft_handler = NULL; @@ -228,6 +215,7 @@ ha_spider::ha_spider( #ifdef SPIDER_HAS_GROUP_BY_HANDLER use_fields = FALSE; #endif + dml_inited = FALSE; use_pre_call = FALSE; use_pre_action = FALSE; #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS @@ -240,10 +228,6 @@ ha_spider::ha_spider( hs_decrement = FALSE; hs_pushed_strref_num = 0; #endif - direct_update_fields = NULL; -#endif -#ifdef INFO_KIND_FORCE_LIMIT_BEGIN - info_limit = 9223372036854775807LL; #endif #ifdef HA_CAN_BULK_ACCESS is_bulk_access_clone = FALSE; @@ -295,6 +279,19 @@ ha_spider::~ha_spider() { DBUG_ENTER("ha_spider::~ha_spider"); DBUG_PRINT("info",("spider this=%p", this)); +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (pt_handler_share_owner) + { + spider_free(spider_current_trx, partition_handler_share, MYF(0)); + pt_handler_share_owner = FALSE; + } + partition_handler_share = NULL; +#endif + if (wide_handler_owner) + { + spider_free(spider_current_trx, wide_handler, MYF(0)); + } + wide_handler = NULL; spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this)); DBUG_VOID_RETURN; } @@ -340,14 +337,16 @@ int ha_spider::open( THD *thd = ha_thd(); int error_num, roop_count; int init_sql_alloc_size; + ha_spider *spider, *owner; + bool wide_handler_alloc = FALSE; + SPIDER_WIDE_SHARE *wide_share; #ifdef WITH_PARTITION_STORAGE_ENGINE - SPIDER_PARTITION_SHARE *partition_share; - uchar *idx_read_bitmap, *idx_write_bitmap, - *rnd_read_bitmap, *rnd_write_bitmap; uint part_num; - bool create_pt_handler_share = FALSE, pt_handler_mutex = FALSE, - may_be_clone = FALSE; - ha_spider **pt_handler_share_handlers; + bool pt_handler_share_alloc = FALSE; + bool pt_handler_mutex = FALSE; + ha_spider **pt_handler_share_handlers = NULL; + ha_partition *clone_source; + ha_spider *pt_handler_share_key; #ifdef SPIDER_HAS_HASH_VALUE_TYPE my_hash_value_type hash_value; #endif @@ -357,52 +356,50 @@ int ha_spider::open( dup_key_idx = (uint) -1; conn_kinds = SPIDER_CONN_KIND_MYSQL; - if (!spider_get_share(name, table, thd, this, &error_num)) - goto error_get_share; - thr_lock_data_init(&share->lock,&lock,NULL); - #ifdef WITH_PARTITION_STORAGE_ENGINE - partition_share = share->partition_share; table->file->get_no_parts("", &part_num); - if (partition_share) + if (part_num) { - pt_handler_mutex = TRUE; - pthread_mutex_lock(&partition_share->pt_handler_mutex); -/* - if ( - !partition_share->partition_handler_share || - partition_share->partition_handler_share->table != table - ) - create_pt_handler_share = TRUE; -*/ -#ifdef SPIDER_HAS_HASH_VALUE_TYPE - hash_value = my_calc_hash(&partition_share->pt_handler_hash, - (uchar*) &table, sizeof(TABLE *)); - if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE*) - my_hash_search_using_hash_value(&partition_share->pt_handler_hash, - hash_value, (uchar*) &table, sizeof(TABLE *)))) -#else - if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE*) - my_hash_search(&partition_share->pt_handler_hash, (uchar*) &table, - sizeof(TABLE *)))) -#endif + pt_handler_share_handlers = + (ha_spider **) ((ha_partition *) table->file)->get_child_handlers(); + spider = pt_handler_share_handlers[0]; + owner = pt_handler_share_handlers[part_num - 1]; + clone_source = ((ha_partition *) table->file)->get_clone_source(); + if (clone_source) { - create_pt_handler_share = TRUE; + pt_handler_share_key = (ha_spider *) + clone_source->get_child_handlers()[0]; + is_clone = TRUE; + } else { + pt_handler_share_key = spider; } - } - - if (create_pt_handler_share) - { - if (!(searched_bitmap = (uchar *) - spider_bulk_malloc(spider_current_trx, 15, MYF(MY_WME), + } else { +#endif + spider = this; + owner = this; +#ifdef WITH_PARTITION_STORAGE_ENGINE + clone_source = NULL; + pt_handler_share_key = this; + } +#endif + if (!spider->wide_handler) + { + uchar *searched_bitmap; + uchar *ft_discard_bitmap; + uchar *position_bitmap; + uchar *idx_read_bitmap; + uchar *idx_write_bitmap; + uchar *rnd_read_bitmap; + uchar *rnd_write_bitmap; + if (!(wide_handler = (SPIDER_WIDE_HANDLER *) + spider_bulk_malloc(spider_current_trx, 16, MYF(MY_WME | MY_ZEROFILL), + &wide_handler, sizeof(SPIDER_WIDE_HANDLER), &searched_bitmap, (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), &ft_discard_bitmap, (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), &position_bitmap, (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), - &partition_handler_share, - (uint) sizeof(SPIDER_PARTITION_HANDLER_SHARE), &idx_read_bitmap, (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), &idx_write_bitmap, @@ -411,103 +408,103 @@ int ha_spider::open( (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), &rnd_write_bitmap, (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), - &pt_handler_share_handlers, - (uint) sizeof(ha_spider *) * part_num, NullS)) ) { error_num = HA_ERR_OUT_OF_MEM; - goto error_searched_bitmap_alloc; - } - DBUG_PRINT("info",("spider create partition_handler_share")); - partition_handler_share->use_count = 1; -/* - if (partition_handler_share->use_count < part_num) - partition_share->partition_handler_share = partition_handler_share; -*/ - DBUG_PRINT("info",("spider table=%p", table)); - partition_handler_share->table = table; - partition_handler_share->searched_bitmap = NULL; - partition_handler_share->ft_discard_bitmap = NULL; - partition_handler_share->idx_read_bitmap = idx_read_bitmap; - partition_handler_share->idx_write_bitmap = idx_write_bitmap; - partition_handler_share->rnd_read_bitmap = rnd_read_bitmap; - partition_handler_share->rnd_write_bitmap = rnd_write_bitmap; - partition_handler_share->between_flg = FALSE; - partition_handler_share->idx_bitmap_is_set = FALSE; - partition_handler_share->rnd_bitmap_is_set = FALSE; - partition_handler_share->table_hash_value = hash_value; - partition_handler_share->creator = this; - partition_handler_share->parallel_search_query_id = 0; - pt_handler_share_creator = this; - if (part_num) - { - partition_handler_share->handlers = (void **) pt_handler_share_handlers; - partition_handler_share->handlers[0] = this; - } else - partition_handler_share->handlers = NULL; - uint old_elements = partition_share->pt_handler_hash.array.max_element; -#ifdef HASH_UPDATE_WITH_HASH_VALUE - if (my_hash_insert_with_hash_value(&partition_share->pt_handler_hash, - hash_value, (uchar*) partition_handler_share)) + goto error_wide_handler_alloc; + } + spider->wide_handler = wide_handler; + owner->wide_handler = wide_handler; + wide_handler->searched_bitmap = searched_bitmap; + wide_handler->ft_discard_bitmap = ft_discard_bitmap; + wide_handler->position_bitmap = position_bitmap; + wide_handler->idx_read_bitmap = idx_read_bitmap; + wide_handler->idx_write_bitmap = idx_write_bitmap; + wide_handler->rnd_read_bitmap = rnd_read_bitmap; + wide_handler->rnd_write_bitmap = rnd_write_bitmap; + wide_handler->owner = owner; + owner->wide_handler_owner = TRUE; + memset(wide_handler->ft_discard_bitmap, 0xFF, + no_bytes_in_map(table->read_set)); + memset(wide_handler->searched_bitmap, 0, + no_bytes_in_map(table->read_set)); + wide_handler_alloc = TRUE; + } else { + wide_handler = spider->wide_handler; + } + if (!share && !spider_get_share(name, table, thd, this, &error_num)) + goto error_get_share; + + wide_share = share->wide_share; + if (wide_handler_alloc) + { + thr_lock_data_init(&wide_share->lock, &wide_handler->lock, NULL); + } + +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (!wide_handler->partition_handler_share) + { + pt_handler_mutex = TRUE; + pthread_mutex_lock(&wide_share->pt_handler_mutex); +#ifdef SPIDER_HAS_HASH_VALUE_TYPE + hash_value = my_calc_hash(&wide_share->pt_handler_hash, + (uchar*) pt_handler_share_key, sizeof(ha_spider *)); + if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE*) + my_hash_search_using_hash_value(&wide_share->pt_handler_hash, + hash_value, (uchar*) pt_handler_share_key, sizeof(ha_spider *)))) #else - if (my_hash_insert(&partition_share->pt_handler_hash, - (uchar*) partition_handler_share)) + if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE*) + my_hash_search(&wide_share->pt_handler_hash, + (uchar*) pt_handler_share_key, sizeof(ha_spider *)))) #endif { - error_num = HA_ERR_OUT_OF_MEM; - goto error_hash_insert; - } - if (partition_share->pt_handler_hash.array.max_element > old_elements) - { - spider_alloc_calc_mem(spider_current_trx, - partition_share->pt_handler_hash, - (partition_share->pt_handler_hash.array.max_element - old_elements) * - partition_share->pt_handler_hash.array.size_of_element); - } - pthread_mutex_unlock(&partition_share->pt_handler_mutex); - pt_handler_mutex = FALSE; - } else { + if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE *) + spider_bulk_malloc(spider_current_trx, 15, MYF(MY_WME | MY_ZEROFILL), + &partition_handler_share, sizeof(SPIDER_PARTITION_HANDLER_SHARE), + NullS)) + ) { + error_num = HA_ERR_OUT_OF_MEM; + goto error_partition_handler_share_alloc; + } + DBUG_PRINT("info",("spider create partition_handler_share")); + DBUG_PRINT("info",("spider table=%p", table)); + partition_handler_share->table = table; + partition_handler_share->table_hash_value = hash_value; + partition_handler_share->no_parts = part_num; + partition_handler_share->owner = owner; + partition_handler_share->parallel_search_query_id = 0; + spider->partition_handler_share = partition_handler_share; + owner->partition_handler_share = partition_handler_share; + owner->pt_handler_share_owner = TRUE; + partition_handler_share->handlers = pt_handler_share_handlers; + uint old_elements = wide_share->pt_handler_hash.array.max_element; +#ifdef HASH_UPDATE_WITH_HASH_VALUE + if (my_hash_insert_with_hash_value(&wide_share->pt_handler_hash, + hash_value, (uchar*) partition_handler_share)) +#else + if (my_hash_insert(&wide_share->pt_handler_hash, + (uchar*) partition_handler_share)) #endif - if (!(searched_bitmap = (uchar *) - spider_bulk_malloc(spider_current_trx, 16, MYF(MY_WME), - &searched_bitmap, sizeof(uchar) * no_bytes_in_map(table->read_set), - &ft_discard_bitmap, sizeof(uchar) * no_bytes_in_map(table->read_set), - &position_bitmap, sizeof(uchar) * no_bytes_in_map(table->read_set), - NullS)) - ) { - error_num = HA_ERR_OUT_OF_MEM; - goto error_searched_bitmap_alloc; - } -#ifdef WITH_PARTITION_STORAGE_ENGINE - if (partition_share) - { - DBUG_PRINT("info",("spider copy partition_handler_share")); -/* - partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE *) - partition_share->partition_handler_share; -*/ - if (part_num) { - if (partition_handler_share->use_count >= part_num) - may_be_clone = TRUE; - else { - partition_handler_share->handlers[ - partition_handler_share->use_count] = this; - partition_handler_share->use_count++; - } + error_num = HA_ERR_OUT_OF_MEM; + goto error_hash_insert; + } + if (wide_share->pt_handler_hash.array.max_element > old_elements) + { + spider_alloc_calc_mem(spider_current_trx, + wide_share->pt_handler_hash, + (wide_share->pt_handler_hash.array.max_element - + old_elements) * + wide_share->pt_handler_hash.array.size_of_element); } -/* - if (partition_handler_share->use_count == part_num) - partition_share->partition_handler_share = NULL; -*/ - pthread_mutex_unlock(&partition_share->pt_handler_mutex); - pt_handler_mutex = FALSE; } + pthread_mutex_unlock(&wide_share->pt_handler_mutex); + pt_handler_mutex = FALSE; + pt_handler_share_alloc = TRUE; + } else { + partition_handler_share = wide_handler->partition_handler_share; } #endif - memset(ft_discard_bitmap, 0xFF, no_bytes_in_map(table->read_set)); - memset(searched_bitmap, 0, no_bytes_in_map(table->read_set)); - init_sql_alloc_size = spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size); @@ -566,10 +563,6 @@ int ha_spider::open( } } -#ifdef WITH_PARTITION_STORAGE_ENGINE - if (may_be_clone && thd_sql_command(thd) != SQLCOM_ALTER_TABLE) - is_clone = TRUE; -#endif if (is_clone) { #ifdef WITH_PARTITION_STORAGE_ENGINE @@ -577,28 +570,38 @@ int ha_spider::open( { for (roop_count = 0; roop_count < (int) part_num; roop_count++) { - if (((ha_spider *) partition_handler_share->handlers[roop_count])-> - share == share) + if (partition_handler_share->handlers[roop_count]->share == share) { pt_clone_source_handler = - (ha_spider *) partition_handler_share->handlers[roop_count]; + partition_handler_share->handlers[roop_count]; break; } } } #endif - sql_command = pt_clone_source_handler->sql_command; - result_list.lock_type = pt_clone_source_handler->result_list.lock_type; - lock_mode = pt_clone_source_handler->lock_mode; + wide_handler->external_lock_type = + pt_clone_source_handler->wide_handler->external_lock_type; - if (!pt_clone_source_handler->clone_bitmap_init) + if (wide_handler_alloc) { - pt_clone_source_handler->set_select_column_mode(); - pt_clone_source_handler->clone_bitmap_init = TRUE; + wide_handler->lock_mode = + pt_clone_source_handler->wide_handler->lock_mode; + if (!partition_handler_share->clone_bitmap_init) + { + pt_clone_source_handler->set_select_column_mode(); + partition_handler_share->clone_bitmap_init = TRUE; + } + set_clone_searched_bitmap(); + wide_handler->position_bitmap_init = FALSE; + wide_handler->sql_command = + pt_clone_source_handler->wide_handler->sql_command; + } + } else { + if (share->semi_table_lock) + { + wide_handler->semi_table_lock = TRUE; } - set_clone_searched_bitmap(); - position_bitmap_init = FALSE; } #ifdef HA_CAN_BULK_ACCESS external_lock_cnt = 0; @@ -618,50 +621,55 @@ error_reset: error_init_blob_buff: error_init_result_list: #ifdef WITH_PARTITION_STORAGE_ENGINE - if ( - partition_handler_share && - pt_handler_share_creator == this - ) { - partition_share = share->partition_share; +error_hash_insert: + if (pt_handler_share_alloc) + { + wide_share = share->wide_share; if (!pt_handler_mutex) - pthread_mutex_lock(&partition_share->pt_handler_mutex); -/* - if (partition_share->partition_handler_share == partition_handler_share) - partition_share->partition_handler_share = NULL; -*/ + pthread_mutex_lock(&wide_share->pt_handler_mutex); #ifdef HASH_UPDATE_WITH_HASH_VALUE - my_hash_delete_with_hash_value(&partition_share->pt_handler_hash, + my_hash_delete_with_hash_value(&wide_share->pt_handler_hash, partition_handler_share->table_hash_value, (uchar*) partition_handler_share); #else - my_hash_delete(&partition_share->pt_handler_hash, + my_hash_delete(&wide_share->pt_handler_hash, (uchar*) partition_handler_share); #endif - pthread_mutex_unlock(&partition_share->pt_handler_mutex); + pthread_mutex_unlock(&wide_share->pt_handler_mutex); pt_handler_mutex = FALSE; + spider_free(spider_current_trx, partition_handler_share, MYF(0)); + spider->partition_handler_share = NULL; + owner->partition_handler_share = NULL; + owner->pt_handler_share_owner = FALSE; } -error_hash_insert: - partition_handler_share = NULL; - pt_handler_share_creator = NULL; -#endif - if (searched_bitmap) - { - spider_free(spider_current_trx, searched_bitmap, MYF(0)); - searched_bitmap = NULL; - } -error_searched_bitmap_alloc: -#ifdef WITH_PARTITION_STORAGE_ENGINE +error_partition_handler_share_alloc: if (pt_handler_mutex) - pthread_mutex_unlock(&partition_share->pt_handler_mutex); + pthread_mutex_unlock(&wide_share->pt_handler_mutex); + partition_handler_share = NULL; #endif spider_free_share(share); share = NULL; -error_get_share: if (conn_keys) { spider_free(spider_current_trx, conn_keys, MYF(0)); conn_keys = NULL; } +error_get_share: + if (wide_handler_alloc) + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (pt_handler_share_handlers) + { + pt_handler_share_handlers[0]->wide_handler = NULL; + } +#endif + spider_free(spider_current_trx, wide_handler, MYF(0)); + spider->wide_handler = NULL; + owner->wide_handler = NULL; + owner->wide_handler_owner = FALSE; + } + wide_handler = NULL; +error_wide_handler_alloc: DBUG_RETURN(error_num); } @@ -669,9 +677,7 @@ int ha_spider::close() { int error_num = 0, roop_count, error_num2; THD *thd = ha_thd(); -#ifdef WITH_PARTITION_STORAGE_ENGINE - SPIDER_PARTITION_SHARE *partition_share; -#endif + SPIDER_WIDE_SHARE *wide_share; backup_error_status(); DBUG_ENTER("ha_spider::close"); DBUG_PRINT("info",("spider this=%p", this)); @@ -697,8 +703,8 @@ int ha_spider::close() bulk_access_link_first->spider)); DBUG_PRINT("info",("spider bulk_access_link->spider->dbton_handler=%p", bulk_access_link_first->spider->dbton_handler)); - DBUG_PRINT("info",("spider ptr bulk_access_link->spider->dbton_handler=%p", - &bulk_access_link_first->spider->dbton_handler)); + DBUG_PRINT("info",("spider ptr bulk_access_link->spider->dbton_handler=" + "%p", &bulk_access_link_first->spider->dbton_handler)); bulk_access_link_current = bulk_access_link_first->next; delete_bulk_access_link(bulk_access_link_first); bulk_access_link_first = bulk_access_link_current; @@ -761,34 +767,30 @@ int ha_spider::close() conn_keys = NULL; } #ifdef WITH_PARTITION_STORAGE_ENGINE - if ( - partition_handler_share && - pt_handler_share_creator == this - ) { - partition_share = share->partition_share; - pthread_mutex_lock(&partition_share->pt_handler_mutex); -/* - if (partition_share->partition_handler_share == partition_handler_share) - partition_share->partition_handler_share = NULL; -*/ + if (pt_handler_share_owner) + { + wide_share = share->wide_share; + pthread_mutex_lock(&wide_share->pt_handler_mutex); #ifdef HASH_UPDATE_WITH_HASH_VALUE - my_hash_delete_with_hash_value(&partition_share->pt_handler_hash, + my_hash_delete_with_hash_value(&wide_share->pt_handler_hash, partition_handler_share->table_hash_value, (uchar*) partition_handler_share); #else - my_hash_delete(&partition_share->pt_handler_hash, + my_hash_delete(&wide_share->pt_handler_hash, (uchar*) partition_handler_share); #endif - pthread_mutex_unlock(&partition_share->pt_handler_mutex); + pthread_mutex_unlock(&wide_share->pt_handler_mutex); + spider_free(spider_current_trx, partition_handler_share, MYF(0)); + pt_handler_share_owner = FALSE; } partition_handler_share = NULL; - pt_handler_share_creator = NULL; #endif - if (searched_bitmap) + if (wide_handler_owner) { - spider_free(spider_current_trx, searched_bitmap, MYF(0)); - searched_bitmap = NULL; + spider_free(spider_current_trx, wide_handler, MYF(0)); + wide_handler_owner = FALSE; } + wide_handler = NULL; if (blob_buff) { delete [] blob_buff; @@ -833,34 +835,23 @@ int ha_spider::close() } #endif #endif -#ifdef HA_CAN_BULK_ACCESS -/* - if (init_ha_mem_root) - { - free_root(&ha_mem_root, MYF(0)); - init_ha_mem_root = FALSE; - } -*/ -#endif is_clone = FALSE; pt_clone_source_handler = NULL; share = NULL; - trx = NULL; conns = NULL; DBUG_RETURN(error_num); } -int ha_spider::check_access_kind( +int ha_spider::check_access_kind_for_connection( THD *thd, bool write_request ) { int error_num, roop_count; - DBUG_ENTER("ha_spider::check_access_kind"); + DBUG_ENTER("ha_spider::check_access_kind_for_connection"); DBUG_PRINT("info",("spider this=%p", this)); - sql_command = thd_sql_command(thd); conn_kinds = 0; - switch (sql_command) + switch (wide_handler->sql_command) { #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) case SQLCOM_HS_READ: @@ -962,33 +953,60 @@ int ha_spider::check_access_kind( { DBUG_RETURN(error_num); } - DBUG_PRINT("info",("spider sql_command=%u", sql_command)); + DBUG_PRINT("info",("spider wide_handler->semi_trx_isolation_chk = %s", + wide_handler->semi_trx_isolation_chk ? "TRUE" : "FALSE")); + if (wide_handler->semi_trx_isolation_chk) + { + SPIDER_SET_CONNS_PARAM(semi_trx_isolation_chk, TRUE, conns, + share->link_statuses, conn_link_idx, (int) share->link_count, + SPIDER_LINK_STATUS_RECOVERY); + } + DBUG_PRINT("info",("spider wide_handler->semi_trx_chk = %s", + wide_handler->semi_trx_chk ? "TRUE" : "FALSE")); + if (wide_handler->semi_trx_chk) + { + SPIDER_SET_CONNS_PARAM(semi_trx_chk, TRUE, conns, share->link_statuses, + conn_link_idx, (int) share->link_count, SPIDER_LINK_STATUS_RECOVERY); + } else { + SPIDER_SET_CONNS_PARAM(semi_trx_chk, FALSE, conns, share->link_statuses, + conn_link_idx, (int) share->link_count, SPIDER_LINK_STATUS_RECOVERY); + } + DBUG_RETURN(0); +} + +void ha_spider::check_access_kind( + THD *thd +) { + DBUG_ENTER("ha_spider::check_access_kind"); + DBUG_PRINT("info",("spider this=%p", this)); + wide_handler->sql_command = thd_sql_command(thd); + DBUG_PRINT("info",("spider sql_command=%u", wide_handler->sql_command)); DBUG_PRINT("info",("spider thd->query_id=%lld", thd->query_id)); #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS #ifdef HS_HAS_SQLCOM - if (sql_command == SQLCOM_HS_UPDATE) - update_request = TRUE; + if (wide_handler->sql_command == SQLCOM_HS_UPDATE) + wide_handler->update_request = TRUE; else #endif - update_request = FALSE; + wide_handler->update_request = FALSE; #else if ( #ifdef HS_HAS_SQLCOM - sql_command == SQLCOM_HS_UPDATE || + wide_handler->sql_command == SQLCOM_HS_UPDATE || #endif - sql_command == SQLCOM_UPDATE || - sql_command == SQLCOM_UPDATE_MULTI || + wide_handler->sql_command == SQLCOM_UPDATE || + wide_handler->sql_command == SQLCOM_UPDATE_MULTI || /* for triggers */ - sql_command == SQLCOM_INSERT || - sql_command == SQLCOM_INSERT_SELECT || - sql_command == SQLCOM_DELETE || - sql_command == SQLCOM_DELETE_MULTI + wide_handler->sql_command == SQLCOM_INSERT || + wide_handler->sql_command == SQLCOM_INSERT_SELECT || + wide_handler->sql_command == SQLCOM_DELETE || + wide_handler->sql_command == SQLCOM_DELETE_MULTI ) - update_request = TRUE; + wide_handler->update_request = TRUE; else - update_request = FALSE; + wide_handler->update_request = FALSE; #endif - DBUG_RETURN(0); + DBUG_VOID_RETURN; } #ifdef HA_CAN_BULK_ACCESS @@ -1002,14 +1020,20 @@ int ha_spider::additional_lock( { if (is_bulk_access_clone) { - DBUG_RETURN(check_access_kind(thd, (lock_type >= TL_WRITE_ALLOW_WRITE))); + check_access_kind(thd); + DBUG_RETURN(check_access_kind_for_connection(thd, + (lock_type >= TL_WRITE_ALLOW_WRITE))); } else if (bulk_access_link_exec_tgt->called) { - DBUG_RETURN(bulk_access_link_exec_tgt->spider->check_access_kind( - thd, (lock_type >= TL_WRITE_ALLOW_WRITE))); + bulk_access_link_exec_tgt->spider->check_access_kind(thd); + DBUG_RETURN(bulk_access_link_exec_tgt->spider-> + check_access_kind_for_connection( + thd, (lock_type >= TL_WRITE_ALLOW_WRITE))); } } - DBUG_RETURN(check_access_kind(thd, (lock_type >= TL_WRITE_ALLOW_WRITE))); + check_access_kind(thd); + DBUG_RETURN(check_access_kind_for_connection(thd, + (lock_type >= TL_WRITE_ALLOW_WRITE))); } #endif @@ -1018,53 +1042,37 @@ THR_LOCK_DATA **ha_spider::store_lock( THR_LOCK_DATA **to, enum thr_lock_type lock_type ) { - int error_num, roop_count; DBUG_ENTER("ha_spider::store_lock"); DBUG_PRINT("info",("spider this=%p", this)); - if (lock_type == TL_IGNORE) +#ifdef WITH_PARTITION_STORAGE_ENGINE + if ( + wide_handler->stage == SPD_HND_STAGE_STORE_LOCK && + wide_handler->stage_executor != this) { - *to++ = &lock; DBUG_RETURN(to); } - if ((error_num = check_access_kind(thd, - (lock_type >= TL_WRITE_ALLOW_WRITE)))) + wide_handler->stage = SPD_HND_STAGE_STORE_LOCK; + wide_handler->stage_executor = this; +#endif + wide_handler->lock_table_type = 0; + if (lock_type == TL_IGNORE) { - store_error_num = error_num; + *to++ = &wide_handler->lock; DBUG_RETURN(to); } - DBUG_PRINT("info",("spider sql_command=%u", sql_command)); + check_access_kind(thd); + DBUG_PRINT("info",("spider sql_command=%u", wide_handler->sql_command)); DBUG_PRINT("info",("spider lock_type=%d", lock_type)); DBUG_PRINT("info",("spider thd->query_id=%lld", thd->query_id)); - if (sql_command == SQLCOM_ALTER_TABLE) - { - if (trx->query_id != thd->query_id) - { - spider_free_trx_alter_table(trx); - trx->query_id = thd->query_id; - trx->tmp_flg = FALSE; - } - if (!(SPIDER_ALTER_TABLE*) my_hash_search(&trx->trx_alter_table_hash, - (uchar*) share->table_name, share->table_name_length)) - { - if (spider_create_trx_alter_table(trx, share, FALSE)) - { - store_error_num = HA_ERR_OUT_OF_MEM; - DBUG_RETURN(to); - } - } - } - this->lock_type = lock_type; - selupd_lock_mode = spider_param_selupd_lock_mode(thd, - share->selupd_lock_mode); + wide_handler->lock_type = lock_type; if ( - sql_command != SQLCOM_DROP_TABLE && - sql_command != SQLCOM_ALTER_TABLE + wide_handler->sql_command != SQLCOM_DROP_TABLE && + wide_handler->sql_command != SQLCOM_ALTER_TABLE ) { - SPIDER_SET_CONNS_PARAM(semi_trx_chk, FALSE, conns, share->link_statuses, - conn_link_idx, (int) share->link_count, SPIDER_LINK_STATUS_RECOVERY); + wide_handler->semi_trx_chk = FALSE; } - switch (sql_command) + switch (wide_handler->sql_command) { case SQLCOM_SELECT: case SQLCOM_HA_READ: @@ -1072,17 +1080,14 @@ THR_LOCK_DATA **ha_spider::store_lock( case SQLCOM_HS_READ: #endif if (lock_type == TL_READ_WITH_SHARED_LOCKS) - lock_mode = 1; + wide_handler->lock_mode = 1; else if (lock_type <= TL_READ_NO_INSERT) { - lock_mode = 0; - SPIDER_SET_CONNS_PARAM(semi_trx_isolation_chk, TRUE, conns, - share->link_statuses, conn_link_idx, (int) share->link_count, - SPIDER_LINK_STATUS_RECOVERY); + wide_handler->lock_mode = 0; + wide_handler->semi_trx_isolation_chk = TRUE; } else - lock_mode = -1; - SPIDER_SET_CONNS_PARAM(semi_trx_chk, TRUE, conns, share->link_statuses, - conn_link_idx, (int) share->link_count, SPIDER_LINK_STATUS_RECOVERY); + wide_handler->lock_mode = -1; + wide_handler->semi_trx_chk = TRUE; break; case SQLCOM_UPDATE: case SQLCOM_UPDATE_MULTI: @@ -1103,39 +1108,37 @@ THR_LOCK_DATA **ha_spider::store_lock( #endif if (lock_type >= TL_READ && lock_type <= TL_READ_NO_INSERT) { - lock_mode = selupd_lock_mode; - SPIDER_SET_CONNS_PARAM(semi_trx_isolation_chk, TRUE, conns, - share->link_statuses, conn_link_idx, (int) share->link_count, - SPIDER_LINK_STATUS_RECOVERY); + wide_handler->lock_mode = -2; + wide_handler->semi_trx_isolation_chk = TRUE; } else - lock_mode = -1; - SPIDER_SET_CONNS_PARAM(semi_trx_chk, TRUE, conns, share->link_statuses, - conn_link_idx, (int) share->link_count, SPIDER_LINK_STATUS_RECOVERY); + wide_handler->lock_mode = -1; + wide_handler->semi_trx_chk = TRUE; break; default: - lock_mode = -1; + wide_handler->lock_mode = -1; } switch (lock_type) { case TL_READ_HIGH_PRIORITY: - high_priority = TRUE; + wide_handler->high_priority = TRUE; break; case TL_WRITE_DELAYED: - insert_delayed = TRUE; + wide_handler->insert_delayed = TRUE; break; case TL_WRITE_LOW_PRIORITY: - low_priority = TRUE; + wide_handler->low_priority = TRUE; break; default: break; } - if (lock_type != TL_IGNORE && lock.type == TL_UNLOCK) + if (wide_handler->lock_type != TL_IGNORE && + wide_handler->lock.type == TL_UNLOCK) { if ( - sql_command == SQLCOM_DROP_TABLE || - sql_command == SQLCOM_ALTER_TABLE || - sql_command == SQLCOM_SHOW_CREATE + wide_handler->sql_command == SQLCOM_DROP_TABLE || + wide_handler->sql_command == SQLCOM_ALTER_TABLE || + wide_handler->sql_command == SQLCOM_SHOW_CREATE ) { if ( lock_type == TL_READ_NO_INSERT && @@ -1148,80 +1151,36 @@ THR_LOCK_DATA **ha_spider::store_lock( ) lock_type = TL_WRITE_ALLOW_WRITE; } else if ( - sql_command == SQLCOM_LOCK_TABLES || - (spider_param_lock_exchange(thd) == 1 && share->semi_table_lock)) + wide_handler->sql_command == SQLCOM_LOCK_TABLES || + (spider_param_lock_exchange(thd) == 1 && wide_handler->semi_table_lock)) { DBUG_PRINT("info",("spider lock exchange route")); - DBUG_PRINT("info",("spider lock_type=%u", this->lock_type)); + DBUG_PRINT("info",("spider lock_type=%u", wide_handler->lock_type)); if ( ( - this->lock_type == TL_READ || - this->lock_type == TL_READ_NO_INSERT || - this->lock_type == TL_WRITE_LOW_PRIORITY || - this->lock_type == TL_WRITE + wide_handler->lock_type == TL_READ || + wide_handler->lock_type == TL_READ_NO_INSERT || + wide_handler->lock_type == TL_WRITE_LOW_PRIORITY || + wide_handler->lock_type == TL_WRITE ) && !spider_param_local_lock_table(thd) ) { - for ( - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, -1, share->link_count, - SPIDER_LINK_STATUS_RECOVERY); - roop_count < (int) share->link_count; - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, roop_count, share->link_count, - SPIDER_LINK_STATUS_RECOVERY) - ) { - SPIDER_CONN *conn = conns[roop_count]; - int appended = 0; - if ((error_num = dbton_handler[conn->dbton_id]-> - append_lock_tables_list(conn, roop_count, &appended))) - { - store_error_num = error_num; - DBUG_RETURN(to); - } - if (appended) - { - conn->table_lock = 2; - } - } + wide_handler->lock_table_type = 1; } } else { DBUG_PRINT("info",("spider default lock route")); - DBUG_PRINT("info",("spider lock_type=%u", this->lock_type)); + DBUG_PRINT("info",("spider lock_type=%u", wide_handler->lock_type)); if ( - this->lock_type == TL_READ || - this->lock_type == TL_READ_NO_INSERT || - this->lock_type == TL_WRITE_LOW_PRIORITY || - this->lock_type == TL_WRITE + wide_handler->lock_type == TL_READ || + wide_handler->lock_type == TL_READ_NO_INSERT || + wide_handler->lock_type == TL_WRITE_LOW_PRIORITY || + wide_handler->lock_type == TL_WRITE ) { - for ( - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, -1, share->link_count, - SPIDER_LINK_STATUS_RECOVERY); - roop_count < (int) share->link_count; - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, roop_count, share->link_count, - SPIDER_LINK_STATUS_RECOVERY) + if ( + !spider_param_local_lock_table(thd) && + spider_param_semi_table_lock(thd, wide_handler->semi_table_lock) ) { - if ( - conns[roop_count] && - conns[roop_count]->table_lock != 1 && - spider_param_semi_table_lock(thd, share->semi_table_lock) && - !spider_param_local_lock_table(thd) - ) { - SPIDER_CONN *conn = conns[roop_count]; - int appended = 0; - if ((error_num = dbton_handler[conn->dbton_id]-> - append_lock_tables_list(conn, roop_count, &appended))) - { - store_error_num = error_num; - DBUG_RETURN(to); - } - if (appended) - { - conn->table_lock = 3; - } - } + wide_handler->lock_table_type = 2; } } if ( @@ -1236,9 +1195,9 @@ THR_LOCK_DATA **ha_spider::store_lock( ) lock_type = TL_WRITE_ALLOW_WRITE; } - lock.type = lock_type; + wide_handler->lock.type = lock_type; } - *to++ = &lock; + *to++ = &wide_handler->lock; DBUG_RETURN(to); } @@ -1246,8 +1205,8 @@ int ha_spider::external_lock( THD *thd, int lock_type ) { - int error_num, roop_count; - bool sync_trx_isolation = spider_param_sync_trx_isolation(thd); + int error_num = 0; + SPIDER_TRX *trx; backup_error_status(); DBUG_ENTER("ha_spider::external_lock"); DBUG_PRINT("info",("spider this=%p", this)); @@ -1255,41 +1214,49 @@ int ha_spider::external_lock( #if MYSQL_VERSION_ID < 50500 DBUG_PRINT("info",("spider thd->options=%x", (int) thd->options)); #endif +#ifdef WITH_PARTITION_STORAGE_ENGINE + if ( + wide_handler->stage == SPD_HND_STAGE_EXTERNAL_LOCK && + wide_handler->stage_executor != this) + { + DBUG_RETURN(0); + } + wide_handler->stage = SPD_HND_STAGE_EXTERNAL_LOCK; + wide_handler->stage_executor = this; +#endif #ifdef HANDLER_HAS_NEED_INFO_FOR_AUTO_INC info_auto_called = FALSE; #endif - sql_command = thd_sql_command(thd); - if (sql_command == SQLCOM_BEGIN) - sql_command = SQLCOM_UNLOCK_TABLES; - if ( - sql_command == SQLCOM_UNLOCK_TABLES && - (error_num = spider_check_trx_and_get_conn(thd, this, - FALSE)) - ) { + wide_handler->sql_command = thd_sql_command(thd); + if (wide_handler->sql_command == SQLCOM_BEGIN) + wide_handler->sql_command = SQLCOM_UNLOCK_TABLES; + + trx = spider_get_trx(thd, TRUE, &error_num); + if (error_num) DBUG_RETURN(error_num); - } + wide_handler->trx = trx; - DBUG_PRINT("info",("spider sql_command=%d", sql_command)); - DBUG_ASSERT(trx == spider_get_trx(thd, TRUE, &error_num)); + DBUG_PRINT("info",("spider sql_command=%d", wide_handler->sql_command)); #ifdef HA_CAN_BULK_ACCESS - external_lock_cnt++; + wide_handler->external_lock_cnt++; #endif if ( lock_type == F_UNLCK && - sql_command != SQLCOM_UNLOCK_TABLES + wide_handler->sql_command != SQLCOM_UNLOCK_TABLES ) DBUG_RETURN(0); if (store_error_num) DBUG_RETURN(store_error_num); + wide_handler->external_lock_type = lock_type; #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) if ((conn_kinds & SPIDER_CONN_KIND_MYSQL)) { #endif if ( /* SQLCOM_RENAME_TABLE and SQLCOM_DROP_DB don't come here */ - sql_command == SQLCOM_DROP_TABLE || - sql_command == SQLCOM_ALTER_TABLE + wide_handler->sql_command == SQLCOM_DROP_TABLE || + wide_handler->sql_command == SQLCOM_ALTER_TABLE ) { if (trx->locked_connections) { @@ -1299,277 +1266,59 @@ int ha_spider::external_lock( } DBUG_RETURN(0); } - if (!conns[search_link_idx]) + if (unlikely((error_num = spider_internal_start_trx(this)))) { - my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM, - ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0)); - DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM); - } - for ( - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, -1, share->link_count, - SPIDER_LINK_STATUS_RECOVERY); - roop_count < (int) share->link_count; - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, roop_count, share->link_count, - SPIDER_LINK_STATUS_RECOVERY) - ) { - if (sql_command == SQLCOM_TRUNCATE) - DBUG_RETURN(0); - else if (sql_command != SQLCOM_UNLOCK_TABLES) - { - DBUG_PRINT("info",("spider conns[%d]->join_trx=%u", - roop_count, conns[roop_count]->join_trx)); - if ( - (!conns[roop_count]->join_trx && - (error_num = spider_internal_start_trx(this, conns[roop_count], - roop_count))) - ) { - if ( - share->monitoring_kind[roop_count] && - need_mons[roop_count] - ) { - error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, - share, - roop_count, - (uint32) share->monitoring_sid[roop_count], - share->table_name, - share->table_name_length, - conn_link_idx[roop_count], - NULL, - 0, - share->monitoring_kind[roop_count], - share->monitoring_limit[roop_count], - share->monitoring_flag[roop_count], - TRUE - ); - } - DBUG_RETURN(check_error_mode(error_num)); - } - result_list.lock_type = lock_type; - reset_first_link_idx(); - if ( - conns[roop_count]->semi_trx_isolation == -2 && - conns[roop_count]->semi_trx_isolation_chk == TRUE && - sync_trx_isolation && - spider_param_semi_trx_isolation(trx->thd) >= 0 - ) { -/* - if (conns[roop_count]->trx_isolation != - spider_param_semi_trx_isolation(trx->thd)) - { -*/ - spider_conn_queue_semi_trx_isolation(conns[roop_count], - spider_param_semi_trx_isolation(trx->thd)); -/* - } - conns[roop_count]->semi_trx_isolation = - spider_param_semi_trx_isolation(trx->thd); - conns[roop_count]->trx_isolation = - thd_tx_isolation(conns[roop_count]->thd); - DBUG_PRINT("info",("spider conn=%p", conns[roop_count])); - DBUG_PRINT("info",("spider conn->trx_isolation=%d", - conns[roop_count]->trx_isolation)); -*/ - } else { - if (sync_trx_isolation) - { - if ((error_num = spider_check_and_set_trx_isolation( - conns[roop_count], &need_mons[roop_count]))) - { - if ( - share->monitoring_kind[roop_count] && - need_mons[roop_count] - ) { - error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, - share, - roop_count, - (uint32) share->monitoring_sid[roop_count], - share->table_name, - share->table_name_length, - conn_link_idx[roop_count], - NULL, - 0, - share->monitoring_kind[roop_count], - share->monitoring_limit[roop_count], - share->monitoring_flag[roop_count], - TRUE - ); - } - DBUG_RETURN(check_error_mode(error_num)); - } - } - conns[roop_count]->semi_trx_isolation = -1; - } - } - if (conns[roop_count]->table_lock >= 2) - { - if ( - conns[roop_count]->db_conn->have_lock_table_list() && - (error_num = spider_db_lock_tables(this, roop_count)) - ) { - if ( - share->monitoring_kind[roop_count] && - need_mons[roop_count] - ) { - error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, - share, - roop_count, - (uint32) share->monitoring_sid[roop_count], - share->table_name, - share->table_name_length, - conn_link_idx[roop_count], - NULL, - 0, - share->monitoring_kind[roop_count], - share->monitoring_limit[roop_count], - share->monitoring_flag[roop_count], - TRUE - ); - } - conns[roop_count]->table_lock = 0; - DBUG_RETURN(check_error_mode(error_num)); - } - if (conns[roop_count]->table_lock == 2) - conns[roop_count]->table_lock = 1; - } else if (sql_command == SQLCOM_UNLOCK_TABLES || - spider_param_internal_unlock(thd) == 1) - { - if (conns[roop_count]->table_lock == 1) - { - conns[roop_count]->table_lock = 0; - if (!conns[roop_count]->trx_start) - conns[roop_count]->disable_reconnect = FALSE; - if ((error_num = spider_db_unlock_tables(this, roop_count))) - { - if ( - share->monitoring_kind[roop_count] && - need_mons[roop_count] - ) { - error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, - share, - roop_count, - (uint32) share->monitoring_sid[roop_count], - share->table_name, - share->table_name_length, - conn_link_idx[roop_count], - NULL, - 0, - share->monitoring_kind[roop_count], - share->monitoring_limit[roop_count], - share->monitoring_flag[roop_count], - TRUE - ); - } - DBUG_RETURN(check_error_mode(error_num)); - } - } - } + DBUG_RETURN(error_num); } #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) } else { - result_list.lock_type = lock_type; - reset_first_link_idx(); trans_register_ha(trx->thd, FALSE, spider_hton_ptr); if (thd_test_options(trx->thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) trans_register_ha(trx->thd, TRUE, spider_hton_ptr); } +#endif - if ((conn_kinds & SPIDER_CONN_KIND_HS_READ)) + if (wide_handler->lock_table_type > 0 || + wide_handler->sql_command == SQLCOM_UNLOCK_TABLES) { - SPIDER_CONN *hs_conn; - for ( - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, -1, share->link_count, - SPIDER_LINK_STATUS_RECOVERY); - roop_count < (int) share->link_count; - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, roop_count, share->link_count, - SPIDER_LINK_STATUS_RECOVERY) - ) { - hs_conn = hs_r_conns[roop_count]; - if ( - hs_conn && - hs_conn->hsc_query_id != thd->query_id && - hs_conn->hs_pre_age == hs_conn->hs_age - ) { - double interval = spider_param_hs_ping_interval(thd); - time_t tmp_time = (time_t) time((time_t*) 0); - DBUG_PRINT("info", - ("spider difftime=%f", difftime(tmp_time, hs_conn->ping_time))); - DBUG_PRINT("info", ("spider interval=%f", interval)); - if ( - hs_conn->server_lost || - difftime(tmp_time, hs_conn->ping_time) >= interval - ) { - DBUG_PRINT("info", ("spider hsr[%d] need reconnect", roop_count)); - hs_conn->hs_pre_age++; - hs_conn->ping_time = tmp_time; + if (wide_handler->sql_command == SQLCOM_UNLOCK_TABLES) + { + /* lock tables does not call reset() */ + /* unlock tables does not call store_lock() */ + wide_handler->lock_table_type = 0; + } + + /* lock/unlock tables */ +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (partition_handler_share && partition_handler_share->handlers) + { + uint roop_count; + for (roop_count = 0; roop_count < partition_handler_share->no_parts; + ++roop_count) + { + if (unlikely((error_num = + partition_handler_share->handlers[roop_count]->lock_tables()))) + { + DBUG_RETURN(error_num); } - hs_conn->hsc_query_id = thd->query_id; } - } - } - if ( -#if defined(HS_HAS_SQLCOM) && defined(HANDLER_HAS_DIRECT_UPDATE_ROWS) - ( -#endif - conn_kinds & SPIDER_CONN_KIND_HS_WRITE -#if defined(HS_HAS_SQLCOM) && defined(HANDLER_HAS_DIRECT_UPDATE_ROWS) - ) || - /* for direct_update */ - sql_command == SQLCOM_HS_UPDATE || - sql_command == SQLCOM_HS_DELETE + } else { #endif - ) { - SPIDER_CONN *hs_conn; - for ( - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, -1, share->link_count, - SPIDER_LINK_STATUS_RECOVERY); - roop_count < (int) share->link_count; - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, roop_count, share->link_count, - SPIDER_LINK_STATUS_RECOVERY) - ) { - hs_conn = hs_w_conns[roop_count]; - if ( - hs_conn && - hs_conn->hsc_query_id != thd->query_id && - hs_conn->hs_pre_age == hs_conn->hs_age - ) { - double interval = spider_param_hs_ping_interval(thd); - time_t tmp_time = (time_t) time((time_t*) 0); - DBUG_PRINT("info", - ("spider difftime=%f", difftime(tmp_time, hs_conn->ping_time))); - DBUG_PRINT("info", ("spider interval=%f", interval)); - if ( - hs_conn->server_lost || - difftime(tmp_time, hs_conn->ping_time) >= interval - ) { - DBUG_PRINT("info", ("spider hsw[%d] need reconnect", roop_count)); - hs_conn->hs_pre_age++; - hs_conn->ping_time = tmp_time; - } - hs_conn->hsc_query_id = thd->query_id; + if (unlikely((error_num = lock_tables()))) + { + DBUG_RETURN(error_num); } +#ifdef WITH_PARTITION_STORAGE_ENGINE } - } #endif + } - DBUG_PRINT("info",("spider trx_start=%s", trx->trx_start ? "TRUE" : "FALSE")); + DBUG_PRINT("info",("spider trx_start=%s", + trx->trx_start ? "TRUE" : "FALSE")); /* need to check after spider_internal_start_trx() */ if (trx->trx_start) { - switch (sql_command) + switch (wide_handler->sql_command) { case SQLCOM_SELECT: case SQLCOM_HA_READ: @@ -1604,6 +1353,24 @@ int ha_spider::external_lock( DBUG_RETURN(0); } +int ha_spider::start_stmt( + THD *thd, + thr_lock_type lock_type +) { + DBUG_ENTER("ha_spider::start_stmt"); +#ifdef WITH_PARTITION_STORAGE_ENGINE + if ( + wide_handler->stage == SPD_HND_STAGE_START_STMT && + wide_handler->stage_executor != this) + { + DBUG_RETURN(0); + } + wide_handler->stage = SPD_HND_STAGE_START_STMT; + wide_handler->stage_executor = this; +#endif + DBUG_RETURN(0); +} + int ha_spider::reset() { int error_num = 0, error_num2, roop_count; @@ -1673,25 +1440,49 @@ int ha_spider::reset() #endif result_list.direct_distinct = FALSE; store_error_num = 0; -#ifdef WITH_PARTITION_STORAGE_ENGINE if ( - partition_handler_share && - partition_handler_share->searched_bitmap + wide_handler && + wide_handler->sql_command != SQLCOM_END ) { + wide_handler->sql_command = SQLCOM_END; + wide_handler->between_flg = FALSE; + wide_handler->idx_bitmap_is_set = FALSE; + wide_handler->rnd_bitmap_is_set = FALSE; + wide_handler->quick_mode = FALSE; + wide_handler->keyread = FALSE; + wide_handler->ignore_dup_key = FALSE; + wide_handler->write_can_replace = FALSE; + wide_handler->insert_with_update = FALSE; + wide_handler->low_priority = FALSE; + wide_handler->high_priority = FALSE; + wide_handler->insert_delayed = FALSE; + wide_handler->lock_table_type = 0; + wide_handler->semi_trx_isolation_chk = FALSE; + wide_handler->semi_trx_chk = FALSE; if (!is_clone) { - partition_handler_share->searched_bitmap = NULL; - partition_handler_share->ft_discard_bitmap = NULL; + memset(wide_handler->ft_discard_bitmap, 0xFF, + no_bytes_in_map(table->read_set)); + memset(wide_handler->searched_bitmap, 0, + no_bytes_in_map(table->read_set)); } - partition_handler_share->between_flg = FALSE; - partition_handler_share->idx_bitmap_is_set = FALSE; - partition_handler_share->rnd_bitmap_is_set = FALSE; - } + while (wide_handler->condition) + { + tmp_cond = wide_handler->condition->next; + spider_free(spider_current_trx, wide_handler->condition, MYF(0)); + wide_handler->condition = tmp_cond; + } + wide_handler->cond_check = FALSE; +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS + wide_handler->direct_update_fields = NULL; +#endif +#ifdef INFO_KIND_FORCE_LIMIT_BEGIN + wide_handler->info_limit = 9223372036854775807LL; +#endif +#ifdef WITH_PARTITION_STORAGE_ENGINE + wide_handler->stage = SPD_HND_STAGE_NONE; + wide_handler->stage_executor = NULL; #endif - if (!is_clone) - { - memset(ft_discard_bitmap, 0xFF, no_bytes_in_map(table->read_set)); - memset(searched_bitmap, 0, no_bytes_in_map(table->read_set)); } if (!(tmp_trx = spider_get_trx(thd, TRUE, &error_num2))) { @@ -1701,82 +1492,11 @@ int ha_spider::reset() } if (share) { - trx_bak = trx; - trx = tmp_trx; + trx_bak = wide_handler->trx; + wide_handler->trx = tmp_trx; if ((error_num2 = spider_db_free_result(this, FALSE))) error_num = error_num2; - trx = trx_bak; -/* - int semi_table_lock_conn = spider_param_semi_table_lock_connection(thd, - share->semi_table_lock_conn); - if (semi_table_lock_conn) - first_byte = '0' + - spider_param_semi_table_lock(thd, share->semi_table_lock); - else - first_byte = '0'; - DBUG_PRINT("info",("spider semi_table_lock_conn = %d", - semi_table_lock_conn)); - DBUG_PRINT("info",("spider semi_table_lock = %d", - spider_param_semi_table_lock(thd, share->semi_table_lock))); - DBUG_PRINT("info",("spider first_byte = %d", first_byte)); - if (tmp_trx->spider_thread_id != spider_thread_id || - (tmp_trx->trx_conn_adjustment != trx_conn_adjustment && - tmp_trx->trx_conn_adjustment - 1 != trx_conn_adjustment) || - first_byte != *conn_keys[0] - ) { - DBUG_PRINT("info",(first_byte != *conn_keys[0] ? - "spider change conn type" : tmp_trx != trx ? "spider change thd" : - "spider next trx")); - trx = tmp_trx; - spider_thread_id = tmp_trx->spider_thread_id; - trx_conn_adjustment = tmp_trx->trx_conn_adjustment; - - first_byte_bak = *conn_keys[0]; - *conn_keys[0] = first_byte; - for ( - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, -1, share->link_count, - SPIDER_LINK_STATUS_RECOVERY); - roop_count < share->link_count; - roop_count = spider_conn_link_idx_next(share->link_statuses, - conn_link_idx, roop_count, share->link_count, - SPIDER_LINK_STATUS_RECOVERY) - ) { - *conn_keys[roop_count] = first_byte; - if ( - !(conns[roop_count] = - spider_get_conn(share, roop_count, conn_keys[roop_count], trx, - this, FALSE, TRUE, SPIDER_CONN_KIND_MYSQL, &error_num)) - ) { - if ( - share->monitoring_kind[roop_count] && - need_mons[roop_count] - ) { - error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, - share, - roop_count, - (uint32) share->monitoring_sid[roop_count], - share->table_name, - share->table_name_length, - conn_link_idx[roop_count], - NULL, - 0, - share->monitoring_kind[roop_count], - share->monitoring_limit[roop_count], - share->monitoring_flag[roop_count], - TRUE - ); - } - DBUG_PRINT("info",("spider get conn error")); - *conn_keys[0] = first_byte_bak; - conns[0] = NULL; - DBUG_RETURN(error_num); - } - } - } -*/ + wide_handler->trx = trx_bak; memset(need_mons, 0, sizeof(int) * share->link_count); memset(result_list.casual_read, 0, sizeof(int) * share->link_count); rm_bulk_tmp_table(); @@ -1806,19 +1526,12 @@ int ha_spider::reset() } } } - quick_mode = FALSE; - keyread = FALSE; - ignore_dup_key = FALSE; - write_can_replace = FALSE; - insert_with_update = FALSE; - low_priority = FALSE; - high_priority = FALSE; - insert_delayed = FALSE; + dml_inited = FALSE; use_pre_call = FALSE; use_pre_action = FALSE; pre_bitmap_checked = FALSE; bulk_insert = FALSE; - clone_bitmap_init = FALSE; + partition_handler_share->clone_bitmap_init = FALSE; result_list.tmp_table_join = FALSE; result_list.use_union = FALSE; result_list.use_both_key = FALSE; @@ -1826,13 +1539,6 @@ int ha_spider::reset() conn_kinds = SPIDER_CONN_KIND_MYSQL; use_index_merge = FALSE; init_rnd_handler = FALSE; - while (condition) - { - tmp_cond = condition->next; - spider_free(spider_current_trx, condition, MYF(0)); - condition = tmp_cond; - } - cond_check = FALSE; #ifdef HA_MRR_USE_DEFAULT_IMPL if (multi_range_keys) { @@ -1855,10 +1561,6 @@ int ha_spider::reset() #endif #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS do_direct_update = FALSE; - direct_update_fields = NULL; -#endif -#ifdef INFO_KIND_FORCE_LIMIT_BEGIN - info_limit = 9223372036854775807LL; #endif prev_index_rnd_init = SPD_NONE; result_list.have_sql_kind_backup = FALSE; @@ -1896,55 +1598,64 @@ int ha_spider::extra( DBUG_ENTER("ha_spider::extra"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider operation=%d", (int) operation)); +#ifdef WITH_PARTITION_STORAGE_ENGINE + if ( + wide_handler->stage == SPD_HND_STAGE_EXTRA && + wide_handler->stage_executor != this) + { + DBUG_RETURN(0); + } + wide_handler->stage = SPD_HND_STAGE_EXTRA; + wide_handler->stage_executor = this; +#endif switch (operation) { case HA_EXTRA_QUICK: - quick_mode = TRUE; + wide_handler->quick_mode = TRUE; break; case HA_EXTRA_KEYREAD: if (!is_clone) { - keyread = TRUE; + wide_handler->keyread = TRUE; #ifdef WITH_PARTITION_STORAGE_ENGINE - if (update_request) + if (wide_handler->update_request) { if (check_partitioned()) - keyread = FALSE; + wide_handler->keyread = FALSE; } #endif } break; case HA_EXTRA_NO_KEYREAD: - keyread = FALSE; + wide_handler->keyread = FALSE; break; case HA_EXTRA_IGNORE_DUP_KEY: - ignore_dup_key = TRUE; + wide_handler->ignore_dup_key = TRUE; break; case HA_EXTRA_NO_IGNORE_DUP_KEY: - ignore_dup_key = FALSE; + wide_handler->ignore_dup_key = FALSE; break; case HA_EXTRA_WRITE_CAN_REPLACE: - write_can_replace = TRUE; + wide_handler->write_can_replace = TRUE; break; case HA_EXTRA_WRITE_CANNOT_REPLACE: - write_can_replace = FALSE; + wide_handler->write_can_replace = FALSE; break; #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS case HA_EXTRA_INSERT_WITH_UPDATE: - insert_with_update = TRUE; - check_insert_dup_update_pushdown(); + wide_handler->insert_with_update = TRUE; break; #endif case HA_EXTRA_ATTACH_CHILDREN: DBUG_PRINT("info",("spider HA_EXTRA_ATTACH_CHILDREN")); - if (!(trx = spider_get_trx(ha_thd(), TRUE, &error_num))) + if (!(wide_handler->trx = spider_get_trx(ha_thd(), TRUE, &error_num))) DBUG_RETURN(error_num); break; #if MYSQL_VERSION_ID < 50500 #else case HA_EXTRA_ADD_CHILDREN_LIST: DBUG_PRINT("info",("spider HA_EXTRA_ADD_CHILDREN_LIST")); - if (!(trx = spider_get_trx(ha_thd(), TRUE, &error_num))) + if (!(wide_handler->trx = spider_get_trx(ha_thd(), TRUE, &error_num))) DBUG_RETURN(error_num); break; #endif @@ -1967,7 +1678,8 @@ int ha_spider::extra( part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++ ) { - spider_set_bit(searched_bitmap, key_part->field->field_index); + spider_set_bit(wide_handler->searched_bitmap, + key_part->field->field_index); } } else { DBUG_PRINT("info",("spider need all columns")); @@ -1977,7 +1689,7 @@ int ha_spider::extra( *field; field++ ) { - spider_set_bit(searched_bitmap, (*field)->field_index); + spider_set_bit(wide_handler->searched_bitmap, (*field)->field_index); } } break; @@ -2009,6 +1721,13 @@ int ha_spider::index_init( } } #endif + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } pushed_pos = NULL; active_index = idx; result_list.sorted = sorted; @@ -2020,20 +1739,21 @@ int ha_spider::index_init( if (pre_bitmap_checked) pre_bitmap_checked = FALSE; else { - if (result_list.lock_type == F_WRLCK) + if (wide_handler->external_lock_type == F_WRLCK) { pk_update = FALSE; /* check_and_start_bulk_update(SPD_BU_START_BY_INDEX_OR_RND_INIT); */ if ( - update_request && + wide_handler->update_request && share->have_recovery_link && (pk_update = spider_check_pk_update(table)) ) { bitmap_set_all(table->read_set); if (is_clone) - memset(searched_bitmap, 0xFF, no_bytes_in_map(table->read_set)); + memset(wide_handler->searched_bitmap, 0xFF, + no_bytes_in_map(table->read_set)); } } @@ -2127,7 +1847,7 @@ int ha_spider::index_read_map_internal( backup_error_status(); DBUG_ENTER("ha_spider::index_read_map_internal"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -2172,7 +1892,7 @@ int ha_spider::index_read_map_internal( DBUG_PRINT("info",("spider result_list.finish_flg = FALSE")); result_list.finish_flg = FALSE; result_list.record_num = 0; - if (keyread) + if (wide_handler->keyread) result_list.keyread = TRUE; else result_list.keyread = FALSE; @@ -2287,7 +2007,8 @@ int ha_spider::index_read_map_internal( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); if ((error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -2299,8 +2020,8 @@ int ha_spider::index_read_map_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -2363,7 +2084,7 @@ int ha_spider::index_read_map_internal( conn_kind[roop_count] != SPIDER_CONN_KIND_MYSQL ) { connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(trx, conn); + spider_trx_add_bulk_access_conn(wide_handler->trx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); } else { @@ -2383,8 +2104,8 @@ int ha_spider::index_read_map_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -2402,7 +2123,7 @@ int ha_spider::index_read_map_internal( DBUG_RETURN(check_error_mode_eof(error_num)); } spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -2417,8 +2138,8 @@ int ha_spider::index_read_map_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -2448,8 +2169,8 @@ int ha_spider::index_read_map_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -2638,7 +2359,7 @@ int ha_spider::index_read_last_map_internal( backup_error_status(); DBUG_ENTER("ha_spider::index_read_last_map_internal"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -2692,7 +2413,7 @@ int ha_spider::index_read_last_map_internal( DBUG_PRINT("info",("spider result_list.finish_flg = FALSE")); result_list.finish_flg = FALSE; result_list.record_num = 0; - if (keyread) + if (wide_handler->keyread) result_list.keyread = TRUE; else result_list.keyread = FALSE; @@ -2783,7 +2504,8 @@ int ha_spider::index_read_last_map_internal( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); if ((error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -2795,8 +2517,8 @@ int ha_spider::index_read_last_map_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -2856,7 +2578,7 @@ int ha_spider::index_read_last_map_internal( if (is_bulk_access_clone) { connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(trx, conn); + spider_trx_add_bulk_access_conn(wide_handler->trx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); } else { @@ -2876,8 +2598,8 @@ int ha_spider::index_read_last_map_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -2895,7 +2617,7 @@ int ha_spider::index_read_last_map_internal( DBUG_RETURN(check_error_mode_eof(error_num)); } spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -2910,8 +2632,8 @@ int ha_spider::index_read_last_map_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -2941,8 +2663,8 @@ int ha_spider::index_read_last_map_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -3025,7 +2747,7 @@ int ha_spider::index_next( backup_error_status(); DBUG_ENTER("ha_spider::index_next"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -3071,7 +2793,7 @@ int ha_spider::index_prev( backup_error_status(); DBUG_ENTER("ha_spider::index_prev"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -3118,7 +2840,7 @@ int ha_spider::index_first_internal( backup_error_status(); DBUG_ENTER("ha_spider::index_first_internal"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -3161,7 +2883,7 @@ int ha_spider::index_first_internal( DBUG_PRINT("info",("spider result_list.finish_flg = FALSE")); result_list.finish_flg = FALSE; result_list.record_num = 0; - if (keyread) + if (wide_handler->keyread) result_list.keyread = TRUE; else result_list.keyread = FALSE; @@ -3253,7 +2975,8 @@ int ha_spider::index_first_internal( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); if ((error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -3265,8 +2988,8 @@ int ha_spider::index_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -3327,7 +3050,7 @@ int ha_spider::index_first_internal( if (is_bulk_access_clone) { connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(trx, conn); + spider_trx_add_bulk_access_conn(wide_handler->trx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); } else { @@ -3347,8 +3070,8 @@ int ha_spider::index_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -3366,7 +3089,7 @@ int ha_spider::index_first_internal( DBUG_RETURN(check_error_mode_eof(error_num)); } spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -3381,8 +3104,8 @@ int ha_spider::index_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -3412,8 +3135,8 @@ int ha_spider::index_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -3506,7 +3229,7 @@ int ha_spider::index_last_internal( backup_error_status(); DBUG_ENTER("ha_spider::index_last_internal"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -3549,7 +3272,7 @@ int ha_spider::index_last_internal( DBUG_PRINT("info",("spider result_list.finish_flg = FALSE")); result_list.finish_flg = FALSE; result_list.record_num = 0; - if (keyread) + if (wide_handler->keyread) result_list.keyread = TRUE; else result_list.keyread = FALSE; @@ -3641,7 +3364,8 @@ int ha_spider::index_last_internal( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); if ((error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -3653,8 +3377,8 @@ int ha_spider::index_last_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -3715,7 +3439,7 @@ int ha_spider::index_last_internal( if (is_bulk_access_clone) { connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(trx, conn); + spider_trx_add_bulk_access_conn(wide_handler->trx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); } else { @@ -3735,8 +3459,8 @@ int ha_spider::index_last_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -3754,7 +3478,7 @@ int ha_spider::index_last_internal( DBUG_RETURN(check_error_mode_eof(error_num)); } spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -3769,8 +3493,8 @@ int ha_spider::index_last_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -3800,8 +3524,8 @@ int ha_spider::index_last_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -3895,7 +3619,7 @@ int ha_spider::index_next_same( backup_error_status(); DBUG_ENTER("ha_spider::index_next_same"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -3947,7 +3671,7 @@ int ha_spider::read_range_first_internal( backup_error_status(); DBUG_ENTER("ha_spider::read_range_first_internal"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -3997,7 +3721,7 @@ int ha_spider::read_range_first_internal( DBUG_PRINT("info",("spider result_list.finish_flg = FALSE")); result_list.finish_flg = FALSE; result_list.record_num = 0; - if (keyread) + if (wide_handler->keyread) result_list.keyread = TRUE; else result_list.keyread = FALSE; @@ -4089,7 +3813,8 @@ int ha_spider::read_range_first_internal( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); if ((error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -4101,8 +3826,8 @@ int ha_spider::read_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4162,7 +3887,7 @@ int ha_spider::read_range_first_internal( if (is_bulk_access_clone) { connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(trx, conn); + spider_trx_add_bulk_access_conn(wide_handler->trx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); } else { @@ -4182,8 +3907,8 @@ int ha_spider::read_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4201,7 +3926,7 @@ int ha_spider::read_range_first_internal( DBUG_RETURN(check_error_mode_eof(error_num)); } spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -4216,8 +3941,8 @@ int ha_spider::read_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4247,8 +3972,8 @@ int ha_spider::read_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4338,7 +4063,7 @@ int ha_spider::read_range_next() backup_error_status(); DBUG_ENTER("ha_spider::read_range_next"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -4390,17 +4115,18 @@ ha_rows ha_spider::multi_range_read_info_const( DBUG_PRINT("info",("spider this=%p", this)); if (!pre_bitmap_checked) { - if (result_list.lock_type == F_WRLCK) + if (wide_handler->external_lock_type == F_WRLCK) { pk_update = FALSE; if ( - update_request && + wide_handler->update_request && share->have_recovery_link && (pk_update = spider_check_pk_update(table)) ) { bitmap_set_all(table->read_set); if (is_clone) - memset(searched_bitmap, 0xFF, no_bytes_in_map(table->read_set)); + memset(wide_handler->searched_bitmap, 0xFF, + no_bytes_in_map(table->read_set)); } } @@ -4454,17 +4180,18 @@ ha_rows ha_spider::multi_range_read_info( DBUG_PRINT("info",("spider this=%p", this)); if (!pre_bitmap_checked) { - if (result_list.lock_type == F_WRLCK) + if (wide_handler->external_lock_type == F_WRLCK) { pk_update = FALSE; if ( - update_request && + wide_handler->update_request && share->have_recovery_link && (pk_update = spider_check_pk_update(table)) ) { bitmap_set_all(table->read_set); if (is_clone) - memset(searched_bitmap, 0xFF, no_bytes_in_map(table->read_set)); + memset(wide_handler->searched_bitmap, 0xFF, + no_bytes_in_map(table->read_set)); } } @@ -4499,7 +4226,7 @@ int ha_spider::multi_range_read_init( uint mode, HANDLER_BUFFER *buf ) { - bka_mode = spider_param_bka_mode(trx->thd, share->bka_mode); + bka_mode = spider_param_bka_mode(wide_handler->trx->thd, share->bka_mode); backup_error_status(); DBUG_ENTER("ha_spider::multi_range_read_init"); DBUG_PRINT("info",("spider this=%p", this)); @@ -4546,12 +4273,12 @@ int ha_spider::read_multi_range_first_internal( backup_error_status(); DBUG_ENTER("ha_spider::multi_range_read_next_first"); #else - bka_mode = spider_param_bka_mode(trx->thd, share->bka_mode); + bka_mode = spider_param_bka_mode(wide_handler->trx->thd, share->bka_mode); backup_error_status(); DBUG_ENTER("ha_spider::read_multi_range_first_internal"); #endif DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -4606,7 +4333,7 @@ int ha_spider::read_multi_range_first_internal( result_list.multi_split_read <= 1 || (sql_kinds & SPIDER_SQL_KIND_HANDLER) ) { - if (keyread) + if (wide_handler->keyread) result_list.keyread = TRUE; else result_list.keyread = FALSE; @@ -4721,7 +4448,8 @@ int ha_spider::read_multi_range_first_internal( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -4733,8 +4461,8 @@ int ha_spider::read_multi_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4793,7 +4521,7 @@ int ha_spider::read_multi_range_first_internal( if (is_bulk_access_clone) { connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(trx, conn); + spider_trx_add_bulk_access_conn(wide_handler->trx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); #ifdef HA_MRR_USE_DEFAULT_IMPL @@ -4819,8 +4547,8 @@ int ha_spider::read_multi_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4839,7 +4567,7 @@ int ha_spider::read_multi_range_first_internal( if (!error_num) { spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -4854,8 +4582,8 @@ int ha_spider::read_multi_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4887,8 +4615,8 @@ int ha_spider::read_multi_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4987,7 +4715,7 @@ int ha_spider::read_multi_range_first_internal( if (error_num) DBUG_RETURN(check_error_mode_eof(error_num)); } else { - bool tmp_high_priority = high_priority; + bool tmp_high_priority = wide_handler->high_priority; bool have_multi_range; #ifdef HA_MRR_USE_DEFAULT_IMPL const uchar *first_mrr_start_key; @@ -4996,7 +4724,7 @@ int ha_spider::read_multi_range_first_internal( uint first_mrr_end_key_length; have_second_range = FALSE; #endif - if (keyread) + if (wide_handler->keyread) result_list.keyread = TRUE; else result_list.keyread = FALSE; @@ -5382,7 +5110,7 @@ int ha_spider::read_multi_range_first_internal( (error_num = set_union_table_name_pos_sql()) ) DBUG_RETURN(error_num); - high_priority = FALSE; + wide_handler->high_priority = FALSE; if ( share->key_hint && (error_num = append_hint_after_table_sql_part( @@ -5457,7 +5185,7 @@ int ha_spider::read_multi_range_first_internal( #ifdef HA_MRR_USE_DEFAULT_IMPL while (!range_res); #endif - high_priority = tmp_high_priority; + wide_handler->high_priority = tmp_high_priority; if ((error_num = append_union_all_end_sql_part( SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); @@ -5516,7 +5244,8 @@ int ha_spider::read_multi_range_first_internal( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); if ((error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -5528,8 +5257,8 @@ int ha_spider::read_multi_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5591,7 +5320,7 @@ int ha_spider::read_multi_range_first_internal( if (is_bulk_access_clone) { connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(trx, conn); + spider_trx_add_bulk_access_conn(wide_handler->trx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); #ifdef HA_MRR_USE_DEFAULT_IMPL @@ -5617,8 +5346,8 @@ int ha_spider::read_multi_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5643,7 +5372,7 @@ int ha_spider::read_multi_range_first_internal( spider_set_bit(result_list.tmp_table_created, roop_count); result_list.tmp_tables_created = TRUE; spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_TMP_SQL, conn, @@ -5658,8 +5387,8 @@ int ha_spider::read_multi_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5679,7 +5408,7 @@ int ha_spider::read_multi_range_first_internal( spider_db_discard_multiple_result(this, roop_count, conn); } spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -5694,8 +5423,8 @@ int ha_spider::read_multi_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5725,8 +5454,8 @@ int ha_spider::read_multi_range_first_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -6010,7 +5739,7 @@ int ha_spider::read_multi_range_next( DBUG_ENTER("ha_spider::read_multi_range_next"); #endif DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -6170,7 +5899,8 @@ int ha_spider::read_multi_range_next( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -6182,8 +5912,8 @@ int ha_spider::read_multi_range_next( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -6242,7 +5972,7 @@ int ha_spider::read_multi_range_next( if (is_bulk_access_clone) { connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(trx, conn); + spider_trx_add_bulk_access_conn(wide_handler->trx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); #ifdef HA_MRR_USE_DEFAULT_IMPL @@ -6268,8 +5998,8 @@ int ha_spider::read_multi_range_next( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -6288,7 +6018,7 @@ int ha_spider::read_multi_range_next( if (!error_num) { spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -6303,8 +6033,8 @@ int ha_spider::read_multi_range_next( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -6336,8 +6066,8 @@ int ha_spider::read_multi_range_next( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -6533,7 +6263,7 @@ int ha_spider::read_multi_range_next( multi_range_ranges = multi_range_curr; #endif - bool tmp_high_priority = high_priority; + bool tmp_high_priority = wide_handler->high_priority; bool have_multi_range; multi_range_cnt = 0; error_num = 0; @@ -6841,7 +6571,7 @@ int ha_spider::read_multi_range_next( (error_num = set_union_table_name_pos_sql()) ) DBUG_RETURN(error_num); - high_priority = FALSE; + wide_handler->high_priority = FALSE; if ( share->key_hint && (error_num = append_hint_after_table_sql_part( @@ -6911,7 +6641,7 @@ int ha_spider::read_multi_range_next( #ifdef HA_MRR_USE_DEFAULT_IMPL while (!range_res); #endif - high_priority = tmp_high_priority; + wide_handler->high_priority = tmp_high_priority; if ((error_num = append_union_all_end_sql_part(SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); @@ -6969,7 +6699,8 @@ int ha_spider::read_multi_range_next( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); if ((error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -6981,8 +6712,8 @@ int ha_spider::read_multi_range_next( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7044,7 +6775,7 @@ int ha_spider::read_multi_range_next( if (is_bulk_access_clone) { connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(trx, conn); + spider_trx_add_bulk_access_conn(wide_handler->trx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); #ifdef HA_MRR_USE_DEFAULT_IMPL @@ -7070,8 +6801,8 @@ int ha_spider::read_multi_range_next( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7096,7 +6827,7 @@ int ha_spider::read_multi_range_next( spider_set_bit(result_list.tmp_table_created, roop_count); result_list.tmp_tables_created = TRUE; spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_TMP_SQL, conn, @@ -7111,8 +6842,8 @@ int ha_spider::read_multi_range_next( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7132,7 +6863,7 @@ int ha_spider::read_multi_range_next( spider_db_discard_multiple_result(this, roop_count, conn); } spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -7147,8 +6878,8 @@ int ha_spider::read_multi_range_next( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7178,8 +6909,8 @@ int ha_spider::read_multi_range_next( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7338,15 +7069,22 @@ int ha_spider::rnd_init( DBUG_ENTER("ha_spider::rnd_init"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider scan=%s", scan ? "TRUE" : "FALSE")); + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } pushed_pos = NULL; /* - if (result_list.lock_type == F_WRLCK) + if (wide_handler->external_lock_type == F_WRLCK) check_and_start_bulk_update(SPD_BU_START_BY_INDEX_OR_RND_INIT); */ rnd_scan_and_first = scan; if ( scan && - sql_command != SQLCOM_ALTER_TABLE + wide_handler->sql_command != SQLCOM_ALTER_TABLE ) { spider_set_result_list_param(this); pk_update = FALSE; @@ -7411,14 +7149,15 @@ int ha_spider::rnd_init( use_spatial_index = FALSE; if ( - update_request && + wide_handler->update_request && share->have_recovery_link && - result_list.lock_type == F_WRLCK && + wide_handler->external_lock_type == F_WRLCK && (pk_update = spider_check_pk_update(table)) ) { bitmap_set_all(table->read_set); if (is_clone) - memset(searched_bitmap, 0xFF, no_bytes_in_map(table->read_set)); + memset(wide_handler->searched_bitmap, 0xFF, + no_bytes_in_map(table->read_set)); } set_select_column_mode(); @@ -7488,17 +7227,17 @@ int ha_spider::rnd_next_internal( ) { int error_num; ha_spider *direct_limit_offset_spider = - (ha_spider *) partition_handler_share->creator; + (ha_spider *) partition_handler_share->owner; backup_error_status(); DBUG_ENTER("ha_spider::rnd_next_internal"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); } /* do not copy table data at alter table */ - if (sql_command == SQLCOM_ALTER_TABLE) + if (wide_handler->sql_command == SQLCOM_ALTER_TABLE) DBUG_RETURN(HA_ERR_END_OF_FILE); #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS do_direct_update = FALSE; @@ -7644,7 +7383,8 @@ int ha_spider::rnd_next_internal( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); if ((error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -7656,8 +7396,8 @@ int ha_spider::rnd_next_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7716,8 +7456,8 @@ int ha_spider::rnd_next_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7735,7 +7475,7 @@ int ha_spider::rnd_next_internal( DBUG_RETURN(check_error_mode_eof(error_num)); } spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, conn, @@ -7750,8 +7490,8 @@ int ha_spider::rnd_next_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7781,8 +7521,8 @@ int ha_spider::rnd_next_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7899,15 +7639,15 @@ void ha_spider::position( DBUG_PRINT("info",("spider self position")); DBUG_PRINT("info", ("spider current_row_num=%lld", result_list.current_row_num)); - if (!position_bitmap_init) + if (!wide_handler->position_bitmap_init) { if (select_column_mode) { spider_db_handler *dbton_hdl = dbton_handler[result_list.current->dbton_id]; - dbton_hdl->copy_minimum_select_bitmap(position_bitmap); + dbton_hdl->copy_minimum_select_bitmap(wide_handler->position_bitmap); } - position_bitmap_init = TRUE; + wide_handler->position_bitmap_init = TRUE; } spider_db_create_position(this, (SPIDER_POSITION *) ref); } @@ -7929,7 +7669,7 @@ int ha_spider::rnd_pos( ((uchar *) table->read_set->bitmap)[roop_count])); } #endif - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -8145,7 +7885,7 @@ int ha_spider::ft_read_internal( backup_error_status(); DBUG_ENTER("ha_spider::ft_read_internal"); DBUG_PRINT("info",("spider this=%p", this)); - if (trx->thd->killed) + if (wide_handler->trx->thd->killed) { my_error(ER_QUERY_INTERRUPTED, MYF(0)); DBUG_RETURN(ER_QUERY_INTERRUPTED); @@ -8165,7 +7905,7 @@ int ha_spider::ft_read_internal( DBUG_PRINT("info",("spider result_list.finish_flg = FALSE")); result_list.finish_flg = FALSE; result_list.record_num = 0; - if (keyread) + if (wide_handler->keyread) result_list.keyread = TRUE; else result_list.keyread = FALSE; @@ -8266,7 +8006,8 @@ int ha_spider::ft_read_internal( #ifndef WITHOUT_SPIDER_BG_SEARCH if (result_list.bgs_phase > 0) { - if ((error_num = spider_check_and_init_casual_read(trx->thd, this, + if ((error_num = spider_check_and_init_casual_read( + wide_handler->trx->thd, this, roop_count))) DBUG_RETURN(error_num); if ((error_num = spider_bg_conn_search(this, roop_count, roop_start, @@ -8278,8 +8019,8 @@ int ha_spider::ft_read_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8332,8 +8073,8 @@ int ha_spider::ft_read_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8350,7 +8091,8 @@ int ha_spider::ft_read_internal( } DBUG_RETURN(check_error_mode_eof(error_num)); } - spider_conn_set_timeout_from_share(conn, roop_count, trx->thd, share); + spider_conn_set_timeout_from_share(conn, roop_count, + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_SELECT_SQL, conn, @@ -8365,8 +8107,8 @@ int ha_spider::ft_read_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8396,8 +8138,8 @@ int ha_spider::ft_read_internal( need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8496,7 +8238,7 @@ int ha_spider::info( #ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT auto_inc_temporary = FALSE; #endif - sql_command = thd_sql_command(thd); + wide_handler->sql_command = thd_sql_command(thd); /* if ( sql_command == SQLCOM_DROP_TABLE || @@ -8517,8 +8259,8 @@ int ha_spider::info( } } if ( - sql_command == SQLCOM_DROP_TABLE || - sql_command == SQLCOM_ALTER_TABLE + wide_handler->sql_command == SQLCOM_DROP_TABLE || + wide_handler->sql_command == SQLCOM_ALTER_TABLE ) DBUG_RETURN(0); /* @@ -8549,7 +8291,7 @@ int ha_spider::info( pthread_mutex_unlock(&share->sts_mutex); else { if ((spider_init_error_table = - spider_get_init_error_table(trx, share, FALSE))) + spider_get_init_error_table(wide_handler->trx, share, FALSE))) { DBUG_PRINT("info",("spider diff=%f", difftime(tmp_time, spider_init_error_table->init_error_time))); @@ -8558,7 +8300,7 @@ int ha_spider::info( spider_param_table_init_error_interval()) { pthread_mutex_unlock(&share->sts_mutex); - if (sql_command == SQLCOM_SHOW_CREATE) + if (wide_handler->sql_command == SQLCOM_SHOW_CREATE) { if (thd->is_error()) { @@ -8584,9 +8326,7 @@ int ha_spider::info( if (flag & HA_STATUS_AUTO) { if ( -#ifdef WITH_PARTITION_STORAGE_ENGINE - share->partition_share && -#endif + share->wide_share && tmp_auto_increment_mode == 1 && !share->lgtm_tblhnd_share->auto_increment_init ) { @@ -8619,7 +8359,8 @@ int ha_spider::info( if ( spider_init_error_table || (spider_init_error_table = - spider_get_init_error_table(trx, share, TRUE)) + spider_get_init_error_table(wide_handler->trx, + share, TRUE)) ) { spider_init_error_table->init_error = error_num; if ((spider_init_error_table->init_error_with_message = @@ -8632,7 +8373,7 @@ int ha_spider::info( share->init_error = TRUE; share->init = TRUE; } - if (sql_command == SQLCOM_SHOW_CREATE) + if (wide_handler->sql_command == SQLCOM_SHOW_CREATE) { if (thd->is_error()) { @@ -8657,8 +8398,8 @@ int ha_spider::info( need_mons[search_link_idx] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, search_link_idx, (uint32) share->monitoring_sid[search_link_idx], @@ -8678,7 +8419,8 @@ int ha_spider::info( if ( spider_init_error_table || (spider_init_error_table = - spider_get_init_error_table(trx, share, TRUE)) + spider_get_init_error_table(wide_handler->trx, + share, TRUE)) ) { spider_init_error_table->init_error = error_num; /* @@ -8695,7 +8437,7 @@ int ha_spider::info( share->init_error = TRUE; share->init = TRUE; } - if (sql_command == SQLCOM_SHOW_CREATE) + if (wide_handler->sql_command == SQLCOM_SHOW_CREATE) { if (thd->is_error()) { @@ -8724,7 +8466,7 @@ int ha_spider::info( if ((error_num = spider_create_sts_thread(share))) { pthread_mutex_unlock(&share->sts_mutex); - if (sql_command == SQLCOM_SHOW_CREATE) + if (wide_handler->sql_command == SQLCOM_SHOW_CREATE) { if (thd->is_error()) { @@ -8755,7 +8497,7 @@ int ha_spider::info( { if ((error_num = check_crd())) { - if (sql_command == SQLCOM_SHOW_CREATE) + if (wide_handler->sql_command == SQLCOM_SHOW_CREATE) { if (thd->is_error()) { @@ -8794,8 +8536,7 @@ int ha_spider::info( #ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT auto_inc_temporary = FALSE; #endif -#ifdef WITH_PARTITION_STORAGE_ENGINE - if (share->partition_share && table->next_number_field) + if (share->wide_share && table->next_number_field) { ulonglong first_value, nb_reserved_values; if ( @@ -8832,12 +8573,9 @@ int ha_spider::info( share->lgtm_tblhnd_share->auto_increment_value; } } else { -#endif stats.auto_increment_value = share->lgtm_tblhnd_share->auto_increment_value; -#ifdef WITH_PARTITION_STORAGE_ENGINE } -#endif } } if (flag & HA_STATUS_ERRKEY) @@ -8876,7 +8614,7 @@ ha_rows ha_spider::records_in_range( pthread_mutex_unlock(&share->crd_mutex); else { if ((spider_init_error_table = - spider_get_init_error_table(trx, share, FALSE))) + spider_get_init_error_table(wide_handler->trx, share, FALSE))) { DBUG_PRINT("info",("spider diff=%f", difftime(tmp_time, spider_init_error_table->init_error_time))); @@ -8914,6 +8652,15 @@ ha_rows ha_spider::records_in_range( share->static_key_cardinality[inx] == -1 && difftime(tmp_time, share->crd_get_time) >= crd_interval ) { + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + if (check_error_mode(error_num)) + my_errno = error_num; + DBUG_RETURN(HA_POS_ERROR); + } + } if ( crd_interval == 0 || !pthread_mutex_trylock(&share->crd_mutex) @@ -8939,8 +8686,8 @@ ha_rows ha_spider::records_in_range( need_mons[search_link_idx] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, search_link_idx, (uint32) share->monitoring_sid[search_link_idx], @@ -8960,7 +8707,8 @@ ha_rows ha_spider::records_in_range( if ( spider_init_error_table || (spider_init_error_table = - spider_get_init_error_table(trx, share, TRUE)) + spider_get_init_error_table(wide_handler->trx, + share, TRUE)) ) { spider_init_error_table->init_error = error_num; /* @@ -9148,6 +8896,15 @@ ha_rows ha_spider::records_in_range( DBUG_RETURN((ha_rows) rows); } else if (crd_mode == 3) { + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + if (check_error_mode(error_num)) + my_errno = error_num; + DBUG_RETURN(HA_POS_ERROR); + } + } result_list.key_info = &table->key_info[inx]; DBUG_RETURN(spider_db_explain_select(start_key, end_key, this, search_link_idx)); @@ -9180,7 +8937,7 @@ int ha_spider::check_crd() pthread_mutex_unlock(&share->crd_mutex); else { if ((spider_init_error_table = - spider_get_init_error_table(trx, share, FALSE))) + spider_get_init_error_table(wide_handler->trx, share, FALSE))) { DBUG_PRINT("info",("spider diff=%f", difftime(tmp_time, spider_init_error_table->init_error_time))); @@ -9239,8 +8996,8 @@ int ha_spider::check_crd() need_mons[search_link_idx] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, search_link_idx, (uint32) share->monitoring_sid[search_link_idx], @@ -9260,7 +9017,7 @@ int ha_spider::check_crd() if ( spider_init_error_table || (spider_init_error_table = - spider_get_init_error_table(trx, share, TRUE)) + spider_get_init_error_table(wide_handler->trx, share, TRUE)) ) { spider_init_error_table->init_error = error_num; if ((spider_init_error_table->init_error_with_message = @@ -9320,7 +9077,7 @@ int ha_spider::pre_records() backup_error_status(); DBUG_ENTER("ha_spider::pre_records"); DBUG_PRINT("info",("spider this=%p", this)); - if (sql_command == SQLCOM_ALTER_TABLE) + if (wide_handler->sql_command == SQLCOM_ALTER_TABLE) { DBUG_RETURN(0); } @@ -9328,7 +9085,7 @@ int ha_spider::pre_records() { DBUG_RETURN(0); } - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; if ( spider_param_sync_autocommit(thd) && (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) @@ -9351,7 +9108,7 @@ ha_rows ha_spider::records() backup_error_status(); DBUG_ENTER("ha_spider::records"); DBUG_PRINT("info",("spider this=%p", this)); - if (sql_command == SQLCOM_ALTER_TABLE) + if (wide_handler->sql_command == SQLCOM_ALTER_TABLE) { use_pre_action = FALSE; DBUG_RETURN(0); @@ -9362,7 +9119,7 @@ ha_rows ha_spider::records() } if (!use_pre_action && !this->result_list.direct_limit_offset) { - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; if ( spider_param_sync_autocommit(thd) && (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) @@ -9390,7 +9147,14 @@ int ha_spider::pre_calculate_checksum() backup_error_status(); DBUG_ENTER("ha_spider::pre_calculate_checksum"); DBUG_PRINT("info",("spider this=%p", this)); - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } if ( spider_param_sync_autocommit(thd) && (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) @@ -9414,9 +9178,16 @@ int ha_spider::calculate_checksum() backup_error_status(); DBUG_ENTER("ha_spider::calculate_checksum"); DBUG_PRINT("info",("spider this=%p", this)); + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } if (!use_pre_action && !this->result_list.direct_limit_offset) { - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; if ( spider_param_sync_autocommit(thd) && (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) @@ -9506,6 +9277,36 @@ ulonglong ha_spider::table_flags() const DBUG_RETURN(flags); } +ulong ha_spider::table_flags_for_partition() +{ + DBUG_ENTER("ha_spider::table_flags_for_partition"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN( +#ifdef HA_PT_CALL_AT_ONCE_STORE_LOCK + HA_PT_CALL_AT_ONCE_STORE_LOCK | +#endif +#ifdef HA_PT_CALL_AT_ONCE_EXTERNAL_LOCK + HA_PT_CALL_AT_ONCE_EXTERNAL_LOCK | +#endif +#ifdef HA_PT_CALL_AT_ONCE_START_STMT + HA_PT_CALL_AT_ONCE_START_STMT | +#endif +#ifdef HA_PT_CALL_AT_ONCE_EXTRA + HA_PT_CALL_AT_ONCE_EXTRA | +#endif +#ifdef HA_PT_CALL_AT_ONCE_COND_PUSH + HA_PT_CALL_AT_ONCE_COND_PUSH | +#endif +#ifdef HA_PT_CALL_AT_ONCE_INFO_PUSH + HA_PT_CALL_AT_ONCE_INFO_PUSH | +#endif +#ifdef HA_PT_CALL_AT_ONCE_TOP_TABLE + HA_PT_CALL_AT_ONCE_TOP_TABLE | +#endif + 0 + ); +} + const char *ha_spider::index_type( uint key_number ) { @@ -9633,7 +9434,7 @@ int ha_spider::update_auto_increment() /* if ( next_insert_id >= auto_inc_interval_for_cur_row.maximum() && - trx->thd->auto_inc_intervals_forced.get_current() + wide_handler->trx->thd->auto_inc_intervals_forced.get_current() ) { force_auto_increment = TRUE; DBUG_PRINT("info",("spider force_auto_increment=TRUE")); @@ -9857,6 +9658,13 @@ int ha_spider::write_row( DBUG_RETURN(error_num); } #endif + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } #ifndef SPIDER_WITHOUT_HA_STATISTIC_INCREMENT ha_statistic_increment(&SSV::ha_write_count); #endif @@ -9919,19 +9727,21 @@ int ha_spider::write_row( if (!bulk_insert || bulk_size < 0) { direct_dup_insert = - spider_param_direct_dup_insert(trx->thd, share->direct_dup_insert); + spider_param_direct_dup_insert(wide_handler->trx->thd, + share->direct_dup_insert); DBUG_PRINT("info",("spider direct_dup_insert=%d", direct_dup_insert)); if ((error_num = spider_db_bulk_insert_init(this, table))) DBUG_RETURN(check_error_mode(error_num)); if (bulk_insert) bulk_size = #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS - (insert_with_update && !result_list.insert_dup_update_pushdown) || + (wide_handler->insert_with_update && + !result_list.insert_dup_update_pushdown) || #else - insert_with_update || + wide_handler->insert_with_update || #endif - (!direct_dup_insert && ignore_dup_key) ? - 0 : spider_param_bulk_size(trx->thd, share->bulk_size); + (!direct_dup_insert && wide_handler->ignore_dup_key) ? + 0 : spider_param_bulk_size(wide_handler->trx->thd, share->bulk_size); else bulk_size = 0; } @@ -9955,7 +9765,7 @@ int ha_spider::pre_write_row( ) { int error_num; ulonglong option_backup = 0; - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; DBUG_ENTER("ha_spider::pre_write_row"); DBUG_PRINT("info",("spider this=%p", this)); #if MYSQL_VERSION_ID < 50500 @@ -10193,7 +10003,7 @@ int ha_spider::direct_update_rows_init( st_select_lex *select_lex; longlong select_limit; longlong offset_limit; - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; DBUG_ENTER("ha_spider::direct_update_rows_init"); DBUG_PRINT("info",("spider this=%p", this)); #ifdef HA_CAN_BULK_ACCESS @@ -10222,6 +10032,13 @@ int ha_spider::direct_update_rows_init( #endif } #endif + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } direct_update_init( thd, #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) @@ -10271,7 +10088,7 @@ int ha_spider::direct_update_rows_init( } result_list.direct_order_limit = TRUE; } - trx->direct_update_count++; + wide_handler->trx->direct_update_count++; DBUG_PRINT("info",("spider OK")); DBUG_RETURN(0); } @@ -10314,7 +10131,7 @@ int ha_spider::direct_update_rows_init( DBUG_RETURN(error_num); } #endif - trx->direct_update_count++; + wide_handler->trx->direct_update_count++; DBUG_PRINT("info",("spider OK")); DBUG_RETURN(0); } @@ -10343,10 +10160,10 @@ int ha_spider::direct_update_rows_init() st_select_lex *select_lex; longlong select_limit; longlong offset_limit; - List_iterator<Item> it(*direct_update_fields); + List_iterator<Item> it(*wide_handler->direct_update_fields); Item *item; Field *field; - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; DBUG_ENTER("ha_spider::direct_update_rows_init"); DBUG_PRINT("info",("spider this=%p", this)); if (thd->variables.time_zone != UTC) @@ -10395,14 +10212,21 @@ int ha_spider::direct_update_rows_init() #endif } #endif + if (!dml_inited) + { + if (unlikely(dml_init())) + { + DBUG_RETURN(HA_ERR_WRONG_COMMAND); + } + } direct_update_init( thd, FALSE ); - if (!condition) - cond_check = FALSE; + if (!wide_handler->condition) + wide_handler->cond_check = FALSE; spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit); - if (direct_update_fields) + if (wide_handler->direct_update_fields) { if ( #if MYSQL_VERSION_ID < 50500 @@ -10438,20 +10262,20 @@ int ha_spider::direct_update_rows_init() } result_list.direct_order_limit = TRUE; } - trx->direct_update_count++; + wide_handler->trx->direct_update_count++; DBUG_PRINT("info",("spider OK")); DBUG_RETURN(0); } DBUG_PRINT("info",("spider offset_limit=%lld", offset_limit)); - DBUG_PRINT("info",("spider sql_command=%u", sql_command)); + DBUG_PRINT("info",("spider sql_command=%u", wide_handler->sql_command)); DBUG_PRINT("info",("spider do_direct_update=%s", do_direct_update ? "TRUE" : "FALSE")); if ( !offset_limit && do_direct_update ) { - trx->direct_update_count++; + wide_handler->trx->direct_update_count++; DBUG_PRINT("info",("spider OK")); DBUG_RETURN(0); } @@ -10500,6 +10324,13 @@ int ha_spider::pre_direct_update_rows_init( bulk_access_link_current->called = TRUE; DBUG_RETURN(error_num); } + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } #ifdef SPIDER_MDEV_16246 pre_direct_init_result = direct_update_rows_init( update_fields, mode, ranges, range_count, sorted, new_data); @@ -10544,6 +10375,13 @@ int ha_spider::pre_direct_update_rows_init() bulk_access_link_current->called = TRUE; DBUG_RETURN(error_num); } + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } #ifdef SPIDER_MDEV_16246 pre_direct_init_result = direct_update_rows_init(update_fields); #else @@ -10773,7 +10611,7 @@ int ha_spider::direct_delete_rows_init( st_select_lex *select_lex; longlong select_limit; longlong offset_limit; - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; DBUG_ENTER("ha_spider::direct_delete_rows_init"); DBUG_PRINT("info",("spider this=%p", this)); #ifdef HA_CAN_BULK_ACCESS @@ -10795,6 +10633,13 @@ int ha_spider::direct_delete_rows_init( mode, ranges, range_count, sorted)); } #endif + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } direct_update_init( thd, #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) @@ -10841,7 +10686,7 @@ int ha_spider::direct_delete_rows_init( } result_list.direct_order_limit = TRUE; } - trx->direct_delete_count++; + wide_handler->trx->direct_delete_count++; DBUG_PRINT("info",("spider OK")); DBUG_RETURN(0); } @@ -10864,7 +10709,7 @@ int ha_spider::direct_delete_rows_init( DBUG_RETURN(error_num); } #endif - trx->direct_delete_count++; + wide_handler->trx->direct_delete_count++; DBUG_PRINT("info",("spider OK")); DBUG_RETURN(0); } @@ -10878,7 +10723,7 @@ int ha_spider::direct_delete_rows_init() st_select_lex *select_lex; longlong select_limit; longlong offset_limit; - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; DBUG_ENTER("ha_spider::direct_delete_rows_init"); DBUG_PRINT("info",("spider this=%p", this)); #ifdef HA_CAN_BULK_ACCESS @@ -10899,12 +10744,19 @@ int ha_spider::direct_delete_rows_init() DBUG_RETURN(bulk_access_link_exec_tgt->spider->direct_delete_rows_init()); } #endif + if (!dml_inited) + { + if (unlikely(dml_init())) + { + DBUG_RETURN(HA_ERR_WRONG_COMMAND); + } + } direct_update_init( thd, FALSE ); - if (!condition) - cond_check = FALSE; + if (!wide_handler->condition) + wide_handler->cond_check = FALSE; spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit); if ( #if MYSQL_VERSION_ID < 50500 @@ -10939,7 +10791,7 @@ int ha_spider::direct_delete_rows_init() } result_list.direct_order_limit = TRUE; } - trx->direct_delete_count++; + wide_handler->trx->direct_delete_count++; DBUG_PRINT("info",("spider OK")); DBUG_RETURN(0); } @@ -10965,6 +10817,13 @@ int ha_spider::pre_direct_delete_rows_init( bulk_access_link_current->called = TRUE; DBUG_RETURN(error_num); } + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } pre_direct_init_result = direct_delete_rows_init( mode, ranges, range_count, sorted); DBUG_RETURN(pre_direct_init_result); @@ -10983,6 +10842,13 @@ int ha_spider::pre_direct_delete_rows_init() bulk_access_link_current->called = TRUE; DBUG_RETURN(error_num); } + if (!dml_inited) + { + if (unlikely((error_num = dml_init()))) + { + DBUG_RETURN(error_num); + } + } pre_direct_init_result = direct_delete_rows_init(); DBUG_RETURN(pre_direct_init_result); } @@ -11146,7 +11012,8 @@ int ha_spider::delete_all_rows() sql_kind[roop_count] = SPIDER_SQL_KIND_SQL; if ((error_num = spider_db_delete_all_rows(this))) DBUG_RETURN(check_error_mode(error_num)); - if (sql_command == SQLCOM_TRUNCATE && table->found_next_number_field) + if (wide_handler->sql_command == SQLCOM_TRUNCATE && + table->found_next_number_field) { DBUG_PRINT("info",("spider reset auto increment")); pthread_mutex_lock(&share->lgtm_tblhnd_share->auto_increment_mutex); @@ -11175,7 +11042,7 @@ int ha_spider::truncate() table_share->db.str, table_share->table_name.str); DBUG_RETURN(ER_SPIDER_READ_ONLY_NUM); } - sql_command = SQLCOM_TRUNCATE; + wide_handler->sql_command = SQLCOM_TRUNCATE; if ((error_num = spider_check_trx_and_get_conn(thd, this, FALSE))) { DBUG_RETURN(error_num); @@ -11188,7 +11055,8 @@ int ha_spider::truncate() sql_kind[roop_count] = SPIDER_SQL_KIND_SQL; if ((error_num = spider_db_delete_all_rows(this))) DBUG_RETURN(check_error_mode(error_num)); - if (sql_command == SQLCOM_TRUNCATE && table->found_next_number_field) + if (wide_handler->sql_command == SQLCOM_TRUNCATE && + table->found_next_number_field) { DBUG_PRINT("info",("spider reset auto increment")); pthread_mutex_lock(&share->lgtm_tblhnd_share->auto_increment_mutex); @@ -11208,10 +11076,10 @@ int ha_spider::truncate() void ha_spider::bulk_req_exec() { int need_mon; - SPIDER_CONN *conn = trx->bulk_access_conn_first; + SPIDER_CONN *conn = wide_handler->trx->bulk_access_conn_first; DBUG_ENTER("ha_spider::bulk_req_exec"); DBUG_PRINT("info",("spider this=%p", this)); - DBUG_PRINT("info",("spider trx=%p", trx)); + DBUG_PRINT("info",("spider trx=%p", wide_handler->trx)); DBUG_PRINT("info",("spider first_conn=%p", conn)); while (conn) { @@ -11248,7 +11116,7 @@ void ha_spider::bulk_req_exec() } conn = conn->bulk_access_next; } - trx->bulk_access_conn_first = NULL; + wide_handler->trx->bulk_access_conn_first = NULL; DBUG_VOID_RETURN; } #endif @@ -11270,7 +11138,7 @@ double ha_spider::read_time( ) { DBUG_ENTER("ha_spider::read_time"); DBUG_PRINT("info",("spider this=%p", this)); - if (keyread) + if (wide_handler->keyread) { DBUG_PRINT("info",("spider read_time(keyread) = %.6f", share->read_rate * table->key_info[index].key_length * @@ -11553,6 +11421,27 @@ void ha_spider::update_create_info( ) { DBUG_ENTER("ha_spider::update_create_info"); DBUG_PRINT("info",("spider this=%p", this)); + if (wide_handler && wide_handler->sql_command == SQLCOM_ALTER_TABLE) + { + SPIDER_TRX *trx = wide_handler->trx; + THD *thd = trx->thd; + if (trx->query_id != thd->query_id) + { + spider_free_trx_alter_table(trx); + trx->query_id = thd->query_id; + trx->tmp_flg = FALSE; + } + if (!(SPIDER_ALTER_TABLE*) my_hash_search(&trx->trx_alter_table_hash, + (uchar*) share->table_name, share->table_name_length)) + { + if (spider_create_trx_alter_table(trx, share, FALSE)) + { + store_error_num = HA_ERR_OUT_OF_MEM; + DBUG_VOID_RETURN; + } + } + } + if (!create_info->connect_string.str) { create_info->connect_string.str = table->s->connect_string.str; @@ -12071,6 +11960,54 @@ bool ha_spider::is_fatal_error( DBUG_RETURN(TRUE); } +int ha_spider::set_top_table_and_fields( + TABLE *top_table, + Field **top_table_field, + uint top_table_fields +) { + DBUG_ENTER("ha_spider::set_top_table_and_fields"); +#ifdef WITH_PARTITION_STORAGE_ENGINE + if ( + wide_handler->stage == SPD_HND_STAGE_SET_TOP_TABLE_AND_FIELDS && + wide_handler->stage_executor != this) + { + DBUG_RETURN(0); + } + wide_handler->stage = SPD_HND_STAGE_SET_TOP_TABLE_AND_FIELDS; + wide_handler->stage_executor = this; +#endif + if (!wide_handler->set_top_table_fields) + { + wide_handler->set_top_table_fields = TRUE; + wide_handler->top_table = top_table; + wide_handler->top_table_field = top_table_field; + wide_handler->top_table_fields = top_table_fields; + } + DBUG_RETURN(0); +} +void ha_spider::clear_top_table_fields() +{ + DBUG_ENTER("ha_spider::clear_top_table_fields"); +#ifdef WITH_PARTITION_STORAGE_ENGINE + if ( + wide_handler->stage == SPD_HND_STAGE_CLEAR_TOP_TABLE_FIELDS && + wide_handler->stage_executor != this) + { + DBUG_VOID_RETURN; + } + wide_handler->stage = SPD_HND_STAGE_CLEAR_TOP_TABLE_FIELDS; + wide_handler->stage_executor = this; +#endif + if (wide_handler->set_top_table_fields) + { + wide_handler->set_top_table_fields = FALSE; + wide_handler->top_table = NULL; + wide_handler->top_table_field = NULL; + wide_handler->top_table_fields = 0; + } + DBUG_VOID_RETURN; +} + Field *ha_spider::get_top_table_field( uint16 field_index ) { @@ -12084,9 +12021,9 @@ Field *ha_spider::get_top_table_field( #endif DBUG_PRINT("info",("spider field_index=%u", field_index)); #ifdef HANDLER_HAS_TOP_TABLE_FIELDS - if (set_top_table_fields) + if (wide_handler->set_top_table_fields) { - field = top_table->field[field_index]; + field = wide_handler->top_table->field[field_index]; } else { #endif field = table->field[field_index]; @@ -12110,12 +12047,12 @@ Field *ha_spider::field_exchange( DBUG_PRINT("info",("spider in field=%p", field)); DBUG_PRINT("info",("spider in field->table=%p", field->table)); #ifdef HANDLER_HAS_TOP_TABLE_FIELDS - if (set_top_table_fields) + if (wide_handler->set_top_table_fields) { - DBUG_PRINT("info",("spider top_table=%p", top_table)); - if (field->table != top_table) + DBUG_PRINT("info",("spider top_table=%p", wide_handler->top_table)); + if (field->table != wide_handler->top_table) DBUG_RETURN(NULL); - if (!(field = top_table_field[field->field_index])) + if (!(field = wide_handler->top_table_field[field->field_index])) DBUG_RETURN(NULL); } else { #endif @@ -12133,7 +12070,17 @@ const COND *ha_spider::cond_push( const COND *cond ) { DBUG_ENTER("ha_spider::cond_push"); - cond_check = FALSE; +#ifdef WITH_PARTITION_STORAGE_ENGINE + if ( + wide_handler->stage == SPD_HND_STAGE_COND_PUSH && + wide_handler->stage_executor != this) + { + DBUG_RETURN(NULL); + } + wide_handler->stage = SPD_HND_STAGE_COND_PUSH; + wide_handler->stage_executor = this; +#endif + wide_handler->cond_check = FALSE; if (cond) { SPIDER_CONDITION *tmp_cond; @@ -12142,8 +12089,8 @@ const COND *ha_spider::cond_push( ) DBUG_RETURN(cond); tmp_cond->cond = (COND *) cond; - tmp_cond->next = condition; - condition = tmp_cond; + tmp_cond->next = wide_handler->condition; + wide_handler->condition = tmp_cond; } DBUG_RETURN(NULL); } @@ -12151,11 +12098,21 @@ const COND *ha_spider::cond_push( void ha_spider::cond_pop() { DBUG_ENTER("ha_spider::cond_pop"); - if (condition) +#ifdef WITH_PARTITION_STORAGE_ENGINE + if ( + wide_handler->stage == SPD_HND_STAGE_COND_POP && + wide_handler->stage_executor != this) { - SPIDER_CONDITION *tmp_cond = condition->next; - spider_free(spider_current_trx, condition, MYF(0)); - condition = tmp_cond; + DBUG_VOID_RETURN; + } + wide_handler->stage = SPD_HND_STAGE_COND_POP; + wide_handler->stage_executor = this; +#endif + if (wide_handler->condition) + { + SPIDER_CONDITION *tmp_cond = wide_handler->condition->next; + spider_free(spider_current_trx, wide_handler->condition, MYF(0)); + wide_handler->condition = tmp_cond; } DBUG_VOID_RETURN; } @@ -12167,6 +12124,16 @@ int ha_spider::info_push( int error_num = 0; DBUG_ENTER("ha_spider::info_push"); DBUG_PRINT("info",("spider this=%p", this)); +#ifdef WITH_PARTITION_STORAGE_ENGINE + if ( + wide_handler->stage == SPD_HND_STAGE_INFO_PUSH && + wide_handler->stage_executor != this) + { + DBUG_RETURN(0); + } + wide_handler->stage = SPD_HND_STAGE_INFO_PUSH; + wide_handler->stage_executor = this; +#endif #ifdef HA_CAN_BULK_ACCESS if ( #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS @@ -12206,34 +12173,39 @@ int ha_spider::info_push( size_t roop_count; Field *field; SPIDER_HS_UINT32_INFO *tmp_info = (SPIDER_HS_UINT32_INFO *) info; - hs_pushed_ret_fields_num = tmp_info->info_size; - if (hs_pushed_ret_fields_size < hs_pushed_ret_fields_num) + wide_handler->hs_pushed_ret_fields_num = tmp_info->info_size; + if (wide_handler->hs_pushed_ret_fields_size < + wide_handler->hs_pushed_ret_fields_num) { - if (hs_pushed_ret_fields) - spider_free(spider_current_trx, hs_pushed_ret_fields, MYF(0)); - if (!(hs_pushed_ret_fields = (uint32 *) + if (wide_handler->hs_pushed_ret_fields) + spider_free(spider_current_trx, wide_handler->hs_pushed_ret_fields, + MYF(0)); + if (!(wide_handler->hs_pushed_ret_fields = (uint32 *) spider_bulk_malloc(spider_current_trx, 17, MYF(MY_WME), - &hs_pushed_ret_fields, - (uint) (sizeof(uint32) * hs_pushed_ret_fields_num), + &wide_handler->hs_pushed_ret_fields, + sizeof(uint32) * wide_handler->hs_pushed_ret_fields_num, NullS)) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - hs_pushed_ret_fields_size = hs_pushed_ret_fields_num; + wide_handler->hs_pushed_ret_fields_size = + wide_handler->hs_pushed_ret_fields_num; } - memcpy(hs_pushed_ret_fields, tmp_info->info, - sizeof(uint32) * hs_pushed_ret_fields_num); + memcpy(wide_handler->hs_pushed_ret_fields, tmp_info->info, + sizeof(uint32) * wide_handler->hs_pushed_ret_fields_num); bitmap_clear_all(table->read_set); bitmap_clear_all(table->write_set); - hs_pushed_lcl_fields_num = 0; - for (roop_count = 0; roop_count < hs_pushed_ret_fields_num; roop_count++) + wide_handler->hs_pushed_lcl_fields_num = 0; + for (roop_count = 0; roop_count < wide_handler->hs_pushed_ret_fields_num; + roop_count++) { - field = get_top_table_field(hs_pushed_ret_fields[roop_count]); + field = get_top_table_field( + wide_handler->hs_pushed_ret_fields[roop_count]); if ((field = field_exchange(field))) { if (!bitmap_is_set(table->read_set, field->field_index)) { - ++hs_pushed_lcl_fields_num; + ++wide_handler->hs_pushed_lcl_fields_num; bitmap_set_bit(table->read_set, field->field_index); bitmap_set_bit(table->write_set, field->field_index); } @@ -12255,172 +12227,168 @@ int ha_spider::info_push( } #endif Field *field; - if (hs_pushed_ret_fields) + if (wide_handler->hs_pushed_ret_fields) { field = get_top_table_field( - hs_pushed_ret_fields[hs_pushed_strref_num]); + wide_handler->hs_pushed_ret_fields[ + wide_handler->hs_pushed_strref_num]); } else { field = get_top_table_field( - pt_clone_source_handler->hs_pushed_ret_fields[hs_pushed_strref_num]); + pt_clone_source_handler->wide_handler->hs_pushed_ret_fields[ + wide_handler->hs_pushed_strref_num]); } if (!field_exchange(field)) { - hs_pushed_strref_num++; + wide_handler->hs_pushed_strref_num++; break; } - hs_pushed_strref_num++; - if ((error_num = push_back_hs_upds(*((SPIDER_HS_STRING_REF*) info)))) + wide_handler->hs_pushed_strref_num++; + if (partition_handler_share && partition_handler_share->handlers) { - DBUG_RETURN(error_num); + size_t roop_count; + ha_spider **handlers = partition_handler_share->handlers; + for (roop_count = 0; roop_count < partition_handler_share->no_parts; + ++roop_count) + { + if ((error_num = handlers[roop_count]->push_back_hs_upds( + *((SPIDER_HS_STRING_REF*) info)))) + { + DBUG_RETURN(error_num); + } + } + } else { + if ((error_num = push_back_hs_upds(*((SPIDER_HS_STRING_REF*) info)))) + { + DBUG_RETURN(error_num); + } } break; } case INFO_KIND_HS_CLEAR_STRING_REF: DBUG_PRINT("info",("spider INFO_KIND_HS_CLEAR_STRING_REF")); - hs_pushed_strref_num = 0; - if ((error_num = reset_hs_upds(SPIDER_SQL_TYPE_UPDATE_HS))) + wide_handler->hs_pushed_strref_num = 0; + if (partition_handler_share && partition_handler_share->handlers) { - DBUG_RETURN(error_num); + size_t roop_count; + ha_spider **handlers = partition_handler_share->handlers; + for (roop_count = 0; roop_count < partition_handler_share->no_parts; + ++roop_count) + { + if ((error_num = handlers[roop_count]->reset_hs_upds( + SPIDER_SQL_TYPE_UPDATE_HS))) + { + DBUG_RETURN(error_num); + } + } + } else { + if ((error_num = reset_hs_upds(SPIDER_SQL_TYPE_UPDATE_HS))) + { + DBUG_RETURN(error_num); + } } break; case INFO_KIND_HS_INCREMENT_BEGIN: DBUG_PRINT("info",("spider INFO_KIND_HS_INCREMENT_BEGIN")); - hs_increment = TRUE; + wide_handler->hs_increment = TRUE; break; case INFO_KIND_HS_INCREMENT_END: DBUG_PRINT("info",("spider INFO_KIND_HS_INCREMENT_END")); - hs_increment = FALSE; + wide_handler->hs_increment = FALSE; break; case INFO_KIND_HS_DECREMENT_BEGIN: DBUG_PRINT("info",("spider INFO_KIND_HS_DECREMENT_BEGIN")); - hs_decrement = TRUE; + wide_handler->hs_decrement = TRUE; break; case INFO_KIND_HS_DECREMENT_END: DBUG_PRINT("info",("spider INFO_KIND_HS_DECREMENT_END")); - hs_decrement = FALSE; + wide_handler->hs_decrement = FALSE; break; #endif #ifdef INFO_KIND_UPDATE_FIELDS case INFO_KIND_UPDATE_FIELDS: DBUG_PRINT("info",("spider INFO_KIND_UPDATE_FIELDS")); - direct_update_fields = (List<Item> *) info; - update_request = TRUE; + wide_handler->direct_update_fields = (List<Item> *) info; + wide_handler->update_request = TRUE; #ifdef WITH_PARTITION_STORAGE_ENGINE - if (keyread && check_partitioned()) - keyread = FALSE; + if (wide_handler->keyread && check_partitioned()) + wide_handler->keyread = FALSE; #endif break; #endif #ifdef INFO_KIND_UPDATE_VALUES case INFO_KIND_UPDATE_VALUES: DBUG_PRINT("info",("spider INFO_KIND_UPDATE_VALUES")); - direct_update_values = (List<Item> *) info; + wide_handler->direct_update_values = (List<Item> *) info; break; #endif #ifdef INFO_KIND_FORCE_LIMIT_BEGIN case INFO_KIND_FORCE_LIMIT_BEGIN: DBUG_PRINT("info",("spider INFO_KIND_FORCE_LIMIT_BEGIN")); - info_limit = *((longlong *) info); -/* - trx->direct_aggregate_count++; -*/ + wide_handler->info_limit = *((longlong *) info); break; case INFO_KIND_FORCE_LIMIT_END: DBUG_PRINT("info",("spider INFO_KIND_FORCE_LIMIT_END")); - info_limit = 9223372036854775807LL; + wide_handler->info_limit = 9223372036854775807LL; break; #endif #endif #ifdef HA_CAN_BULK_ACCESS case INFO_KIND_BULK_ACCESS_BEGIN: DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_BEGIN")); - if (bulk_access_started) + if (partition_handler_share && partition_handler_share->handlers) { - if (!bulk_access_link_current->next) + size_t roop_count; + ha_spider **handlers = partition_handler_share->handlers; + for (roop_count = 0; roop_count < partition_handler_share->no_parts; + ++roop_count) { - if (!(bulk_access_link_current->next = create_bulk_access_link())) + if ((error_num = handlers[roop_count]->bulk_access_begin(info))) { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); + DBUG_RETURN(error_num); } - bulk_access_link_current->next->sequence_num = - bulk_access_link_current->sequence_num + 1; } - bulk_access_link_current = bulk_access_link_current->next; } else { - if (!bulk_access_link_first) + if ((error_num = bulk_access_begin(info))) { - if (!(bulk_access_link_first = create_bulk_access_link())) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - bulk_access_link_first->sequence_num = 0; + DBUG_RETURN(error_num); } - bulk_access_link_current = bulk_access_link_first; - bulk_access_started = TRUE; - bulk_access_executing = FALSE; - } - if ( - (error_num = bulk_access_link_current->spider-> - sync_from_clone_source(this)) || - (error_num = bulk_access_link_current->spider-> - check_access_kind(trx->thd, (lock_type >= TL_WRITE_ALLOW_WRITE))) - ) { - DBUG_RETURN(error_num); } -#ifdef HA_CAN_BULK_ACCESS -#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) - memset( - bulk_access_link_current->spider->result_list.hs_r_bulk_open_index, 0, - share->link_bitmap_size); - memset( - bulk_access_link_current->spider->result_list.hs_w_bulk_open_index, 0, - share->link_bitmap_size); -#endif -#endif -/* -#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) - if ((error_num = bulk_access_link_current->spider->reset_hs_strs_pos( - SPIDER_SQL_TYPE_UPDATE_HS))) - { - DBUG_RETURN(error_num); - } -#endif -*/ - bulk_access_link_current->spider->bulk_access_executing = FALSE; - bulk_access_link_current->spider->bulk_access_pre_called = FALSE; - bulk_access_link_current->used = TRUE; - bulk_access_link_current->called = FALSE; - *((void **) info) = bulk_access_link_current; break; case INFO_KIND_BULK_ACCESS_CURRENT: DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_CURRENT")); - bulk_access_executing = TRUE; - bulk_access_link_exec_tgt = (SPIDER_BULK_ACCESS_LINK *) info; - if (bulk_access_link_exec_tgt->spider->pt_clone_source_handler != this) - { - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_PRINT("info",("spider pt_clone_source_handler=%p", - bulk_access_link_exec_tgt->spider->pt_clone_source_handler)); - /* partitioned */ - uint sequence_num = bulk_access_link_exec_tgt->sequence_num; - for ( - bulk_access_link_exec_tgt = bulk_access_link_first; - bulk_access_link_exec_tgt; - bulk_access_link_exec_tgt = bulk_access_link_exec_tgt->next - ) { - if (bulk_access_link_exec_tgt->sequence_num >= sequence_num) + if (partition_handler_share && partition_handler_share->handlers) + { + size_t roop_count; + ha_spider **handlers = partition_handler_share->handlers; + for (roop_count = 0; roop_count < partition_handler_share->no_parts; + ++roop_count) + { + if ((error_num = handlers[roop_count]->bulk_access_current(info))) { - DBUG_ASSERT( - bulk_access_link_exec_tgt->sequence_num == sequence_num); - break; + DBUG_RETURN(error_num); } } + } else { + if ((error_num = bulk_access_current(info))) + { + DBUG_RETURN(error_num); + } } - bulk_access_link_exec_tgt->spider->bulk_access_executing = TRUE; break; case INFO_KIND_BULK_ACCESS_END: DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_END")); - bulk_access_started = FALSE; + if (partition_handler_share && partition_handler_share->handlers) + { + size_t roop_count; + ha_spider **handlers = partition_handler_share->handlers; + for (roop_count = 0; roop_count < partition_handler_share->no_parts; + ++roop_count) + { + handlers[roop_count]->bulk_access_end(); + } + } else { + bulk_access_end(); + } break; #endif default: @@ -12486,7 +12454,8 @@ void ha_spider::set_ft_discard_bitmap() if (!field || !(field = field_exchange(field))) continue; DBUG_PRINT("info",("spider clear_bit=%u", field->field_index)); - spider_clear_bit(ft_discard_bitmap, field->field_index); + spider_clear_bit(wide_handler->ft_discard_bitmap, + field->field_index); } } } @@ -12512,7 +12481,8 @@ void ha_spider::set_ft_discard_bitmap() if (!field || !(field = field_exchange(field))) continue; DBUG_PRINT("info",("spider field_index=%u", field->field_index)); - if (!spider_bit_is_set(ft_discard_bitmap, field->field_index)) + if (!spider_bit_is_set(wide_handler->ft_discard_bitmap, + field->field_index)) { bool match_flag = FALSE; List_iterator_fast<Item_func_match> fmi(*select_lex->ftfunc_list); @@ -12538,7 +12508,8 @@ void ha_spider::set_ft_discard_bitmap() if (!match_flag) { DBUG_PRINT("info",("spider set_bit=%u", field->field_index)); - spider_set_bit(ft_discard_bitmap, field->field_index); + spider_set_bit(wide_handler->ft_discard_bitmap, + field->field_index); } } } @@ -12554,18 +12525,19 @@ void ha_spider::set_searched_bitmap() for (roop_count = 0; roop_count < (int) ((table_share->fields + 7) / 8); roop_count++) { - searched_bitmap[roop_count] = + wide_handler->searched_bitmap[roop_count] = ((uchar *) table->read_set->bitmap)[roop_count] | ((uchar *) table->write_set->bitmap)[roop_count]; DBUG_PRINT("info",("spider roop_count=%d", roop_count)); DBUG_PRINT("info",("spider searched_bitmap=%d", - searched_bitmap[roop_count])); + wide_handler->searched_bitmap[roop_count])); DBUG_PRINT("info",("spider read_set=%d", ((uchar *) table->read_set->bitmap)[roop_count])); DBUG_PRINT("info",("spider write_set=%d", ((uchar *) table->write_set->bitmap)[roop_count])); } - if (sql_command == SQLCOM_UPDATE || sql_command == SQLCOM_UPDATE_MULTI) + if (wide_handler->sql_command == SQLCOM_UPDATE || + wide_handler->sql_command == SQLCOM_UPDATE_MULTI) { DBUG_PRINT("info",("spider update option start")); Item *item; @@ -12581,7 +12553,7 @@ void ha_spider::set_searched_bitmap() DBUG_PRINT("info",("spider field is for different table")); continue; } - spider_set_bit(searched_bitmap, field->field_index); + spider_set_bit(wide_handler->searched_bitmap, field->field_index); DBUG_PRINT("info",("spider set searched_bitmap=%u", field->field_index)); } else { @@ -12595,23 +12567,26 @@ void ha_spider::set_searched_bitmap() void ha_spider::set_clone_searched_bitmap() { DBUG_ENTER("ha_spider::set_clone_searched_bitmap"); - DBUG_PRINT("info",("spider searched_bitmap=%p", searched_bitmap)); + DBUG_PRINT("info",("spider searched_bitmap=%p", + wide_handler->searched_bitmap)); #ifndef DBUG_OFF int roop_count; for (roop_count = 0; roop_count < (int) ((table_share->fields + 7) / 8); roop_count++) DBUG_PRINT("info", ("spider before searched_bitmap is %x", - ((uchar *) searched_bitmap)[roop_count])); + ((uchar *) wide_handler->searched_bitmap)[roop_count])); #endif - memcpy(searched_bitmap, pt_clone_source_handler->searched_bitmap, + memcpy(wide_handler->searched_bitmap, + pt_clone_source_handler->wide_handler->searched_bitmap, (table_share->fields + 7) / 8); #ifndef DBUG_OFF for (roop_count = 0; roop_count < (int) ((table_share->fields + 7) / 8); roop_count++) DBUG_PRINT("info", ("spider after searched_bitmap is %x", - ((uchar *) searched_bitmap)[roop_count])); + ((uchar *) wide_handler->searched_bitmap)[roop_count])); #endif - memcpy(ft_discard_bitmap, pt_clone_source_handler->ft_discard_bitmap, + memcpy(wide_handler->ft_discard_bitmap, + pt_clone_source_handler->wide_handler->ft_discard_bitmap, (table_share->fields + 7) / 8); DBUG_VOID_RETURN; } @@ -12643,7 +12618,7 @@ void ha_spider::set_searched_bitmap_from_item_list() if (!field || !(field = field_exchange(field))) continue; DBUG_PRINT("info",("spider field_index=%u", field->field_index)); - spider_set_bit(searched_bitmap, field->field_index); + spider_set_bit(wide_handler->searched_bitmap, field->field_index); } DBUG_VOID_RETURN; } @@ -12654,9 +12629,9 @@ void ha_spider::set_select_column_mode() KEY *key_info; KEY_PART_INFO *key_part; Field *field; - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; DBUG_ENTER("ha_spider::set_select_column_mode"); - position_bitmap_init = FALSE; + wide_handler->position_bitmap_init = FALSE; #ifndef DBUG_OFF for (roop_count = 0; roop_count < (int) ((table_share->fields + 7) / 8); roop_count++) @@ -12667,72 +12642,48 @@ void ha_spider::set_select_column_mode() share->select_column_mode); if (select_column_mode) { - DBUG_PRINT("info",("spider searched_bitmap=%p", searched_bitmap)); -#ifdef WITH_PARTITION_STORAGE_ENGINE - if ( - partition_handler_share && - partition_handler_share->searched_bitmap - ) { - if (partition_handler_share->searched_bitmap != searched_bitmap) - { - memcpy(searched_bitmap, partition_handler_share->searched_bitmap, - (table_share->fields + 7) / 8); - memcpy(ft_discard_bitmap, partition_handler_share->ft_discard_bitmap, - (table_share->fields + 7) / 8); - } - partition_handler_share->between_flg = FALSE; - DBUG_PRINT("info",("spider copy searched_bitmap")); - } else { -#endif - set_searched_bitmap(); - set_searched_bitmap_from_item_list(); - if (result_list.lock_type == F_WRLCK && sql_command != SQLCOM_SELECT) - { + DBUG_PRINT("info",("spider searched_bitmap=%p", + wide_handler->searched_bitmap)); + set_searched_bitmap(); + set_searched_bitmap_from_item_list(); + if (wide_handler->external_lock_type == F_WRLCK && + wide_handler->sql_command != SQLCOM_SELECT) + { #ifdef WITH_PARTITION_STORAGE_ENGINE - uint part_num = 0; - if (update_request) - part_num = check_partitioned(); + uint part_num = 0; + if (wide_handler->update_request) + part_num = check_partitioned(); #endif - if ( + if ( #ifdef WITH_PARTITION_STORAGE_ENGINE - part_num || + part_num || #endif - table_share->primary_key == MAX_KEY - ) { - /* need all columns */ - for (roop_count = 0; roop_count < (int) table_share->fields; - roop_count++) - spider_set_bit(searched_bitmap, roop_count); - } else { - /* need primary key columns */ - key_info = &table_share->key_info[table_share->primary_key]; - key_part = key_info->key_part; - for (roop_count = 0; - roop_count < (int) spider_user_defined_key_parts(key_info); - roop_count++) - { - field = key_part[roop_count].field; - spider_set_bit(searched_bitmap, field->field_index); - } - } -#ifndef DBUG_OFF + table_share->primary_key == MAX_KEY + ) { + /* need all columns */ + for (roop_count = 0; roop_count < (int) table_share->fields; + roop_count++) + spider_set_bit(wide_handler->searched_bitmap, roop_count); + } else { + /* need primary key columns */ + key_info = &table_share->key_info[table_share->primary_key]; + key_part = key_info->key_part; for (roop_count = 0; - roop_count < (int) ((table_share->fields + 7) / 8); + roop_count < (int) spider_user_defined_key_parts(key_info); roop_count++) - DBUG_PRINT("info", ("spider change bitmap is %x", - searched_bitmap[roop_count])); -#endif - } -#ifdef WITH_PARTITION_STORAGE_ENGINE - if (partition_handler_share) - { - partition_handler_share->searched_bitmap = searched_bitmap; - partition_handler_share->ft_discard_bitmap = ft_discard_bitmap; - partition_handler_share->between_flg = TRUE; - DBUG_PRINT("info",("spider set searched_bitmap")); + { + field = key_part[roop_count].field; + spider_set_bit(wide_handler->searched_bitmap, field->field_index); + } } - } +#ifndef DBUG_OFF + for (roop_count = 0; + roop_count < (int) ((table_share->fields + 7) / 8); + roop_count++) + DBUG_PRINT("info", ("spider change bitmap is %x", + wide_handler->searched_bitmap[roop_count])); #endif + } } DBUG_VOID_RETURN; } @@ -12740,55 +12691,55 @@ void ha_spider::set_select_column_mode() #ifdef WITH_PARTITION_STORAGE_ENGINE void ha_spider::check_select_column(bool rnd) { - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; DBUG_ENTER("ha_spider::check_select_column"); select_column_mode = spider_param_select_column_mode(thd, share->select_column_mode); - if (select_column_mode && partition_handler_share) + if (select_column_mode) { if (!rnd) { - if (partition_handler_share->between_flg) + if (wide_handler->between_flg) { - memcpy(partition_handler_share->idx_read_bitmap, + memcpy(wide_handler->idx_read_bitmap, table->read_set->bitmap, (table_share->fields + 7) / 8); - memcpy(partition_handler_share->idx_write_bitmap, + memcpy(wide_handler->idx_write_bitmap, table->write_set->bitmap, (table_share->fields + 7) / 8); - partition_handler_share->between_flg = FALSE; - partition_handler_share->idx_bitmap_is_set = TRUE; + wide_handler->between_flg = FALSE; + wide_handler->idx_bitmap_is_set = TRUE; DBUG_PRINT("info",("spider set idx_bitmap")); - } else if (partition_handler_share->idx_bitmap_is_set) + } else if (wide_handler->idx_bitmap_is_set) { memcpy(table->read_set->bitmap, - partition_handler_share->idx_read_bitmap, + wide_handler->idx_read_bitmap, (table_share->fields + 7) / 8); memcpy(table->write_set->bitmap, - partition_handler_share->idx_write_bitmap, + wide_handler->idx_write_bitmap, (table_share->fields + 7) / 8); DBUG_PRINT("info",("spider copy idx_bitmap")); } } else { if ( - !partition_handler_share->rnd_bitmap_is_set && + !wide_handler->rnd_bitmap_is_set && ( - partition_handler_share->between_flg || - partition_handler_share->idx_bitmap_is_set + wide_handler->between_flg || + wide_handler->idx_bitmap_is_set ) ) { - memcpy(partition_handler_share->rnd_read_bitmap, + memcpy(wide_handler->rnd_read_bitmap, table->read_set->bitmap, (table_share->fields + 7) / 8); - memcpy(partition_handler_share->rnd_write_bitmap, + memcpy(wide_handler->rnd_write_bitmap, table->write_set->bitmap, (table_share->fields + 7) / 8); - partition_handler_share->between_flg = FALSE; - partition_handler_share->rnd_bitmap_is_set = TRUE; + wide_handler->between_flg = FALSE; + wide_handler->rnd_bitmap_is_set = TRUE; DBUG_PRINT("info",("spider set rnd_bitmap")); - } else if (partition_handler_share->rnd_bitmap_is_set) + } else if (wide_handler->rnd_bitmap_is_set) { memcpy(table->read_set->bitmap, - partition_handler_share->rnd_read_bitmap, + wide_handler->rnd_read_bitmap, (table_share->fields + 7) / 8); memcpy(table->write_set->bitmap, - partition_handler_share->rnd_write_bitmap, + wide_handler->rnd_write_bitmap, (table_share->fields + 7) / 8); DBUG_PRINT("info",("spider copy rnd_bitmap")); } @@ -13007,11 +12958,11 @@ int ha_spider::check_ha_range_eof() result_list.use_both_key ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider sql_kind[%u]=%u", search_link_idx, sql_kind[search_link_idx])); - DBUG_PRINT("info",("spider sql_command=%u", sql_command)); + DBUG_PRINT("info",("spider sql_command=%u", wide_handler->sql_command)); if ( result_list.use_both_key && (sql_kind[search_link_idx] & SPIDER_SQL_KIND_HANDLER) && - sql_command != SQLCOM_HA_READ + wide_handler->sql_command != SQLCOM_HA_READ ) { int cmp_result = key_cmp(result_list.key_info->key_part, end_key->key, end_key->length); @@ -13089,8 +13040,8 @@ int ha_spider::drop_tmp_tables() need_mons[roop_count] ) { tmp_error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -13110,7 +13061,7 @@ int ha_spider::drop_tmp_tables() if (!tmp_error_num) { spider_conn_set_timeout_from_share(conn, roop_count, - trx->thd, share); + wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL, conn, @@ -13125,8 +13076,8 @@ int ha_spider::drop_tmp_tables() need_mons[roop_count] ) { tmp_error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -13245,8 +13196,8 @@ int ha_spider::close_opened_handler( need_mons[link_idx] ) { error_num2 = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, link_idx, (uint32) share->monitoring_sid[link_idx], @@ -13264,9 +13215,10 @@ int ha_spider::close_opened_handler( error_num = error_num2; } spider_clear_bit(m_handler_opened, link_idx); - if (release_conn) + if (release_conn && !conns[link_idx]->join_trx) { - spider_free_conn_from_trx(trx, conns[link_idx], FALSE, FALSE, NULL); + spider_free_conn_from_trx(wide_handler->trx, conns[link_idx], + FALSE, FALSE, NULL); conns[link_idx] = NULL; } } @@ -13281,8 +13233,8 @@ int ha_spider::close_opened_handler( need_mons[link_idx] ) { error_num2 = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, link_idx, (uint32) share->monitoring_sid[link_idx], @@ -13300,16 +13252,18 @@ int ha_spider::close_opened_handler( error_num = error_num2; } spider_clear_bit(r_handler_opened, link_idx); - if (release_conn) + if (release_conn && !hs_w_conns[link_idx]->join_trx) { if ( !hs_r_conns[link_idx]->opened_handlers && - trx->trx_hs_r_conn_adjustment == trx_hs_r_conn_adjustment && - spider_param_hs_r_conn_recycle_mode(trx->thd) != 2 + wide_handler->trx->trx_hs_r_conn_adjustment == + trx_hs_r_conn_adjustment && + spider_param_hs_r_conn_recycle_mode(wide_handler->trx->thd) != 2 ) { - trx->trx_hs_r_conn_adjustment++; + wide_handler->trx->trx_hs_r_conn_adjustment++; } - spider_free_conn_from_trx(trx, hs_r_conns[link_idx], FALSE, FALSE, NULL); + spider_free_conn_from_trx(wide_handler->trx, hs_r_conns[link_idx], + FALSE, FALSE, NULL); hs_r_conns[link_idx] = NULL; } } @@ -13323,8 +13277,8 @@ int ha_spider::close_opened_handler( need_mons[link_idx] ) { error_num2 = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, link_idx, (uint32) share->monitoring_sid[link_idx], @@ -13342,16 +13296,18 @@ int ha_spider::close_opened_handler( error_num = error_num2; } spider_clear_bit(w_handler_opened, link_idx); - if (release_conn) + if (release_conn && !hs_w_conns[link_idx]->join_trx) { if ( !hs_w_conns[link_idx]->opened_handlers && - trx->trx_hs_w_conn_adjustment == trx_hs_w_conn_adjustment && - spider_param_hs_w_conn_recycle_mode(trx->thd) != 2 + wide_handler->trx->trx_hs_w_conn_adjustment == + trx_hs_w_conn_adjustment && + spider_param_hs_w_conn_recycle_mode(wide_handler->trx->thd) != 2 ) { - trx->trx_hs_w_conn_adjustment++; + wide_handler->trx->trx_hs_w_conn_adjustment++; } - spider_free_conn_from_trx(trx, hs_w_conns[link_idx], FALSE, FALSE, NULL); + spider_free_conn_from_trx(wide_handler->trx, hs_w_conns[link_idx], + FALSE, FALSE, NULL); hs_w_conns[link_idx] = NULL; } } @@ -13425,8 +13381,8 @@ int ha_spider::index_handler_init() need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -13532,8 +13488,8 @@ int ha_spider::rnd_handler_init() need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, + wide_handler->trx, + wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -13720,7 +13676,7 @@ void ha_spider::check_pre_call( thd->query_id != partition_handler_share->parallel_search_query_id ) { partition_handler_share->parallel_search_query_id = thd->query_id; - ++trx->parallel_search_count; + ++wide_handler->trx->parallel_search_count; } use_pre_call = use_parallel; if (!use_pre_call) @@ -13742,7 +13698,7 @@ void ha_spider::check_pre_call( #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS void ha_spider::check_insert_dup_update_pushdown() { - THD *thd = trx->thd; + THD *thd = wide_handler->trx->thd; DBUG_ENTER("ha_spider::check_insert_dup_update_pushdown"); DBUG_PRINT("info",("spider this=%p", this)); if (!spider_param_direct_dup_insert(thd, share->direct_dup_insert)) @@ -13750,8 +13706,8 @@ void ha_spider::check_insert_dup_update_pushdown() DBUG_PRINT("info",("spider FALSE by direct_dup_insert")); DBUG_VOID_RETURN; } - direct_update_fields = &thd->lex->update_list; - direct_update_values = &thd->lex->value_list; + wide_handler->direct_update_fields = &thd->lex->update_list; + wide_handler->direct_update_values = &thd->lex->value_list; if (!append_dup_update_pushdown_sql_part(NULL, 0)) { result_list.insert_dup_update_pushdown = TRUE; @@ -13846,14 +13802,14 @@ int ha_spider::sync_from_clone_source( if (!synced_from_clone_source) { DBUG_PRINT("info",("spider synced from clone source all")); - trx = spider->trx; + wide_handler->trx = spider->wide_handler->trx; sql_command = spider->sql_command; #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) conn_kinds = spider->conn_kinds; memcpy(conn_kind, spider->conn_kind, sizeof(uint) * share->link_count); #endif - result_list.lock_type = spider->result_list.lock_type; - lock_type = spider->lock_type; + wide_handler->external_lock_type = + spider->wide_handler->external_lock_type; selupd_lock_mode = spider->selupd_lock_mode; update_request = spider->update_request; lock_mode = spider->lock_mode; @@ -13894,8 +13850,8 @@ int ha_spider::sync_from_clone_source( conn_kinds = spider->conn_kinds; memcpy(conn_kind, spider->conn_kind, sizeof(uint) * share->link_count); #endif - result_list.lock_type = spider->result_list.lock_type; - lock_type = spider->lock_type; + wide_handler->external_lock_type = + spider->wide_handler->external_lock_type; selupd_lock_mode = spider->selupd_lock_mode; update_request = spider->update_request; lock_mode = spider->lock_mode; @@ -13903,7 +13859,8 @@ int ha_spider::sync_from_clone_source( insert_delayed = spider->insert_delayed; low_priority = spider->low_priority; - if ((error_num = spider_check_trx_and_get_conn(spider->trx->thd, + if ((error_num = spider_check_trx_and_get_conn( + spider->wide_handler->trx->thd, this, TRUE))) { DBUG_RETURN(error_num); @@ -14896,7 +14853,7 @@ int ha_spider::append_sum_select_sql_part( DBUG_RETURN(error_num); } } - trx->direct_aggregate_count++; + wide_handler->trx->direct_aggregate_count++; DBUG_RETURN(0); } #endif @@ -15860,14 +15817,16 @@ int ha_spider::mk_bulk_tmp_table_and_bulk_start() if ( !tmp_table[roop_count] && !(tmp_table[roop_count] = spider_mk_sys_tmp_table( - trx->thd, table, &result_list.upd_tmp_tbl_prms[roop_count], + wide_handler->trx->thd, table, + &result_list.upd_tmp_tbl_prms[roop_count], &field_name, result_list.update_sqls[roop_count].charset())) ) #else if ( !tmp_table[roop_count] && !(tmp_table[roop_count] = spider_mk_sys_tmp_table( - trx->thd, table, &result_list.upd_tmp_tbl_prms[roop_count], "a", + wide_handler->trx->thd, table, + &result_list.upd_tmp_tbl_prms[roop_count], "a", result_list.update_sqls[roop_count].charset())) ) #endif @@ -15887,7 +15846,8 @@ error_2: if (tmp_table[roop_count - 1]) { tmp_table[roop_count - 1]->file->ha_end_bulk_insert(); - spider_rm_sys_tmp_table(trx->thd, tmp_table[roop_count - 1], + spider_rm_sys_tmp_table(wide_handler->trx->thd, + tmp_table[roop_count - 1], &result_list.upd_tmp_tbl_prms[roop_count - 1]); tmp_table[roop_count - 1] = NULL; } @@ -15916,7 +15876,8 @@ void ha_spider::rm_bulk_tmp_table() { if (tmp_table[roop_count - 1]) { - spider_rm_sys_tmp_table(trx->thd, tmp_table[roop_count - 1], + spider_rm_sys_tmp_table(wide_handler->trx->thd, + tmp_table[roop_count - 1], &result_list.upd_tmp_tbl_prms[roop_count - 1]); tmp_table[roop_count - 1] = NULL; } @@ -16052,3 +16013,503 @@ int ha_spider::set_union_table_name_pos_sql() } DBUG_RETURN(0); } + +int ha_spider::lock_tables() +{ + int error_num, roop_count; + DBUG_ENTER("ha_spider::lock_tables"); + DBUG_PRINT("info",("spider lock_table_type=%u", + wide_handler->lock_table_type)); + + if ((error_num = spider_check_trx_and_get_conn(wide_handler->trx->thd, this, + FALSE))) + { + DBUG_RETURN(error_num); + } + + if (wide_handler->lock_table_type == 1) + { + for ( + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, -1, share->link_count, + SPIDER_LINK_STATUS_RECOVERY); + roop_count < (int) share->link_count; + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, roop_count, share->link_count, + SPIDER_LINK_STATUS_RECOVERY) + ) { + SPIDER_CONN *conn = conns[roop_count]; + int appended = 0; + if ((error_num = dbton_handler[conn->dbton_id]-> + append_lock_tables_list(conn, roop_count, &appended))) + { + DBUG_RETURN(error_num); + } + if (appended) + { + conn->table_lock = 2; + } + } + } else if (wide_handler->lock_table_type == 2) + { + for ( + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, -1, share->link_count, + SPIDER_LINK_STATUS_RECOVERY); + roop_count < (int) share->link_count; + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, roop_count, share->link_count, + SPIDER_LINK_STATUS_RECOVERY) + ) { + if ( + conns[roop_count] && + conns[roop_count]->table_lock != 1 && + spider_param_semi_table_lock(wide_handler->trx->thd, + share->semi_table_lock) + ) { + SPIDER_CONN *conn = conns[roop_count]; + int appended = 0; + if ((error_num = dbton_handler[conn->dbton_id]-> + append_lock_tables_list(conn, roop_count, &appended))) + { + DBUG_RETURN(error_num); + } + if (appended) + { + conn->table_lock = 3; + } + } + } + } + +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) + if ((conn_kinds & SPIDER_CONN_KIND_MYSQL)) + { +#endif + if (!conns[search_link_idx]) + { + my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM, + ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0)); + DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM); + } + for ( + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, -1, share->link_count, + SPIDER_LINK_STATUS_RECOVERY); + roop_count < (int) share->link_count; + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, roop_count, share->link_count, + SPIDER_LINK_STATUS_RECOVERY) + ) { + if (wide_handler->sql_command != SQLCOM_UNLOCK_TABLES) + { + DBUG_PRINT("info",("spider conns[%d]->join_trx=%u", + roop_count, conns[roop_count]->join_trx)); + if ( + (!conns[roop_count]->join_trx && + (error_num = spider_internal_start_trx_for_connection(this, + conns[roop_count], + roop_count))) + ) { + if ( + share->monitoring_kind[roop_count] && + need_mons[roop_count] + ) { + error_num = spider_ping_table_mon_from_table( + wide_handler->trx, + wide_handler->trx->thd, + share, + roop_count, + (uint32) share->monitoring_sid[roop_count], + share->table_name, + share->table_name_length, + conn_link_idx[roop_count], + NULL, + 0, + share->monitoring_kind[roop_count], + share->monitoring_limit[roop_count], + share->monitoring_flag[roop_count], + TRUE + ); + } + DBUG_RETURN(check_error_mode(error_num)); + } + reset_first_link_idx(); + } + if (conns[roop_count]->table_lock >= 2) + { + if ( + conns[roop_count]->db_conn->have_lock_table_list() && + (error_num = spider_db_lock_tables(this, roop_count)) + ) { + if ( + share->monitoring_kind[roop_count] && + need_mons[roop_count] + ) { + error_num = spider_ping_table_mon_from_table( + wide_handler->trx, + wide_handler->trx->thd, + share, + roop_count, + (uint32) share->monitoring_sid[roop_count], + share->table_name, + share->table_name_length, + conn_link_idx[roop_count], + NULL, + 0, + share->monitoring_kind[roop_count], + share->monitoring_limit[roop_count], + share->monitoring_flag[roop_count], + TRUE + ); + } + conns[roop_count]->table_lock = 0; + DBUG_RETURN(check_error_mode(error_num)); + } + if (conns[roop_count]->table_lock == 2) + conns[roop_count]->table_lock = 1; + } else if (wide_handler->sql_command == SQLCOM_UNLOCK_TABLES || + spider_param_internal_unlock(wide_handler->trx->thd) == 1) + { + if (conns[roop_count]->table_lock == 1) + { + conns[roop_count]->table_lock = 0; + if (!conns[roop_count]->trx_start) + conns[roop_count]->disable_reconnect = FALSE; + if ((error_num = spider_db_unlock_tables(this, roop_count))) + { + if ( + share->monitoring_kind[roop_count] && + need_mons[roop_count] + ) { + error_num = spider_ping_table_mon_from_table( + wide_handler->trx, + wide_handler->trx->thd, + share, + roop_count, + (uint32) share->monitoring_sid[roop_count], + share->table_name, + share->table_name_length, + conn_link_idx[roop_count], + NULL, + 0, + share->monitoring_kind[roop_count], + share->monitoring_limit[roop_count], + share->monitoring_flag[roop_count], + TRUE + ); + } + DBUG_RETURN(check_error_mode(error_num)); + } + } + } + } +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) + } +#endif + DBUG_RETURN(0); +} + +int ha_spider::dml_init() +{ + int error_num, roop_count; + SPIDER_TRX *trx = wide_handler->trx; + THD *thd = trx->thd; + bool sync_trx_isolation = spider_param_sync_trx_isolation(thd); + DBUG_ENTER("ha_spider::dml_init"); + if (wide_handler->lock_mode == -2) + { + wide_handler->lock_mode = spider_param_selupd_lock_mode(thd, + share->selupd_lock_mode); + } + if ((error_num = check_access_kind_for_connection(thd, + (wide_handler->lock_type >= TL_WRITE_ALLOW_WRITE)))) + { + DBUG_RETURN(error_num); + } +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) + if ((conn_kinds & SPIDER_CONN_KIND_MYSQL)) + { +#endif + if (!conns[search_link_idx]) + { + my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM, + ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0)); + DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM); + } + if (wide_handler->sql_command == SQLCOM_TRUNCATE) + DBUG_RETURN(0); + for ( + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, -1, share->link_count, + SPIDER_LINK_STATUS_RECOVERY); + roop_count < (int) share->link_count; + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, roop_count, share->link_count, + SPIDER_LINK_STATUS_RECOVERY) + ) { + DBUG_PRINT("info",("spider conns[%d]->join_trx=%u", + roop_count, conns[roop_count]->join_trx)); + if ( + (!conns[roop_count]->join_trx && + (error_num = spider_internal_start_trx_for_connection(this, + conns[roop_count], + roop_count))) + ) { + if ( + share->monitoring_kind[roop_count] && + need_mons[roop_count] + ) { + error_num = spider_ping_table_mon_from_table( + trx, + trx->thd, + share, + roop_count, + (uint32) share->monitoring_sid[roop_count], + share->table_name, + share->table_name_length, + conn_link_idx[roop_count], + NULL, + 0, + share->monitoring_kind[roop_count], + share->monitoring_limit[roop_count], + share->monitoring_flag[roop_count], + TRUE + ); + } + DBUG_RETURN(check_error_mode(error_num)); + } + reset_first_link_idx(); + if ( + conns[roop_count]->semi_trx_isolation == -2 && + conns[roop_count]->semi_trx_isolation_chk == TRUE && + sync_trx_isolation && + spider_param_semi_trx_isolation(trx->thd) >= 0 + ) { + spider_conn_queue_semi_trx_isolation(conns[roop_count], + spider_param_semi_trx_isolation(trx->thd)); + } else { + if (sync_trx_isolation) + { + if ((error_num = spider_check_and_set_trx_isolation( + conns[roop_count], &need_mons[roop_count]))) + { + if ( + share->monitoring_kind[roop_count] && + need_mons[roop_count] + ) { + error_num = spider_ping_table_mon_from_table( + trx, + trx->thd, + share, + roop_count, + (uint32) share->monitoring_sid[roop_count], + share->table_name, + share->table_name_length, + conn_link_idx[roop_count], + NULL, + 0, + share->monitoring_kind[roop_count], + share->monitoring_limit[roop_count], + share->monitoring_flag[roop_count], + TRUE + ); + } + DBUG_RETURN(check_error_mode(error_num)); + } + } + conns[roop_count]->semi_trx_isolation = -1; + } + } +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) + } else { + reset_first_link_idx(); + } + if ((conn_kinds & SPIDER_CONN_KIND_HS_READ)) + { + SPIDER_CONN *hs_conn; + for ( + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, -1, share->link_count, + SPIDER_LINK_STATUS_RECOVERY); + roop_count < (int) share->link_count; + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, roop_count, share->link_count, + SPIDER_LINK_STATUS_RECOVERY) + ) { + hs_conn = hs_r_conns[roop_count]; + if ( + hs_conn && + hs_conn->hsc_query_id != thd->query_id && + hs_conn->hs_pre_age == hs_conn->hs_age + ) { + double interval = spider_param_hs_ping_interval(thd); + time_t tmp_time = (time_t) time((time_t*) 0); + DBUG_PRINT("info", + ("spider difftime=%f", difftime(tmp_time, hs_conn->ping_time))); + DBUG_PRINT("info", ("spider interval=%f", interval)); + if ( + hs_conn->server_lost || + difftime(tmp_time, hs_conn->ping_time) >= interval + ) { + DBUG_PRINT("info", ("spider hsr[%d] need reconnect", roop_count)); + hs_conn->hs_pre_age++; + hs_conn->ping_time = tmp_time; + } + hs_conn->hsc_query_id = thd->query_id; + } + } + } + if ( +#if defined(HS_HAS_SQLCOM) && defined(HANDLER_HAS_DIRECT_UPDATE_ROWS) + ( +#endif + conn_kinds & SPIDER_CONN_KIND_HS_WRITE +#if defined(HS_HAS_SQLCOM) && defined(HANDLER_HAS_DIRECT_UPDATE_ROWS) + ) || + /* for direct_update */ + wide_handler->sql_command == SQLCOM_HS_UPDATE || + wide_handler->sql_command == SQLCOM_HS_DELETE +#endif + ) { + SPIDER_CONN *hs_conn; + for ( + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, -1, share->link_count, + SPIDER_LINK_STATUS_RECOVERY); + roop_count < (int) share->link_count; + roop_count = spider_conn_link_idx_next(share->link_statuses, + conn_link_idx, roop_count, share->link_count, + SPIDER_LINK_STATUS_RECOVERY) + ) { + hs_conn = hs_w_conns[roop_count]; + if ( + hs_conn && + hs_conn->hsc_query_id != thd->query_id && + hs_conn->hs_pre_age == hs_conn->hs_age + ) { + double interval = spider_param_hs_ping_interval(thd); + time_t tmp_time = (time_t) time((time_t*) 0); + DBUG_PRINT("info", + ("spider difftime=%f", difftime(tmp_time, hs_conn->ping_time))); + DBUG_PRINT("info", ("spider interval=%f", interval)); + if ( + hs_conn->server_lost || + difftime(tmp_time, hs_conn->ping_time) >= interval + ) { + DBUG_PRINT("info", ("spider hsw[%d] need reconnect", roop_count)); + hs_conn->hs_pre_age++; + hs_conn->ping_time = tmp_time; + } + hs_conn->hsc_query_id = thd->query_id; + } + } + } +#endif +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS + if (wide_handler->insert_with_update) + { + check_insert_dup_update_pushdown(); + } +#endif + dml_inited = TRUE; + DBUG_RETURN(0); +} + +#ifdef HA_CAN_BULK_ACCESS +int ha_spider::bulk_access_begin( + void *info +) { + DBUG_ENTER("ha_spider::bulk_access_begin"); + DBUG_PRINT("info",("spider this=%p", this)); + if (bulk_access_started) + { + if (!bulk_access_link_current->next) + { + if (!(bulk_access_link_current->next = create_bulk_access_link())) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + bulk_access_link_current->next->sequence_num = + bulk_access_link_current->sequence_num + 1; + } + bulk_access_link_current = bulk_access_link_current->next; + } else { + if (!bulk_access_link_first) + { + if (!(bulk_access_link_first = create_bulk_access_link())) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + bulk_access_link_first->sequence_num = 0; + } + bulk_access_link_current = bulk_access_link_first; + bulk_access_started = TRUE; + bulk_access_executing = FALSE; + } + bulk_access_link_current->spider-> + check_access_kind(wide_handler->trx->thd); + if ( + (error_num = bulk_access_link_current->spider-> + sync_from_clone_source(this)) || + (error_num = bulk_access_link_current->spider-> + check_access_kind_for_connection(wide_handler->trx->thd, + (lock_type >= TL_WRITE_ALLOW_WRITE))) + ) { + DBUG_RETURN(error_num); + } +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) + memset( + bulk_access_link_current->spider->result_list.hs_r_bulk_open_index, 0, + share->link_bitmap_size); + memset( + bulk_access_link_current->spider->result_list.hs_w_bulk_open_index, 0, + share->link_bitmap_size); +#endif + bulk_access_link_current->spider->bulk_access_executing = FALSE; + bulk_access_link_current->spider->bulk_access_pre_called = FALSE; + bulk_access_link_current->used = TRUE; + bulk_access_link_current->called = FALSE; + *((void **) info) = bulk_access_link_current; + DBUG_RETURN(0); +} + +int ha_spider::bulk_access_current( + void *info +) { + DBUG_ENTER("ha_spider::bulk_access_current"); + DBUG_PRINT("info",("spider this=%p", this)); + bulk_access_executing = TRUE; + bulk_access_link_exec_tgt = (SPIDER_BULK_ACCESS_LINK *) info; + if (bulk_access_link_exec_tgt->spider->pt_clone_source_handler != this) + { + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_PRINT("info",("spider pt_clone_source_handler=%p", + bulk_access_link_exec_tgt->spider->pt_clone_source_handler)); + /* partitioned */ + uint sequence_num = bulk_access_link_exec_tgt->sequence_num; + for ( + bulk_access_link_exec_tgt = bulk_access_link_first; + bulk_access_link_exec_tgt; + bulk_access_link_exec_tgt = bulk_access_link_exec_tgt->next + ) { + if (bulk_access_link_exec_tgt->sequence_num >= sequence_num) + { + DBUG_ASSERT( + bulk_access_link_exec_tgt->sequence_num == sequence_num); + break; + } + } + } + bulk_access_link_exec_tgt->spider->bulk_access_executing = TRUE; + DBUG_RETURN(0); +} + +void ha_spider::bulk_access_end() +{ + DBUG_ENTER("ha_spider::bulk_access_end"); + DBUG_PRINT("info",("spider this=%p", this)); + bulk_access_started = FALSE; + DBUG_VOID_RETURN; +} +#endif diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h index 4a7b685527d..b259e9cf098 100644 --- a/storage/spider/ha_spider.h +++ b/storage/spider/ha_spider.h @@ -52,9 +52,7 @@ struct st_spider_ft_info class ha_spider: public handler { public: - THR_LOCK_DATA lock; SPIDER_SHARE *share; - SPIDER_TRX *trx; ulonglong spider_thread_id; ulonglong trx_conn_adjustment; #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) @@ -90,18 +88,16 @@ public: int search_link_idx; int result_link_idx; SPIDER_RESULT_LIST result_list; - SPIDER_CONDITION *condition; spider_string *blob_buff; - uchar *searched_bitmap; - uchar *ft_discard_bitmap; - bool position_bitmap_init; - uchar *position_bitmap; SPIDER_POSITION *pushed_pos; SPIDER_POSITION pushed_pos_buf; #ifdef WITH_PARTITION_STORAGE_ENGINE + bool pt_handler_share_owner = FALSE; SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share; - ha_spider *pt_handler_share_creator; #endif + bool wide_handler_owner = FALSE; + SPIDER_WIDE_HANDLER *wide_handler = NULL; + #ifdef HA_CAN_BULK_ACCESS int pre_direct_init_result; bool is_bulk_access_clone; @@ -116,10 +112,8 @@ public: bool init_ha_mem_root; MEM_ROOT ha_mem_root; */ - ulonglong external_lock_cnt; #endif bool is_clone; - bool clone_bitmap_init; ha_spider *pt_clone_source_handler; ha_spider *pt_clone_last_searcher; bool use_index_merge; @@ -161,22 +155,11 @@ public: ha_spider *next; + bool dml_inited; bool rnd_scan_and_first; - bool quick_mode; - bool keyread; - bool ignore_dup_key; - bool write_can_replace; - bool insert_with_update; - bool low_priority; - bool high_priority; - bool insert_delayed; bool use_pre_call; bool use_pre_action; bool pre_bitmap_checked; - enum thr_lock_type lock_type; - int lock_mode; - uint sql_command; - int selupd_lock_mode; bool bulk_insert; #ifdef HANDLER_HAS_NEED_INFO_FOR_AUTO_INC bool info_auto_called; @@ -189,12 +172,9 @@ public: int store_error_num; uint dup_key_idx; int select_column_mode; - bool update_request; bool pk_update; bool force_auto_increment; int bka_mode; - bool cond_check; - int cond_check_error; int error_mode; ulonglong store_last_insert_id; @@ -216,14 +196,7 @@ public: uint32 **hs_w_ret_fields; size_t *hs_r_ret_fields_num; size_t *hs_w_ret_fields_num; - uint32 *hs_pushed_ret_fields; - size_t hs_pushed_ret_fields_num; - size_t hs_pushed_ret_fields_size; - size_t hs_pushed_lcl_fields_num; uchar *tmp_column_bitmap; - bool hs_increment; - bool hs_decrement; - uint32 hs_pushed_strref_num; #endif #endif #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS @@ -232,11 +205,6 @@ public: bool maybe_do_hs_direct_update; #endif uint direct_update_kinds; - List<Item> *direct_update_fields; - List<Item> *direct_update_values; -#endif -#ifdef INFO_KIND_FORCE_LIMIT_BEGIN - longlong info_limit; #endif spider_index_rnd_init prev_index_rnd_init; #ifdef HANDLER_HAS_DIRECT_AGGREGATE @@ -283,10 +251,13 @@ public: uint test_if_locked ); int close(); - int check_access_kind( + int check_access_kind_for_connection( THD *thd, bool write_request ); + void check_access_kind( + THD *thd + ); #ifdef HA_CAN_BULK_ACCESS int additional_lock( THD *thd, @@ -302,6 +273,10 @@ public: THD *thd, int lock_type ); + int start_stmt( + THD *thd, + thr_lock_type lock_type + ); int reset(); int extra( enum ha_extra_function operation @@ -525,6 +500,7 @@ public: #endif const char *table_type() const; ulonglong table_flags() const; + ulong table_flags_for_partition(); const char *index_type( uint key_number ); @@ -869,6 +845,12 @@ public: int error_num, uint flags ); + int set_top_table_and_fields( + TABLE *top_table, + Field **top_table_field, + uint top_table_fields + ); + void clear_top_table_fields(); Field *get_top_table_field( uint16 field_index ); @@ -1255,4 +1237,15 @@ public: #endif int init_union_table_name_pos_sql(); int set_union_table_name_pos_sql(); + int lock_tables(); + int dml_init(); +#ifdef HA_CAN_BULK_ACCESS + int bulk_access_begin( + void *info + ); + int bulk_access_current( + void *info + ); + void bulk_access_end(); +#endif }; diff --git a/storage/spider/mysql-test/spider/bugfix/include/insert_select_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/insert_select_deinit.inc new file mode 100644 index 00000000000..b8b2f200689 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/include/insert_select_deinit.inc @@ -0,0 +1,16 @@ +--connection master_1 +set session spider_direct_dup_insert= @old_spider_direct_dup_insert; +--let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP +--let $MASTER_1_COMMENT_2_1_2= $MASTER_1_COMMENT_2_1_2_BACKUP +--let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP +--let $CHILD2_1_DROP_TABLES2= $CHILD2_1_DROP_TABLES2_BACKUP +--let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP +--let $CHILD2_1_CREATE_TABLES2= $CHILD2_1_CREATE_TABLES2_BACKUP +--let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_result_log +--enable_query_log +--enable_warnings diff --git a/storage/spider/mysql-test/spider/bugfix/include/insert_select_init.inc b/storage/spider/mysql-test/spider/bugfix/include/insert_select_init.inc new file mode 100644 index 00000000000..62a8821a3c9 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/include/insert_select_init.inc @@ -0,0 +1,43 @@ +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_init.inc +--enable_result_log +--enable_query_log +--enable_warnings +--let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1 +let $MASTER_1_COMMENT_2_1= + COMMENT='table "tbl_a", srv "s_2_1"'; +--let $MASTER_1_COMMENT_2_1_2_BACKUP= $MASTER_1_COMMENT_2_1_2 +let $MASTER_1_COMMENT_2_1_2= + COMMENT='table "tbl_b", srv "s_2_1"'; +--let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES +let $CHILD2_1_DROP_TABLES= + DROP TABLE IF EXISTS tbl_a; +--let $CHILD2_1_DROP_TABLES2_BACKUP= $CHILD2_1_DROP_TABLES2 +let $CHILD2_1_DROP_TABLES2= + DROP TABLE IF EXISTS tbl_b; +--let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES +let $CHILD2_1_CREATE_TABLES= + CREATE TABLE tbl_a ( + skey int NOT NULL, + dt date NOT NULL, + tm time NOT NULL, + KEY idx1 (skey,dt,tm) + ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; +--let $CHILD2_1_CREATE_TABLES2_BACKUP= $CHILD2_1_CREATE_TABLES2 +let $CHILD2_1_CREATE_TABLES2= + CREATE TABLE tbl_b ( + pkey int NOT NULL, + dt datetime NOT NULL, + PRIMARY KEY (pkey), + KEY idx1 (dt) + ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; +--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES +let $CHILD2_1_SELECT_TABLES= + SELECT pkey, dt FROM tbl_b ORDER BY pkey; +let $CHILD2_1_SELECT_ARGUMENT1= + SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; +--connection master_1 +set @old_spider_direct_dup_insert= @@spider_direct_dup_insert; +set session spider_direct_dup_insert= 1; diff --git a/storage/spider/mysql-test/spider/bugfix/t/insert_select.cnf b/storage/spider/mysql-test/spider/bugfix/t/insert_select.cnf new file mode 100644 index 00000000000..05dfd8a0bce --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/insert_select.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/insert_select.test b/storage/spider/mysql-test/spider/bugfix/t/insert_select.test new file mode 100644 index 00000000000..381e72f7b1b --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/insert_select.test @@ -0,0 +1,99 @@ +--source ../include/insert_select_init.inc +--echo +--echo this test is for MDEV-16399 +--echo +--echo drop and create databases + +--connection master_1 +--disable_warnings +CREATE DATABASE auto_test_local; +USE auto_test_local; + +--connection child2_1 +SET @old_log_output = @@global.log_output; +SET GLOBAL log_output = 'TABLE,FILE'; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +--enable_warnings + +--echo +--echo create table and insert + +--connection child2_1 +--disable_query_log +echo CHILD2_1_CREATE_TABLES; +eval $CHILD2_1_CREATE_TABLES; +echo CHILD2_1_CREATE_TABLES2; +eval $CHILD2_1_CREATE_TABLES2; +--enable_query_log +TRUNCATE TABLE mysql.general_log; + +--connection master_1 +--disable_query_log +echo CREATE TABLE tbl_a ( + skey int NOT NULL, + dt date NOT NULL, + tm time NOT NULL, + KEY idx1 (skey,dt,tm) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1; +eval CREATE TABLE tbl_a ( + skey int NOT NULL, + dt date NOT NULL, + tm time NOT NULL, + KEY idx1 (skey,dt,tm) +) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1; +echo CREATE TABLE tbl_b ( + pkey int NOT NULL, + dt datetime NOT NULL, + PRIMARY KEY (pkey), + KEY idx1 (dt) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1_2; +eval CREATE TABLE tbl_b ( + pkey int NOT NULL, + dt datetime NOT NULL, + PRIMARY KEY (pkey), + KEY idx1 (dt) +) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1_2; +--enable_query_log +INSERT INTO tbl_a (skey, dt, tm) VALUES (0, '2012-01-01', '12:00:00'),(1, '2012-02-01', '12:00:00'),(2, '2012-03-01', '12:00:00'),(3, '2012-04-01', '12:00:00'),(4, '2012-05-01', '12:00:00'),(5, '2012-06-01', '12:00:00'),(6, '2012-07-01', '12:00:00'),(7, '2012-08-01', '12:00:00'),(8, '2012-09-01', '12:00:00'),(9, '2012-10-01', '12:00:00'); +INSERT INTO tbl_a (skey, dt, tm) VALUES (0, '2013-01-01', '13:00:00'),(1, '2013-02-01', '13:00:00'),(2, '2013-03-01', '13:00:00'),(3, '2013-04-01', '13:00:00'),(4, '2013-05-01', '13:00:00'),(5, '2013-06-01', '13:00:00'),(6, '2013-07-01', '13:00:00'),(7, '2013-08-01', '13:00:00'),(8, '2013-09-01', '13:00:00'),(9, '2013-10-01', '13:00:00'); +INSERT INTO tbl_a (skey, dt, tm) VALUES (0, '2012-11-01', '11:00:00'),(1, '2012-12-01', '11:00:00'),(2, '2012-11-30', '11:00:00'),(3, '2012-11-29', '11:00:00'),(4, '2012-11-28', '11:00:00'),(5, '2012-11-27', '11:00:00'),(6, '2012-11-26', '11:00:00'),(7, '2012-11-25', '11:00:00'),(8, '2012-11-24', '11:00:00'),(9, '2012-11-23', '11:00:00'); +FLUSH TABLES; + +--echo +--echo select test 1 + +--connection child2_1 +TRUNCATE TABLE mysql.general_log; + +--connection master_1 +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 4 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 3 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 2 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 1 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 0 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 9 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 8 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 7 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 6 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); +INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 5 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); + +--connection child2_1 +eval $CHILD2_1_SELECT_ARGUMENT1; +eval $CHILD2_1_SELECT_TABLES; + +--echo +--echo deinit +--disable_warnings + +--connection master_1 +DROP DATABASE IF EXISTS auto_test_local; + +--connection child2_1 +DROP DATABASE IF EXISTS auto_test_remote; +SET GLOBAL log_output = @old_log_output; + +--enable_warnings +--source ../include/insert_select_deinit.inc +--echo +--echo end of test diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc index 3164356ddf6..ba80a409382 100644 --- a/storage/spider/spd_conn.cc +++ b/storage/spider/spd_conn.cc @@ -312,6 +312,10 @@ void spider_free_conn_from_trx( } } else { /* conn_recycle_mode == 0 */ + if (conn->quick_target) + { + spider_db_free_result((ha_spider *) conn->quick_target, TRUE); + } spider_free_conn(conn); } } else if (roop_count) @@ -1283,7 +1287,7 @@ int spider_check_and_get_casual_read_conn( if ( !(spider->conns[link_idx] = spider_get_conn(spider->share, link_idx, - spider->conn_keys[link_idx], spider->trx, + spider->conn_keys[link_idx], spider->wide_handler->trx, spider, FALSE, TRUE, SPIDER_CONN_KIND_MYSQL, &error_num)) ) { @@ -1745,7 +1749,8 @@ int spider_set_conn_bg_param( int error_num, roop_count, bgs_mode; SPIDER_SHARE *share = spider->share; SPIDER_RESULT_LIST *result_list = &spider->result_list; - THD *thd = spider->trx->thd; + SPIDER_WIDE_HANDLER *wide_handler = spider->wide_handler; + THD *thd = wide_handler->trx->thd; DBUG_ENTER("spider_set_conn_bg_param"); DBUG_PRINT("info",("spider spider=%p", spider)); bgs_mode = @@ -1754,10 +1759,11 @@ int spider_set_conn_bg_param( result_list->bgs_phase = 0; else if ( bgs_mode <= 2 && - (result_list->lock_type == F_WRLCK || spider->lock_mode == 2) + (wide_handler->external_lock_type == F_WRLCK || + wide_handler->lock_mode == 2) ) result_list->bgs_phase = 0; - else if (bgs_mode <= 1 && spider->lock_mode == 1) + else if (bgs_mode <= 1 && wide_handler->lock_mode == 1) result_list->bgs_phase = 0; else { result_list->bgs_phase = 1; @@ -1804,12 +1810,12 @@ int spider_set_conn_bg_param( for ( roop_count = spider_conn_link_idx_next(share->link_statuses, spider->conn_link_idx, -1, share->link_count, - spider->lock_mode ? + spider->wide_handler->lock_mode ? SPIDER_LINK_STATUS_RECOVERY : SPIDER_LINK_STATUS_OK); roop_count < (int) share->link_count; roop_count = spider_conn_link_idx_next(share->link_statuses, spider->conn_link_idx, roop_count, share->link_count, - spider->lock_mode ? + spider->wide_handler->lock_mode ? SPIDER_LINK_STATUS_RECOVERY : SPIDER_LINK_STATUS_OK) ) { if ((error_num = spider_create_conn_thread(spider->conns[roop_count]))) @@ -2688,7 +2694,7 @@ void *spider_bg_conn_action( conn->link_idx); result_list->tmp_tables_created = TRUE; spider_conn_set_timeout_from_share(conn, conn->link_idx, - spider->trx->thd, share); + spider->wide_handler->trx->thd, share); if (dbton_handler->execute_sql( SPIDER_SQL_TYPE_TMP_SQL, conn, @@ -2706,7 +2712,7 @@ void *spider_bg_conn_action( if (!result_list->bgs_error) { spider_conn_set_timeout_from_share(conn, conn->link_idx, - spider->trx->thd, share); + spider->wide_handler->trx->thd, share); if (dbton_handler->execute_sql( sql_type, conn, @@ -2949,6 +2955,7 @@ void *spider_bg_sts_action( SPIDER_TRX *trx; int error_num = 0, roop_count; ha_spider spider; + SPIDER_WIDE_HANDLER wide_handler; int *need_mons; SPIDER_CONN **conns; uint *conn_link_idx; @@ -3042,7 +3049,8 @@ void *spider_bg_sts_action( DBUG_RETURN(NULL); } share->bg_sts_thd = thd; - spider.trx = trx; + spider.wide_handler = &wide_handler; + wide_handler.trx = trx; spider.share = share; spider.conns = conns; spider.conn_link_idx = conn_link_idx; @@ -3314,6 +3322,7 @@ void *spider_bg_crd_action( SPIDER_TRX *trx; int error_num = 0, roop_count; ha_spider spider; + SPIDER_WIDE_HANDLER wide_handler; TABLE table; int *need_mons; SPIDER_CONN **conns; @@ -3411,7 +3420,8 @@ void *spider_bg_crd_action( table.s = share->table_share; table.field = share->table_share->field; table.key_info = share->table_share->key_info; - spider.trx = trx; + spider.wide_handler = &wide_handler; + wide_handler.trx = trx; spider.change_table_ptr(&table, share->table_share); spider.share = share; spider.conns = conns; @@ -4097,11 +4107,12 @@ int spider_conn_get_link_status( int spider_conn_lock_mode( ha_spider *spider ) { - SPIDER_RESULT_LIST *result_list = &spider->result_list; + SPIDER_WIDE_HANDLER *wide_handler = spider->wide_handler; DBUG_ENTER("spider_conn_lock_mode"); - if (result_list->lock_type == F_WRLCK || spider->lock_mode == 2) + if (wide_handler->external_lock_type == F_WRLCK || + wide_handler->lock_mode == 2) DBUG_RETURN(SPIDER_LOCK_MODE_EXCLUSIVE); - else if (spider->lock_mode == 1) + else if (wide_handler->lock_mode == 1) DBUG_RETURN(SPIDER_LOCK_MODE_SHARED); DBUG_RETURN(SPIDER_LOCK_MODE_NO_LOCK); } @@ -4124,7 +4135,7 @@ bool spider_conn_use_handler( int lock_mode, int link_idx ) { - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; int use_handler = spider_param_use_handler(thd, spider->share->use_handlers[link_idx]); DBUG_ENTER("spider_conn_use_handler"); @@ -4197,7 +4208,7 @@ bool spider_conn_use_handler( DBUG_RETURN(FALSE); } if ( - spider->sql_command == SQLCOM_HA_READ && + spider->wide_handler->sql_command == SQLCOM_HA_READ && ( !(use_handler & 2) || ( @@ -4212,7 +4223,7 @@ bool spider_conn_use_handler( DBUG_RETURN(TRUE); } if ( - spider->sql_command != SQLCOM_HA_READ && + spider->wide_handler->sql_command != SQLCOM_HA_READ && lock_mode == SPIDER_LOCK_MODE_NO_LOCK && spider_param_sync_trx_isolation(thd) && thd_tx_isolation(thd) != ISO_SERIALIZABLE && diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc index 19023a00da3..ed08cb8a6af 100644 --- a/storage/spider/spd_copy_tables.cc +++ b/storage/spider/spd_copy_tables.cc @@ -1,4 +1,5 @@ -/* Copyright (C) 2009-2018 Kentoku Shiba +/* Copyright (C) 2009-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -839,6 +840,7 @@ long long spider_copy_tables_body( spider_string *tmp_sql = NULL; SPIDER_COPY_TABLE_CONN *table_conn, *src_tbl_conn, *dst_tbl_conn; SPIDER_CONN *tmp_conn; + SPIDER_WIDE_HANDLER *wide_handler; spider_db_copy_table *select_ct, *insert_ct; MEM_ROOT mem_root; longlong bulk_insert_rows; @@ -1128,13 +1130,15 @@ long long spider_copy_tables_body( __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &tmp_spider->dbton_handler, sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE, + &wide_handler, sizeof(SPIDER_WIDE_HANDLER), NullS)) ) { my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); goto error; } tmp_spider->share = table_conn->share; - tmp_spider->trx = copy_tables->trx; + tmp_spider->wide_handler = wide_handler; + wide_handler->trx = copy_tables->trx; /* if (spider_db_append_set_names(table_conn->share)) { @@ -1147,7 +1151,7 @@ long long spider_copy_tables_body( tmp_sql[roop_count].set_charset(copy_tables->access_charset); tmp_spider->result_list.sqls = &tmp_sql[roop_count]; tmp_spider->need_mons = &table_conn->need_mon; - tmp_spider->lock_type = TL_READ; + tmp_spider->wide_handler->lock_type = TL_READ; tmp_spider->conn_link_idx = &tmp_conn_link_idx; uint dbton_id = tmp_spider->share->use_dbton_ids[0]; if (!(tmp_spider->dbton_handler[dbton_id] = @@ -1172,13 +1176,15 @@ long long spider_copy_tables_body( __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &tmp_spider->dbton_handler, sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE, + &wide_handler, sizeof(SPIDER_WIDE_HANDLER), NullS)) ) { my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); goto error; } tmp_spider->share = table_conn->share; - tmp_spider->trx = copy_tables->trx; + tmp_spider->wide_handler = wide_handler; + wide_handler->trx = copy_tables->trx; /* if (spider_db_append_set_names(table_conn->share)) { @@ -1191,7 +1197,7 @@ long long spider_copy_tables_body( tmp_sql[roop_count].set_charset(copy_tables->access_charset); tmp_spider->result_list.sqls = &tmp_sql[roop_count]; tmp_spider->need_mons = &table_conn->need_mon; - tmp_spider->lock_type = TL_WRITE; + tmp_spider->wide_handler->lock_type = TL_WRITE; tmp_spider->conn_link_idx = &tmp_conn_link_idx; uint dbton_id = tmp_spider->share->use_dbton_ids[0]; if (!(tmp_spider->dbton_handler[dbton_id] = diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index ad08a264330..729a2b72704 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -278,9 +278,9 @@ int spider_db_ping( ) { DBUG_ENTER("spider_db_ping"); #ifndef DBUG_OFF - if (spider->trx->thd) + if (spider->wide_handler->trx->thd) DBUG_PRINT("info", ("spider thd->query_id is %lld", - spider->trx->thd->query_id)); + spider->wide_handler->trx->thd->query_id)); #endif DBUG_RETURN(spider_db_ping_internal(spider->share, conn, spider->conn_link_idx[link_idx], &spider->need_mons[link_idx])); @@ -984,7 +984,8 @@ int spider_db_set_names( int link_idx ) { DBUG_ENTER("spider_db_set_names"); - DBUG_RETURN(spider_db_set_names_internal(spider->trx, spider->share, conn, + DBUG_RETURN(spider_db_set_names_internal(spider->wide_handler->trx, + spider->share, conn, spider->conn_link_idx[link_idx], &spider->need_mons[link_idx])); } @@ -1017,8 +1018,8 @@ int spider_db_query_with_set_names( spider->need_mons[link_idx] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, link_idx, (uint32) share->monitoring_sid[link_idx], @@ -1035,7 +1036,8 @@ int spider_db_query_with_set_names( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, @@ -1051,8 +1053,8 @@ int spider_db_query_with_set_names( spider->need_mons[link_idx] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, link_idx, (uint32) share->monitoring_sid[link_idx], @@ -1104,8 +1106,8 @@ int spider_db_query_for_bulk_update( spider->need_mons[link_idx] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, link_idx, (uint32) share->monitoring_sid[link_idx], @@ -1122,7 +1124,8 @@ int spider_db_query_for_bulk_update( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id]; if (dbton_hdl->execute_sql( @@ -1142,8 +1145,8 @@ int spider_db_query_for_bulk_update( spider->need_mons[link_idx] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, link_idx, (uint32) share->monitoring_sid[link_idx], @@ -1159,7 +1162,7 @@ int spider_db_query_for_bulk_update( ); } if ( - spider->ignore_dup_key && + spider->wide_handler->ignore_dup_key && ( error_num == ER_DUP_ENTRY || error_num == ER_DUP_KEY || @@ -1167,7 +1170,7 @@ int spider_db_query_for_bulk_update( ) ) { ++(*dup_key_found); - spider->trx->thd->clear_error(); + spider->wide_handler->trx->thd->clear_error(); DBUG_RETURN(0); } DBUG_RETURN(error_num); @@ -1187,8 +1190,8 @@ int spider_db_query_for_bulk_update( spider->need_mons[link_idx] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, link_idx, (uint32) share->monitoring_sid[link_idx], @@ -2798,7 +2801,7 @@ int spider_db_fetch_for_item_sum_func( ) { int error_num; SPIDER_SHARE *share = spider->share; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; DBUG_ENTER("spider_db_fetch_for_item_sum_func"); DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func())); switch (item_sum->sum_func()) @@ -3526,7 +3529,8 @@ int spider_db_fetch_minimum_columns( ) { DBUG_PRINT("info", ("spider field_index %u", (*field)->field_index)); DBUG_PRINT("info", ("spider searched_bitmap %u", - spider_bit_is_set(spider->searched_bitmap, (*field)->field_index))); + spider_bit_is_set(spider->wide_handler->searched_bitmap, + (*field)->field_index))); DBUG_PRINT("info", ("spider read_set %u", bitmap_is_set(table->read_set, (*field)->field_index))); DBUG_PRINT("info", ("spider write_set %u", @@ -3708,7 +3712,7 @@ int spider_db_free_result( SPIDER_RESULT *result; SPIDER_RESULT *prev; SPIDER_SHARE *share = spider->share; - SPIDER_TRX *trx = spider->trx; + SPIDER_TRX *trx = spider->wide_handler->trx; SPIDER_POSITION *position; int roop_count, error_num; DBUG_ENTER("spider_db_free_result"); @@ -4064,8 +4068,9 @@ int spider_db_store_result( spider_clear_bit(spider->db_request_phase, link_idx); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = + spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[link_idx]; request_key.next = NULL; @@ -4163,8 +4168,9 @@ int spider_db_store_result( spider_clear_bit(spider->db_request_phase, link_idx); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = + spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[link_idx]; request_key.next = NULL; @@ -4428,8 +4434,8 @@ int spider_db_store_result( spider_clear_bit(spider->db_request_phase, link_idx); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[link_idx]; request_key.next = NULL; @@ -4474,8 +4480,8 @@ void spider_db_discard_result( spider_clear_bit(spider->db_request_phase, link_idx); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[link_idx]; request_key.next = NULL; @@ -4500,8 +4506,8 @@ void spider_db_discard_multiple_result( { spider_clear_bit(spider->db_request_phase, link_idx); } - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[link_idx]; request_key.next = NULL; @@ -4809,7 +4815,7 @@ int spider_db_seek_next( DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, - spider->trx->thd, share); + spider->wide_handler->trx->thd, share); if (dbton_handler->execute_sql( sql_type, conn, @@ -4899,8 +4905,8 @@ int spider_db_seek_next( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4919,7 +4925,7 @@ int spider_db_seek_next( DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, roop_count, - spider->trx->thd, share); + spider->wide_handler->trx->thd, share); if (dbton_handler->execute_sql( sql_type, conn, @@ -4934,8 +4940,8 @@ int spider_db_seek_next( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -4967,8 +4973,8 @@ int spider_db_seek_next( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5153,8 +5159,8 @@ int spider_db_seek_last( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5171,7 +5177,8 @@ int spider_db_seek_last( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if (dbton_handler->execute_sql( sql_type, @@ -5187,8 +5194,8 @@ int spider_db_seek_last( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5218,8 +5225,8 @@ int spider_db_seek_last( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5356,8 +5363,8 @@ int spider_db_seek_last( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5374,7 +5381,8 @@ int spider_db_seek_last( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if (dbton_handler->execute_sql( sql_type, @@ -5390,8 +5398,8 @@ int spider_db_seek_last( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5421,8 +5429,8 @@ int spider_db_seek_last( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5521,7 +5529,7 @@ void spider_db_create_position( pos->direct_aggregate = result_list->direct_aggregate; #endif pos->sql_kind = spider->sql_kind[spider->result_link_idx]; - pos->position_bitmap = spider->position_bitmap; + pos->position_bitmap = spider->wide_handler->position_bitmap; pos->ft_first = spider->ft_first; pos->ft_current = spider->ft_current; pos->result = current; @@ -5893,7 +5901,7 @@ int spider_db_simple_action( bool pre_call ) { int error_num; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; SPIDER_CONN *conn; DBUG_ENTER("spider_db_simple_action"); if (pre_call) @@ -6043,7 +6051,8 @@ int spider_db_bulk_insert_init( SPIDER_LINK_STATUS_RECOVERY) ) { if (spider->conns[roop_count]) - spider->conns[roop_count]->ignore_dup_key = spider->ignore_dup_key; + spider->conns[roop_count]->ignore_dup_key = + spider->wide_handler->ignore_dup_key; #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) if ( spider_conn_use_handler(spider, spider->lock_mode, roop_count) && @@ -6063,8 +6072,8 @@ int spider_db_bulk_insert_init( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -6084,7 +6093,8 @@ int spider_db_bulk_insert_init( spider->set_handler_opened(roop_count); } #else - spider_conn_use_handler(spider, spider->lock_mode, roop_count); + spider_conn_use_handler(spider, spider->wide_handler->lock_mode, + roop_count); #endif } #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) @@ -6118,7 +6128,7 @@ int spider_db_bulk_insert( SPIDER_RESULT_LIST *result_list = &spider->result_list; #endif SPIDER_SHARE *share = spider->share; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; bool mta_conn_mutex_lock_already_backup; bool mta_conn_mutex_unlock_later_backup; DBUG_ENTER("spider_db_bulk_insert"); @@ -6236,8 +6246,8 @@ int spider_db_bulk_insert( spider->need_mons[roop_count2] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count2, (uint32) share->monitoring_sid[roop_count2], @@ -6254,7 +6264,8 @@ int spider_db_bulk_insert( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count2, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count2, + spider->wide_handler->trx->thd, share); if (dbton_handler->execute_sql( sql_type, @@ -6286,8 +6297,8 @@ int spider_db_bulk_insert( spider->need_mons[roop_count2] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count2, (uint32) share->monitoring_sid[roop_count2], @@ -6327,8 +6338,9 @@ int spider_db_bulk_insert( spider_clear_bit(spider->db_request_phase, roop_count2); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = + spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[roop_count2]; request_key.next = NULL; @@ -6447,7 +6459,7 @@ int spider_db_bulk_bulk_insert( SPIDER_SHARE *share = spider->share; SPIDER_CONN *conn, *first_insert_conn = NULL; TABLE *table = spider->get_table(); - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; DBUG_ENTER("spider_db_bulk_bulk_insert"); for ( roop_count2 = spider_conn_link_idx_next(share->link_statuses, @@ -6496,8 +6508,9 @@ int spider_db_bulk_bulk_insert( spider_clear_bit(spider->db_request_phase, roop_count2); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = + spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[roop_count2]; request_key.next = NULL; @@ -6568,7 +6581,7 @@ int spider_db_update_auto_increment( int link_idx ) { int roop_count; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; ulonglong last_insert_id, affected_rows; SPIDER_SHARE *share = spider->share; TABLE *table = spider->get_table(); @@ -6730,7 +6743,7 @@ int spider_db_bulk_update_end( ha_rows *dup_key_found ) { int error_num = 0, error_num2, roop_count; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; SPIDER_CONN *conn; bool is_error = thd->is_error(); @@ -6905,7 +6918,7 @@ int spider_db_update( conn = spider->conns[roop_count]; spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id]; #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000 - conn->ignore_dup_key = spider->ignore_dup_key; + conn->ignore_dup_key = spider->wide_handler->ignore_dup_key; #endif if (dbton_hdl->need_lock_before_set_sql_for_exec( SPIDER_SQL_TYPE_UPDATE_SQL)) @@ -6938,8 +6951,8 @@ int spider_db_update( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -6956,7 +6969,8 @@ int spider_db_update( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_UPDATE_SQL, @@ -6975,8 +6989,8 @@ int spider_db_update( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7009,7 +7023,8 @@ int spider_db_update( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_INSERT_SQL, @@ -7028,8 +7043,8 @@ int spider_db_update( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7255,7 +7270,7 @@ int spider_db_direct_update( if (spider->is_bulk_access_clone) { spider->connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(spider->trx, conn); + spider_trx_add_bulk_access_conn(spider->wide_handler->trx, conn); } else { #endif conn->need_mon = &spider->need_mons[roop_count]; @@ -7272,8 +7287,8 @@ int spider_db_direct_update( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7290,7 +7305,8 @@ int spider_db_direct_update( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if ( (error_num = dbton_hdl->execute_sql( @@ -7312,8 +7328,8 @@ int spider_db_direct_update( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7350,8 +7366,9 @@ int spider_db_direct_update( spider_clear_bit(spider->db_request_phase, roop_count); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = + spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[roop_count]; request_key.next = NULL; @@ -7515,7 +7532,7 @@ int spider_db_direct_update( if (spider->is_bulk_access_clone) { spider->connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(spider->trx, conn); + spider_trx_add_bulk_access_conn(spider->wide_handler->trx, conn); } else { #endif conn->need_mon = &spider->need_mons[roop_count]; @@ -7532,8 +7549,8 @@ int spider_db_direct_update( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7550,7 +7567,8 @@ int spider_db_direct_update( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if ( (error_num = dbton_hdl->execute_sql( @@ -7559,7 +7577,8 @@ int spider_db_direct_update( -1, &spider->need_mons[roop_count]) ) && - (error_num != HA_ERR_FOUND_DUPP_KEY || !spider->ignore_dup_key) + (error_num != HA_ERR_FOUND_DUPP_KEY || + !spider->wide_handler->ignore_dup_key) ) { conn->mta_conn_mutex_lock_already = FALSE; conn->mta_conn_mutex_unlock_later = FALSE; @@ -7572,8 +7591,8 @@ int spider_db_direct_update( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7673,8 +7692,9 @@ int spider_db_bulk_direct_update( spider_clear_bit(spider->db_request_phase, roop_count); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = + spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[roop_count]; request_key.next = NULL; @@ -7909,7 +7929,7 @@ int spider_db_direct_delete( if (spider->is_bulk_access_clone) { spider->connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(spider->trx, conn); + spider_trx_add_bulk_access_conn(spider->wide_handler->trx, conn); } else { #endif conn->need_mon = &spider->need_mons[roop_count]; @@ -7926,8 +7946,8 @@ int spider_db_direct_delete( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7944,7 +7964,8 @@ int spider_db_direct_delete( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, @@ -7960,8 +7981,8 @@ int spider_db_direct_delete( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -7998,8 +8019,9 @@ int spider_db_direct_delete( spider_clear_bit(spider->db_request_phase, roop_count); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = + spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[roop_count]; request_key.next = NULL; @@ -8131,7 +8153,7 @@ int spider_db_direct_delete( if (spider->is_bulk_access_clone) { spider->connection_ids[roop_count] = conn->connection_id; - spider_trx_add_bulk_access_conn(spider->trx, conn); + spider_trx_add_bulk_access_conn(spider->wide_handler->trx, conn); } else { #endif conn->need_mon = &spider->need_mons[roop_count]; @@ -8148,8 +8170,8 @@ int spider_db_direct_delete( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8166,7 +8188,8 @@ int spider_db_direct_delete( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( sql_type, @@ -8182,8 +8205,8 @@ int spider_db_direct_delete( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8268,7 +8291,8 @@ int spider_db_delete_all_rows( conn->need_mon = &spider->need_mons[roop_count]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, roop_count)) || @@ -8297,8 +8321,8 @@ int spider_db_delete_all_rows( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8326,8 +8350,8 @@ int spider_db_delete_all_rows( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8344,7 +8368,8 @@ int spider_db_delete_all_rows( } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, roop_count, + spider->wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_DELETE_SQL, @@ -8360,8 +8385,8 @@ int spider_db_delete_all_rows( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8388,8 +8413,8 @@ int spider_db_delete_all_rows( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8426,7 +8451,7 @@ int spider_db_disable_keys( spider_db_handler *dbton_hdl; DBUG_ENTER("spider_db_disable_keys"); if ( - spider_param_internal_optimize(spider->trx->thd, + spider_param_internal_optimize(spider->wide_handler->trx->thd, share->internal_optimize) == 1 ) { for ( @@ -8447,8 +8472,8 @@ int spider_db_disable_keys( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8479,7 +8504,7 @@ int spider_db_enable_keys( spider_db_handler *dbton_hdl; DBUG_ENTER("spider_db_enable_keys"); if ( - spider_param_internal_optimize(spider->trx->thd, + spider_param_internal_optimize(spider->wide_handler->trx->thd, share->internal_optimize) == 1 ) { for ( @@ -8500,8 +8525,8 @@ int spider_db_enable_keys( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8533,7 +8558,7 @@ int spider_db_check_table( spider_db_handler *dbton_hdl; DBUG_ENTER("spider_db_check_table"); if ( - spider_param_internal_optimize(spider->trx->thd, + spider_param_internal_optimize(spider->wide_handler->trx->thd, share->internal_optimize) == 1 ) { for ( @@ -8554,8 +8579,8 @@ int spider_db_check_table( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8587,7 +8612,7 @@ int spider_db_repair_table( spider_db_handler *dbton_hdl; DBUG_ENTER("spider_db_repair_table"); if ( - spider_param_internal_optimize(spider->trx->thd, + spider_param_internal_optimize(spider->wide_handler->trx->thd, share->internal_optimize) == 1 ) { for ( @@ -8608,8 +8633,8 @@ int spider_db_repair_table( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8640,7 +8665,7 @@ int spider_db_analyze_table( spider_db_handler *dbton_hdl; DBUG_ENTER("spider_db_analyze_table"); if ( - spider_param_internal_optimize(spider->trx->thd, + spider_param_internal_optimize(spider->wide_handler->trx->thd, share->internal_optimize) == 1 ) { for ( @@ -8661,8 +8686,8 @@ int spider_db_analyze_table( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8693,7 +8718,7 @@ int spider_db_optimize_table( spider_db_handler *dbton_hdl; DBUG_ENTER("spider_db_optimize_table"); if ( - spider_param_internal_optimize(spider->trx->thd, + spider_param_internal_optimize(spider->wide_handler->trx->thd, share->internal_optimize) == 1 ) { for ( @@ -8714,8 +8739,8 @@ int spider_db_optimize_table( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8764,8 +8789,8 @@ int spider_db_flush_tables( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8812,8 +8837,8 @@ int spider_db_flush_logs( spider->need_mons[roop_count] ) { error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -8992,7 +9017,7 @@ int spider_db_print_item_type_default( spider_string *str ) { DBUG_ENTER("spider_db_print_item_type_default"); - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; if (spider_param_skip_default_condition(thd, share->skip_default_condition)) @@ -9854,12 +9879,13 @@ int spider_db_append_condition( DBUG_RETURN(error_num); } } else { - if (spider->cond_check) - DBUG_RETURN(spider->cond_check_error); - spider->cond_check = TRUE; - if ((spider->cond_check_error = spider->append_condition_sql_part( - NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL, TRUE))) - DBUG_RETURN(spider->cond_check_error); + if (spider->wide_handler->cond_check) + DBUG_RETURN(spider->wide_handler->cond_check_error); + spider->wide_handler->cond_check = TRUE; + if ((spider->wide_handler->cond_check_error = + spider->append_condition_sql_part( + NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL, TRUE))) + DBUG_RETURN(spider->wide_handler->cond_check_error); } DBUG_RETURN(0); } @@ -9876,8 +9902,8 @@ int spider_db_append_update_columns( ) { int error_num; bool add_comma = FALSE; - List_iterator_fast<Item> fi(*spider->direct_update_fields), - vi(*spider->direct_update_values); + List_iterator_fast<Item> fi(*spider->wide_handler->direct_update_fields), + vi(*spider->wide_handler->direct_update_values); Item *field, *value; DBUG_ENTER("spider_db_append_update_columns"); while ((field = fi++)) @@ -10708,10 +10734,12 @@ int spider_db_udf_ping_table( int need_mon = 0; uint tmp_conn_link_idx = 0; ha_spider spider; + SPIDER_WIDE_HANDLER wide_handler; uchar db_request_phase = 0; ulonglong db_request_id = 0; spider.share = share; - spider.trx = trx; + spider.wide_handler = &wide_handler; + wide_handler.trx = trx; spider.need_mons = &need_mon; spider.conn_link_idx = &tmp_conn_link_idx; spider.db_request_phase = &db_request_phase; @@ -10991,6 +11019,7 @@ int spider_db_udf_ping_table_mon_next( int init_sql_alloc_size = spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size); ha_spider spider; + SPIDER_WIDE_HANDLER wide_handler; SPIDER_TRX trx; DBUG_ENTER("spider_db_udf_ping_table_mon_next"); char *sql_buf = (char *) my_alloca(init_sql_alloc_size); @@ -11005,7 +11034,8 @@ int spider_db_udf_ping_table_mon_next( sql_str.length(0); trx.thd = thd; spider.share = share; - spider.trx = &trx; + spider.wide_handler = &wide_handler; + wide_handler.trx = &trx; spider.need_mons = &need_mon; spider.conn_link_idx = &tmp_conn_link_idx; @@ -11606,7 +11636,8 @@ int spider_db_open_handler( goto error; } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_HANDLER, @@ -11690,10 +11721,11 @@ int spider_db_open_handler( if (spider->is_bulk_access_clone && !spider->bulk_access_executing) { spider->connection_ids[link_idx] = conn->connection_id; - spider_trx_add_bulk_access_conn(spider->trx, conn); + spider_trx_add_bulk_access_conn(spider->wide_handler->trx, conn); } else { #endif - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_SELECT_HS, @@ -11711,8 +11743,9 @@ int spider_db_open_handler( spider_clear_bit(spider->db_request_phase, link_idx); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = + spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[link_idx]; request_key.next = NULL; @@ -11850,8 +11883,8 @@ int spider_db_bulk_open_handler( spider_clear_bit(spider->db_request_phase, link_idx); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = spider->db_request_id[link_idx]; request_key.next = NULL; @@ -11907,7 +11940,8 @@ int spider_db_close_handler( SPIDER_SQL_TYPE_HANDLER, link_idx))) DBUG_RETURN(error_num); - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, spider->share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_HANDLER, diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h index 8d4f972648a..2f386cb60a7 100644 --- a/storage/spider/spd_db_include.h +++ b/storage/spider/spd_db_include.h @@ -2045,7 +2045,6 @@ typedef struct st_spider_result_list #endif int quick_phase; bool keyread; - int lock_type; TABLE *table; #ifndef WITHOUT_SPIDER_BG_SEARCH volatile int bgs_error; diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index c18f72afa42..0f65a82dfde 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -3416,7 +3416,7 @@ int spider_db_mbase::append_lock_tables( { tmp_spider = tmp_link_for_hash->spider; tmp_link_idx = tmp_link_for_hash->link_idx; - switch (tmp_spider->lock_type) + switch (tmp_spider->wide_handler->lock_type) { case TL_READ: lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL; @@ -3432,7 +3432,8 @@ int spider_db_mbase::append_lock_tables( break; default: // no lock - DBUG_PRINT("info",("spider lock_type=%d", tmp_spider->lock_type)); + DBUG_PRINT("info",("spider lock_type=%d", + tmp_spider->wide_handler->lock_type)); DBUG_RETURN(0); } conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx]; @@ -6135,7 +6136,8 @@ int spider_db_mbase_util::open_item_func( } break; case Item_func::UDF_FUNC: - use_pushdown_udf = spider_param_use_pushdown_udf(spider->trx->thd, + use_pushdown_udf = spider_param_use_pushdown_udf( + spider->wide_handler->trx->thd, spider->share->use_pushdown_udf); if (!use_pushdown_udf) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); @@ -6276,7 +6278,7 @@ int spider_db_mbase_util::open_item_func( DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); #endif default: - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; if (spider_param_skip_default_condition(thd, share->skip_default_condition)) @@ -7972,9 +7974,11 @@ int spider_mbase_share::discover_table_structure( if (!conn->disable_reconnect) { ha_spider tmp_spider; + SPIDER_WIDE_HANDLER wide_handler; int need_mon = 0; uint tmp_conn_link_idx = 0; - tmp_spider.trx = trx; + tmp_spider.wide_handler = &wide_handler; + wide_handler.trx = trx; tmp_spider.share = spider_share; tmp_spider.need_mons = &need_mon; tmp_spider.conn_link_idx = &tmp_conn_link_idx; @@ -8263,7 +8267,7 @@ spider_mariadb_handler::~spider_mariadb_handler() int spider_mbase_handler::init() { uint roop_count; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; st_spider_share *share = spider->share; int init_sql_alloc_size = spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size); @@ -8699,7 +8703,7 @@ int spider_mbase_handler::append_create_tmp_bka_table( ) { int error_num; SPIDER_SHARE *share = spider->share; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; char *bka_engine = spider_param_bka_engine(thd, share->bka_engine); uint bka_engine_length = strlen(bka_engine), cset_length = strlen(table_charset->csname), @@ -9101,10 +9105,10 @@ int spider_mbase_handler::append_insert( direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_INSERT; if ( ( - spider->write_can_replace || + spider->wide_handler->write_can_replace || /* for direct_dup_insert without patch for partition */ - spider->sql_command == SQLCOM_REPLACE || - spider->sql_command == SQLCOM_REPLACE_SELECT + spider->wide_handler->sql_command == SQLCOM_REPLACE || + spider->wide_handler->sql_command == SQLCOM_REPLACE_SELECT ) && spider->direct_dup_insert ) { @@ -9117,13 +9121,13 @@ int spider_mbase_handler::append_insert( DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN); } - if (spider->low_priority) + if (spider->wide_handler->low_priority) { if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN); } - else if (spider->insert_delayed) + else if (spider->wide_handler->insert_delayed) { if (share->internal_delayed) { @@ -9133,28 +9137,28 @@ int spider_mbase_handler::append_insert( } } else if ( - spider->lock_type >= TL_WRITE && - !spider->write_can_replace && + spider->wide_handler->lock_type >= TL_WRITE && + !spider->wide_handler->write_can_replace && /* for direct_dup_insert without patch for partition */ - spider->sql_command != SQLCOM_REPLACE && - spider->sql_command != SQLCOM_REPLACE_SELECT + spider->wide_handler->sql_command != SQLCOM_REPLACE && + spider->wide_handler->sql_command != SQLCOM_REPLACE_SELECT ) { if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN); } if ( - spider->ignore_dup_key && + spider->wide_handler->ignore_dup_key && spider->direct_dup_insert && - !spider->write_can_replace && + !spider->wide_handler->write_can_replace && #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS - (!spider->insert_with_update || !dup_update_sql.length()) && + (!spider->wide_handler->insert_with_update || !dup_update_sql.length()) && #else - !spider->insert_with_update && + !spider->wide_handler->insert_with_update && #endif /* for direct_dup_insert without patch for partition */ - spider->sql_command != SQLCOM_REPLACE && - spider->sql_command != SQLCOM_REPLACE_SELECT + spider->wide_handler->sql_command != SQLCOM_REPLACE && + spider->wide_handler->sql_command != SQLCOM_REPLACE_SELECT ) { direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE; if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN)) @@ -9181,15 +9185,15 @@ int spider_mbase_handler::append_update( if (str->reserve(SPIDER_SQL_UPDATE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_UPDATE_STR, SPIDER_SQL_UPDATE_LEN); - if (spider->low_priority) + if (spider->wide_handler->low_priority) { if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN); } if ( - spider->ignore_dup_key && - !spider->insert_with_update + spider->wide_handler->ignore_dup_key && + !spider->wide_handler->insert_with_update ) { if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -9220,20 +9224,20 @@ int spider_mbase_handler::append_delete( if (str->reserve(SPIDER_SQL_DELETE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_DELETE_STR, SPIDER_SQL_DELETE_LEN); - if (spider->low_priority) + if (spider->wide_handler->low_priority) { if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN); } - if (spider->quick_mode) + if (spider->wide_handler->quick_mode) { if (str->reserve(SPIDER_SQL_SQL_QUICK_MODE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_QUICK_MODE_STR, SPIDER_SQL_SQL_QUICK_MODE_LEN); } - if (spider->ignore_dup_key) + if (spider->wide_handler->ignore_dup_key) { if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -9396,7 +9400,7 @@ int spider_mbase_handler::append_direct_update_set( DBUG_ENTER("spider_mbase_handler::append_direct_update_set"); if ( spider->direct_update_kinds == SPIDER_SQL_KIND_SQL && - spider->direct_update_fields + spider->wide_handler->direct_update_fields ) { if (str->reserve(SPIDER_SQL_SET_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -9539,6 +9543,7 @@ int spider_mbase_handler::append_select( ulong sql_type ) { SPIDER_RESULT_LIST *result_list = &spider->result_list; + SPIDER_WIDE_HANDLER *wide_handler = spider->wide_handler; DBUG_ENTER("spider_mbase_handler::append_select"); if (sql_type == SPIDER_SQL_TYPE_HANDLER) { @@ -9555,13 +9560,15 @@ int spider_mbase_handler::append_select( DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_DISTINCT_STR, SPIDER_SQL_DISTINCT_LEN); } - if (result_list->lock_type != F_WRLCK && spider->lock_mode < 1) + if (wide_handler->external_lock_type != F_WRLCK && + wide_handler->lock_mode < 1) { /* no lock */ #ifdef SPIDER_SQL_CACHE_IS_IN_LEX - LEX *lex = spider->trx->thd->lex; + LEX *lex = wide_handler->trx->thd->lex; #else - st_select_lex *select_lex = &spider->trx->thd->lex->select_lex; + st_select_lex *select_lex = + &wide_handler->trx->thd->lex->select_lex; #endif if ( #ifdef SPIDER_SQL_CACHE_IS_IN_LEX @@ -9599,7 +9606,7 @@ int spider_mbase_handler::append_select( SPIDER_SQL_SQL_NO_CACHE_LEN); } } - if (spider->high_priority) + if (wide_handler->high_priority) { if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -10597,7 +10604,7 @@ int spider_mbase_handler::append_update_where( ) { uint field_name_length; Field **field; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; bool no_pk = (table->s->primary_key == MAX_KEY); DBUG_ENTER("spider_mbase_handler::append_update_where"); @@ -10763,7 +10770,7 @@ int spider_mbase_handler::append_condition_part( ha_where_pos = str->length(); if ( - spider->sql_command == SQLCOM_HA_READ || + spider->wide_handler->sql_command == SQLCOM_HA_READ || !spider->result_list.use_both_key ) { if (sql_part2.length()) @@ -10792,7 +10799,7 @@ int spider_mbase_handler::append_condition( ulong sql_type ) { int error_num, restart_pos = 0, start_where_pos; - SPIDER_CONDITION *tmp_cond = spider->condition; + SPIDER_CONDITION *tmp_cond = spider->wide_handler->condition; DBUG_ENTER("spider_mbase_handler::append_condition"); if (str && start_where) { @@ -10803,7 +10810,7 @@ int spider_mbase_handler::append_condition( if (spider->is_clone && !tmp_cond) { - tmp_cond = spider->pt_clone_source_handler->condition; + tmp_cond = spider->pt_clone_source_handler->wide_handler->condition; } while (tmp_cond) @@ -12275,7 +12282,7 @@ int spider_mbase_handler::append_from( str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); table_name_pos = str->length(); append_table_name_with_adjusting(str, link_idx, sql_type); - if(spider_param_index_hint_pushdown(spider->trx->thd)) + if(spider_param_index_hint_pushdown(spider->wide_handler->trx->thd)) { if((error_num = append_index_hint(str, link_idx, sql_type))) { @@ -12356,7 +12363,8 @@ int spider_mbase_handler::append_optimize_table( ) { SPIDER_SHARE *share = spider->share; int conn_link_idx = spider->conn_link_idx[link_idx]; - int local_length = spider_param_internal_optimize_local(spider->trx->thd, + int local_length = spider_param_internal_optimize_local( + spider->wide_handler->trx->thd, share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN; DBUG_ENTER("spider_mbase_handler::append_optimize_table"); DBUG_PRINT("info",("spider this=%p", this)); @@ -12401,7 +12409,8 @@ int spider_mbase_handler::append_analyze_table( ) { SPIDER_SHARE *share = spider->share; int conn_link_idx = spider->conn_link_idx[link_idx]; - int local_length = spider_param_internal_optimize_local(spider->trx->thd, + int local_length = spider_param_internal_optimize_local( + spider->wide_handler->trx->thd, share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN; DBUG_ENTER("spider_mbase_handler::append_analyze_table"); DBUG_PRINT("info",("spider this=%p", this)); @@ -12448,7 +12457,8 @@ int spider_mbase_handler::append_repair_table( ) { SPIDER_SHARE *share = spider->share; int conn_link_idx = spider->conn_link_idx[link_idx]; - int local_length = spider_param_internal_optimize_local(spider->trx->thd, + int local_length = spider_param_internal_optimize_local( + spider->wide_handler->trx->thd, share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN; DBUG_ENTER("spider_mbase_handler::append_repair_table"); DBUG_PRINT("info",("spider this=%p", this)); @@ -12658,7 +12668,7 @@ int spider_mbase_handler::append_delete_all_rows( int error_num; DBUG_ENTER("spider_mbase_handler::append_delete_all_rows"); DBUG_PRINT("info",("spider this=%p", this)); - if (spider->sql_command == SQLCOM_TRUNCATE) + if (spider->wide_handler->sql_command == SQLCOM_TRUNCATE) { if ((error_num = append_truncate(str, sql_type, first_link_idx))) DBUG_RETURN(error_num); @@ -12964,7 +12974,7 @@ bool spider_mbase_handler::bulk_tmp_table_created() int spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start() { - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; TABLE *table = spider->get_table(); DBUG_ENTER("spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start"); DBUG_PRINT("info",("spider this=%p", this)); @@ -12993,7 +13003,8 @@ void spider_mbase_handler::rm_bulk_tmp_table() DBUG_PRINT("info",("spider this=%p", this)); if (upd_tmp_tbl) { - spider_rm_sys_tmp_table(spider->trx->thd, upd_tmp_tbl, &upd_tmp_tbl_prm); + spider_rm_sys_tmp_table(spider->wide_handler->trx->thd, upd_tmp_tbl, + &upd_tmp_tbl_prm); upd_tmp_tbl = NULL; } DBUG_VOID_RETURN; @@ -13067,9 +13078,12 @@ int spider_mbase_handler::append_lock_tables_list( spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn; DBUG_ENTER("spider_mbase_handler::append_lock_tables_list"); DBUG_PRINT("info",("spider this=%p", this)); + DBUG_PRINT("info",("spider db_conn=%p", db_conn)); tmp_link_for_hash2 = &link_for_hash[link_idx]; tmp_link_for_hash2->db_table_str = &mysql_share->db_table_str[conn_link_idx]; + DBUG_PRINT("info",("spider db_table_str=%s", + tmp_link_for_hash2->db_table_str->c_ptr_safe())); #ifdef SPIDER_HAS_HASH_VALUE_TYPE tmp_link_for_hash2->db_table_str_hash_value = mysql_share->db_table_str_hash_value[conn_link_idx]; @@ -13090,7 +13104,8 @@ int spider_mbase_handler::append_lock_tables_list( DBUG_RETURN(error_num); *appended = 1; } else { - if (tmp_link_for_hash->spider->lock_type < spider->lock_type) + if (tmp_link_for_hash->spider->wide_handler->lock_type < + spider->wide_handler->lock_type) { #ifdef HASH_UPDATE_WITH_HASH_VALUE my_hash_delete_with_hash_value( @@ -13130,7 +13145,7 @@ int spider_mbase_handler::append_lock_tables_list( int spider_mbase_handler::realloc_sql( ulong *realloced ) { - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; st_spider_share *share = spider->share; int init_sql_alloc_size = spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size); @@ -13587,7 +13602,8 @@ int spider_mbase_handler::show_table_status( conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; conn->disable_connect_retry = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -13624,7 +13640,8 @@ int spider_mbase_handler::show_table_status( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -13648,8 +13665,8 @@ int spider_mbase_handler::show_table_status( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -13720,7 +13737,8 @@ int spider_mbase_handler::show_table_status( conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; conn->disable_connect_retry = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -13757,7 +13775,8 @@ int spider_mbase_handler::show_table_status( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -13781,8 +13800,8 @@ int spider_mbase_handler::show_table_status( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -13887,7 +13906,8 @@ int spider_mbase_handler::show_index( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -13922,7 +13942,8 @@ int spider_mbase_handler::show_index( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -13944,8 +13965,8 @@ int spider_mbase_handler::show_index( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -14020,7 +14041,8 @@ int spider_mbase_handler::show_index( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -14055,7 +14077,8 @@ int spider_mbase_handler::show_index( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -14077,8 +14100,8 @@ int spider_mbase_handler::show_index( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -14208,7 +14231,8 @@ int spider_mbase_handler::simple_action( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -14245,7 +14269,8 @@ int spider_mbase_handler::simple_action( DBUG_PRINT("info", ("spider error_num=%d 2", error_num)); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -14269,8 +14294,8 @@ int spider_mbase_handler::simple_action( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -14329,7 +14354,7 @@ int spider_mbase_handler::show_records( DBUG_PRINT("info", ("spider error_num=%d", error_num)); DBUG_RETURN(error_num); } - spider->trx->direct_aggregate_count++; + spider->wide_handler->trx->direct_aggregate_count++; DBUG_RETURN(0); } @@ -14378,7 +14403,8 @@ ha_rows spider_mbase_handler::explain_select( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, spider->share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -14417,7 +14443,8 @@ ha_rows spider_mbase_handler::explain_select( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(HA_POS_ERROR); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, spider->share); if (spider_db_query( conn, @@ -14446,8 +14473,8 @@ ha_rows spider_mbase_handler::explain_select( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -14516,7 +14543,8 @@ int spider_mbase_handler::lock_tables( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, spider->share); if (spider_db_query( conn, @@ -14537,7 +14565,7 @@ int spider_mbase_handler::lock_tables( if (!conn->table_locked) { conn->table_locked = TRUE; - spider->trx->locked_connections++; + spider->wide_handler->trx->locked_connections++; } DBUG_RETURN(0); } @@ -14552,7 +14580,7 @@ int spider_mbase_handler::unlock_tables( { spider_string *str = &sql; conn->table_locked = FALSE; - spider->trx->locked_connections--; + spider->wide_handler->trx->locked_connections--; str->length(0); if ((error_num = conn->db_conn->append_unlock_tables(str))) @@ -14561,7 +14589,8 @@ int spider_mbase_handler::unlock_tables( } if (str->length()) { - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, spider->share); if (spider_db_query( conn, @@ -14606,7 +14635,8 @@ int spider_mbase_handler::disable_keys( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -14655,7 +14685,8 @@ int spider_mbase_handler::enable_keys( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -14705,7 +14736,8 @@ int spider_mbase_handler::check_table( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -14755,7 +14787,8 @@ int spider_mbase_handler::repair_table( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -14804,7 +14837,8 @@ int spider_mbase_handler::analyze_table( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -14853,7 +14887,8 @@ int spider_mbase_handler::optimize_table( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -14890,7 +14925,8 @@ int spider_mbase_handler::flush_tables( { DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -14915,7 +14951,8 @@ int spider_mbase_handler::flush_logs( SPIDER_SHARE *share = spider->share; DBUG_ENTER("spider_mbase_handler::flush_logs"); DBUG_PRINT("info",("spider this=%p", this)); - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -15037,16 +15074,17 @@ void spider_mbase_handler::minimum_select_bitmap_create() } } } - DBUG_PRINT("info",("spider searched_bitmap=%p", spider->searched_bitmap)); + DBUG_PRINT("info",("spider searched_bitmap=%p", + spider->wide_handler->searched_bitmap)); for (field_p = table->field; *field_p; field_p++) { uint field_index = (*field_p)->field_index; DBUG_PRINT("info",("spider field_index=%u", field_index)); DBUG_PRINT("info",("spider ft_discard_bitmap=%s", - spider_bit_is_set(spider->ft_discard_bitmap, field_index) ? + spider_bit_is_set(spider->wide_handler->ft_discard_bitmap, field_index) ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider searched_bitmap=%s", - spider_bit_is_set(spider->searched_bitmap, field_index) ? + spider_bit_is_set(spider->wide_handler->searched_bitmap, field_index) ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider read_set=%s", bitmap_is_set(table->read_set, field_index) ? @@ -15055,10 +15093,10 @@ void spider_mbase_handler::minimum_select_bitmap_create() bitmap_is_set(table->write_set, field_index) ? "TRUE" : "FALSE")); if ( - spider_bit_is_set(spider->ft_discard_bitmap, field_index) && + spider_bit_is_set(spider->wide_handler->ft_discard_bitmap, field_index) & ( - spider_bit_is_set(spider->searched_bitmap, field_index) || - bitmap_is_set(table->read_set, field_index) || + spider_bit_is_set(spider->wide_handler->searched_bitmap, field_index) | + bitmap_is_set(table->read_set, field_index) | bitmap_is_set(table->write_set, field_index) ) ) { diff --git a/storage/spider/spd_db_oracle.cc b/storage/spider/spd_db_oracle.cc index fd3efd2bd67..bbb03640aa8 100644 --- a/storage/spider/spd_db_oracle.cc +++ b/storage/spider/spd_db_oracle.cc @@ -2315,7 +2315,7 @@ int spider_db_oracle::append_lock_tables( tmp_spider = tmp_link_for_hash->spider; tmp_link_idx = tmp_link_for_hash->link_idx; - switch (tmp_spider->lock_type) + switch (tmp_spider->wide_handler->lock_type) { case TL_READ: lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL; @@ -2331,7 +2331,8 @@ int spider_db_oracle::append_lock_tables( break; default: // no lock - DBUG_PRINT("info",("spider lock_type=%d", tmp_spider->lock_type)); + DBUG_PRINT("info",("spider lock_type=%d", + tmp_spider->wide_handler->lock_type)); DBUG_RETURN(0); } conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx]; @@ -4015,7 +4016,8 @@ int spider_db_oracle_util::open_item_func( } break; case Item_func::UDF_FUNC: - use_pushdown_udf = spider_param_use_pushdown_udf(spider->trx->thd, + use_pushdown_udf = spider_param_use_pushdown_udf( + spider->wide_handler->trx->thd, spider->share->use_pushdown_udf); if (!use_pushdown_udf) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); @@ -4156,7 +4158,7 @@ int spider_db_oracle_util::open_item_func( DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); #endif default: - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; if (spider_param_skip_default_condition(thd, share->skip_default_condition)) @@ -5487,7 +5489,7 @@ spider_oracle_handler::~spider_oracle_handler() int spider_oracle_handler::init() { uint roop_count; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; st_spider_share *share = spider->share; int init_sql_alloc_size = spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size); @@ -5869,7 +5871,7 @@ int spider_oracle_handler::append_create_tmp_bka_table( ) { int error_num; SPIDER_SHARE *share = spider->share; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; char *bka_engine = spider_param_bka_engine(thd, share->bka_engine); uint bka_engine_length = strlen(bka_engine), cset_length = strlen(table_charset->csname); @@ -6479,7 +6481,7 @@ int spider_oracle_handler::append_direct_update_set( DBUG_ENTER("spider_oracle_handler::append_direct_update_set"); if ( spider->direct_update_kinds == SPIDER_SQL_KIND_SQL && - spider->direct_update_fields + spider->wide_handler->direct_update_fields ) { if (str->reserve(SPIDER_SQL_SET_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -6587,8 +6589,8 @@ int spider_oracle_handler::append_update_columns( uint alias_length ) { int error_num; - List_iterator_fast<Item> fi(*spider->direct_update_fields), - vi(*spider->direct_update_values); + List_iterator_fast<Item> fi(*spider->wide_handler->direct_update_fields), + vi(*spider->wide_handler->direct_update_values); Item *field, *value; DBUG_ENTER("spider_oracle_handler::append_update_columns"); while ((field = fi++)) @@ -7618,7 +7620,7 @@ int spider_oracle_handler::append_update_where( ) { uint field_name_length; Field **field; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; bool no_pk = (table->s->primary_key == MAX_KEY); DBUG_ENTER("spider_oracle_handler::append_update_where"); @@ -9816,7 +9818,8 @@ int spider_oracle_handler::append_optimize_table( ) { SPIDER_SHARE *share = spider->share; int conn_link_idx = spider->conn_link_idx[link_idx]; - int local_length = spider_param_internal_optimize_local(spider->trx->thd, + int local_length = spider_param_internal_optimize_local( + spider->wide_handler->trx->thd, share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN; DBUG_ENTER("spider_oracle_handler::append_optimize_table"); DBUG_PRINT("info",("spider this=%p", this)); @@ -9861,7 +9864,8 @@ int spider_oracle_handler::append_analyze_table( ) { SPIDER_SHARE *share = spider->share; int conn_link_idx = spider->conn_link_idx[link_idx]; - int local_length = spider_param_internal_optimize_local(spider->trx->thd, + int local_length = spider_param_internal_optimize_local( + spider->wide_handler->trx->thd, share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN; DBUG_ENTER("spider_oracle_handler::append_analyze_table"); DBUG_PRINT("info",("spider this=%p", this)); @@ -9908,7 +9912,8 @@ int spider_oracle_handler::append_repair_table( ) { SPIDER_SHARE *share = spider->share; int conn_link_idx = spider->conn_link_idx[link_idx]; - int local_length = spider_param_internal_optimize_local(spider->trx->thd, + int local_length = spider_param_internal_optimize_local( + spider->wide_handler->trx->thd, share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN; DBUG_ENTER("spider_oracle_handler::append_repair_table"); DBUG_PRINT("info",("spider this=%p", this)); @@ -10425,7 +10430,7 @@ bool spider_oracle_handler::bulk_tmp_table_created() int spider_oracle_handler::mk_bulk_tmp_table_and_bulk_start() { - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; TABLE *table = spider->get_table(); DBUG_ENTER("spider_oracle_handler::mk_bulk_tmp_table_and_bulk_start"); DBUG_PRINT("info",("spider this=%p", this)); @@ -10454,7 +10459,8 @@ void spider_oracle_handler::rm_bulk_tmp_table() DBUG_PRINT("info",("spider this=%p", this)); if (upd_tmp_tbl) { - spider_rm_sys_tmp_table(spider->trx->thd, upd_tmp_tbl, &upd_tmp_tbl_prm); + spider_rm_sys_tmp_table(spider->wide_handler->trx->thd, upd_tmp_tbl, + &upd_tmp_tbl_prm); upd_tmp_tbl = NULL; } DBUG_VOID_RETURN; @@ -10551,7 +10557,8 @@ int spider_oracle_handler::append_lock_tables_list( DBUG_RETURN(error_num); *appended = 1; } else { - if (tmp_link_for_hash->spider->lock_type < spider->lock_type) + if (tmp_link_for_hash->spider->wide_handler->lock_type < + spider->wide_handler->lock_type) { #ifdef HASH_UPDATE_WITH_HASH_VALUE my_hash_delete_with_hash_value( @@ -10591,7 +10598,7 @@ int spider_oracle_handler::append_lock_tables_list( int spider_oracle_handler::realloc_sql( ulong *realloced ) { - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; st_spider_share *share = spider->share; int init_sql_alloc_size = spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size); @@ -11130,7 +11137,8 @@ int spider_oracle_handler::show_table_status( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -11167,7 +11175,8 @@ int spider_oracle_handler::show_table_status( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -11189,8 +11198,8 @@ int spider_oracle_handler::show_table_status( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -11245,7 +11254,8 @@ int spider_oracle_handler::show_table_status( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -11280,7 +11290,8 @@ int spider_oracle_handler::show_table_status( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -11302,8 +11313,8 @@ int spider_oracle_handler::show_table_status( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -11369,7 +11380,8 @@ int spider_oracle_handler::show_index( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -11406,7 +11418,8 @@ int spider_oracle_handler::show_index( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -11428,8 +11441,8 @@ int spider_oracle_handler::show_index( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -11488,7 +11501,8 @@ int spider_oracle_handler::show_index( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -11523,7 +11537,8 @@ int spider_oracle_handler::show_index( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -11545,8 +11560,8 @@ int spider_oracle_handler::show_index( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -11612,7 +11627,8 @@ int spider_oracle_handler::show_records( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -11649,7 +11665,8 @@ int spider_oracle_handler::show_records( DBUG_PRINT("info", ("spider error_num=%d 2", error_num)); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -11673,8 +11690,8 @@ int spider_oracle_handler::show_records( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -11707,7 +11724,7 @@ int spider_oracle_handler::show_records( DBUG_PRINT("info", ("spider error_num=%d 7", error_num)); DBUG_RETURN(error_num); } - spider->trx->direct_aggregate_count++; + spider->wide_handler->trx->direct_aggregate_count++; DBUG_RETURN(0); } @@ -11729,7 +11746,8 @@ int spider_oracle_handler::show_autoinc( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -11766,7 +11784,8 @@ int spider_oracle_handler::show_autoinc( DBUG_PRINT("info", ("spider error_num=%d 2", error_num)); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -11790,8 +11809,8 @@ int spider_oracle_handler::show_autoinc( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -11866,8 +11885,8 @@ int spider_oracle_handler::show_last_insert_id( DBUG_RETURN(error_num); } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -11923,7 +11942,8 @@ ha_rows spider_oracle_handler::explain_select( conn->need_mon = &spider->need_mons[link_idx]; conn->mta_conn_mutex_lock_already = TRUE; conn->mta_conn_mutex_unlock_later = TRUE; - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, spider->share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || @@ -11962,7 +11982,8 @@ ha_rows spider_oracle_handler::explain_select( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(HA_POS_ERROR); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, spider->share); if (spider_db_query( conn, @@ -11991,8 +12012,8 @@ ha_rows spider_oracle_handler::explain_select( } } st_spider_db_request_key request_key; - request_key.spider_thread_id = spider->trx->spider_thread_id; - request_key.query_id = spider->trx->thd->query_id; + request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; + request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; @@ -12062,7 +12083,8 @@ int spider_oracle_handler::lock_tables( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, spider->share); if (spider_db_query( conn, @@ -12083,7 +12105,7 @@ int spider_oracle_handler::lock_tables( if (!conn->table_locked) { conn->table_locked = TRUE; - spider->trx->locked_connections++; + spider->wide_handler->trx->locked_connections++; } } while (str->length()); DBUG_RETURN(0); @@ -12133,7 +12155,8 @@ int spider_oracle_handler::disable_keys( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -12182,7 +12205,8 @@ int spider_oracle_handler::enable_keys( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -12232,7 +12256,8 @@ int spider_oracle_handler::check_table( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -12282,7 +12307,8 @@ int spider_oracle_handler::repair_table( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -12331,7 +12357,8 @@ int spider_oracle_handler::analyze_table( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -12380,7 +12407,8 @@ int spider_oracle_handler::optimize_table( pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -12417,7 +12445,8 @@ int spider_oracle_handler::flush_tables( { DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, @@ -12442,7 +12471,8 @@ int spider_oracle_handler::flush_logs( SPIDER_SHARE *share = spider->share; DBUG_ENTER("spider_oracle_handler::flush_logs"); DBUG_PRINT("info",("spider this=%p", this)); - spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd, + spider_conn_set_timeout_from_share(conn, link_idx, + spider->wide_handler->trx->thd, share); if (spider_db_query( conn, diff --git a/storage/spider/spd_group_by_handler.cc b/storage/spider/spd_group_by_handler.cc index 63f7cc0fdc3..d4ff18d129f 100644 --- a/storage/spider/spd_group_by_handler.cc +++ b/storage/spider/spd_group_by_handler.cc @@ -795,7 +795,7 @@ void spider_fields::choose_a_conn( SPIDER_CONN_HOLDER *conn_holder; longlong balance_total = 0, balance_val; double rand_val; - THD *thd = table_holder[0].spider->trx->thd; + THD *thd = table_holder[0].spider->wide_handler->trx->thd; DBUG_ENTER("spider_fields::choose_a_conn"); DBUG_PRINT("info",("spider this=%p", this)); for (current_conn_holder = first_conn_holder; current_conn_holder; @@ -1147,8 +1147,8 @@ int spider_fields::ping_table_mon_from_table( if (tmp_share->monitoring_kind[tmp_link_idx]) { error_num_buf = spider_ping_table_mon_from_table( - tmp_spider->trx, - tmp_spider->trx->thd, + tmp_spider->wide_handler->trx, + tmp_spider->wide_handler->trx->thd, tmp_share, tmp_link_idx, (uint32) tmp_share->monitoring_sid[tmp_link_idx], @@ -1181,7 +1181,7 @@ spider_group_by_handler::spider_group_by_handler( fields->set_pos_to_first_table_holder(); SPIDER_TABLE_HOLDER *table_holder = fields->get_next_table_holder(); spider = table_holder->spider; - trx = spider->trx; + trx = spider->wide_handler->trx; DBUG_VOID_RETURN; } @@ -1924,6 +1924,12 @@ group_by_handler *spider_create_group_by_handler( delete fields; DBUG_RETURN(NULL); } + if (spider->dml_init()) + { + DBUG_PRINT("info",("spider can not init for dml")); + delete fields; + DBUG_RETURN(NULL); + } for ( roop_count = spider_conn_link_idx_next(share->link_statuses, spider->conn_link_idx, -1, share->link_count, @@ -2006,6 +2012,12 @@ group_by_handler *spider_create_group_by_handler( } DBUG_PRINT("info",("spider s->db=%s", from->table->s->db.str)); DBUG_PRINT("info",("spider s->table_name=%s", from->table->s->table_name.str)); + if (spider->dml_init()) + { + DBUG_PRINT("info",("spider can not init for dml")); + delete fields; + DBUG_RETURN(NULL); + } for ( roop_count = spider_conn_link_idx_next(share->link_statuses, spider->conn_link_idx, -1, share->link_count, diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h index 2249d3e699c..bca4e4014ef 100644 --- a/storage/spider/spd_include.h +++ b/storage/spider/spd_include.h @@ -621,26 +621,19 @@ typedef struct st_spider_lgtm_tblhnd_share #ifdef WITH_PARTITION_STORAGE_ENGINE typedef struct st_spider_patition_handler_share { - uint use_count; - TABLE *table; + bool clone_bitmap_init; #ifdef SPIDER_HAS_HASH_VALUE_TYPE my_hash_value_type table_hash_value; #endif - void *creator; - void **handlers; - uchar *searched_bitmap; - uchar *ft_discard_bitmap; - uchar *idx_read_bitmap; - uchar *idx_write_bitmap; - uchar *rnd_read_bitmap; - uchar *rnd_write_bitmap; - bool between_flg; - bool idx_bitmap_is_set; - bool rnd_bitmap_is_set; query_id_t parallel_search_query_id; + uint no_parts; + TABLE *table; + ha_spider *owner; + ha_spider **handlers; } SPIDER_PARTITION_HANDLER_SHARE; +#endif -typedef struct st_spider_patition_share +typedef struct st_spider_wide_share { char *table_name; uint table_name_length; @@ -648,6 +641,7 @@ typedef struct st_spider_patition_share my_hash_value_type table_path_hash_value; #endif uint use_count; + THR_LOCK lock; pthread_mutex_t sts_mutex; pthread_mutex_t crd_mutex; pthread_mutex_t pt_handler_mutex; @@ -664,11 +658,103 @@ typedef struct st_spider_patition_share ha_statistics stat; longlong *cardinality; -/* - volatile SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share; -*/ -} SPIDER_PARTITION_SHARE; +} SPIDER_WIDE_SHARE; + +enum spider_hnd_stage { + SPD_HND_STAGE_NONE, + SPD_HND_STAGE_STORE_LOCK, + SPD_HND_STAGE_EXTERNAL_LOCK, + SPD_HND_STAGE_START_STMT, + SPD_HND_STAGE_EXTRA, + SPD_HND_STAGE_COND_PUSH, + SPD_HND_STAGE_COND_POP, + SPD_HND_STAGE_INFO_PUSH, + SPD_HND_STAGE_SET_TOP_TABLE_AND_FIELDS, + SPD_HND_STAGE_CLEAR_TOP_TABLE_FIELDS +}; + +typedef struct st_spider_wide_handler +{ + spider_hnd_stage stage; + handler *stage_executor; + THR_LOCK_DATA lock; + SPIDER_TRX *trx; + uchar *searched_bitmap; + uchar *ft_discard_bitmap; + uchar *position_bitmap; + uchar *idx_read_bitmap; + uchar *idx_write_bitmap; + uchar *rnd_read_bitmap; + uchar *rnd_write_bitmap; + SPIDER_CONDITION *condition; + void *owner; +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS + uint32 *hs_pushed_ret_fields; #endif +#endif +#ifdef WITH_PARTITION_STORAGE_ENGINE + SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share; +#endif +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS + List<Item> *direct_update_fields; + List<Item> *direct_update_values; +#endif + TABLE *top_table; + Field **top_table_field; + enum thr_lock_type lock_type; + uchar lock_table_type; +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS + uint32 hs_pushed_strref_num; +#endif +#endif + int lock_mode; + int external_lock_type; + int cond_check_error; + uint sql_command; + uint top_table_fields; +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS +#ifdef INFO_KIND_FORCE_LIMIT_BEGIN + longlong info_limit; +#endif +#endif +#ifdef HA_CAN_BULK_ACCESS + ulonglong external_lock_cnt; +#endif +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS + size_t hs_pushed_ret_fields_num; + size_t hs_pushed_ret_fields_size; + size_t hs_pushed_lcl_fields_num; +#endif +#endif + bool between_flg; + bool idx_bitmap_is_set; + bool rnd_bitmap_is_set; + bool position_bitmap_init; + bool semi_trx_isolation_chk; + bool semi_trx_chk; + bool low_priority; + bool high_priority; + bool insert_delayed; + bool consistent_snapshot; + bool quick_mode; + bool keyread; + bool update_request; + bool ignore_dup_key; + bool write_can_replace; + bool insert_with_update; + bool cond_check; + bool set_top_table_fields; +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) +#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS + bool hs_increment; + bool hs_decrement; +#endif +#endif + bool semi_table_lock; +} SPIDER_WIDE_HANDLER; typedef struct st_spider_transaction { @@ -805,7 +891,6 @@ typedef struct st_spider_share /* pthread_mutex_t auto_increment_mutex; */ - THR_LOCK lock; TABLE_SHARE *table_share; SPIDER_LGTM_TBLHND_SHARE *lgtm_tblhnd_share; #ifdef SPIDER_HAS_HASH_VALUE_TYPE @@ -1177,9 +1262,7 @@ typedef struct st_spider_share #endif SPIDER_ALTER_TABLE alter_table; -#ifdef WITH_PARTITION_STORAGE_ENGINE - SPIDER_PARTITION_SHARE *partition_share; -#endif + SPIDER_WIDE_SHARE *wide_share; } SPIDER_SHARE; typedef struct st_spider_link_pack diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 98650d10525..ab2375e4770 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -152,7 +152,7 @@ SPIDER_THREAD *spider_table_crd_threads; PSI_mutex_key spd_key_mutex_tbl; PSI_mutex_key spd_key_mutex_init_error_tbl; #ifdef WITH_PARTITION_STORAGE_ENGINE -PSI_mutex_key spd_key_mutex_pt_share; +PSI_mutex_key spd_key_mutex_wide_share; #endif PSI_mutex_key spd_key_mutex_lgtm_tblhnd_share; PSI_mutex_key spd_key_mutex_conn; @@ -182,8 +182,8 @@ PSI_mutex_key spd_key_mutex_share_sts; PSI_mutex_key spd_key_mutex_share_crd; PSI_mutex_key spd_key_mutex_share_auto_increment; #ifdef WITH_PARTITION_STORAGE_ENGINE -PSI_mutex_key spd_key_mutex_pt_share_sts; -PSI_mutex_key spd_key_mutex_pt_share_crd; +PSI_mutex_key spd_key_mutex_wide_share_sts; +PSI_mutex_key spd_key_mutex_wide_share_crd; PSI_mutex_key spd_key_mutex_pt_handler; #endif PSI_mutex_key spd_key_mutex_udf_table; @@ -202,7 +202,7 @@ static PSI_mutex_info all_spider_mutexes[]= { &spd_key_mutex_tbl, "tbl", PSI_FLAG_GLOBAL}, { &spd_key_mutex_init_error_tbl, "init_error_tbl", PSI_FLAG_GLOBAL}, #ifdef WITH_PARTITION_STORAGE_ENGINE - { &spd_key_mutex_pt_share, "pt_share", PSI_FLAG_GLOBAL}, + { &spd_key_mutex_wide_share, "wide_share", PSI_FLAG_GLOBAL}, #endif { &spd_key_mutex_lgtm_tblhnd_share, "lgtm_tblhnd_share", PSI_FLAG_GLOBAL}, { &spd_key_mutex_conn, "conn", PSI_FLAG_GLOBAL}, @@ -241,8 +241,8 @@ static PSI_mutex_info all_spider_mutexes[]= { &spd_key_mutex_share_crd, "share_crd", 0}, { &spd_key_mutex_share_auto_increment, "share_auto_increment", 0}, #ifdef WITH_PARTITION_STORAGE_ENGINE - { &spd_key_mutex_pt_share_sts, "pt_share_sts", 0}, - { &spd_key_mutex_pt_share_crd, "pt_share_crd", 0}, + { &spd_key_mutex_wide_share_sts, "wide_share_sts", 0}, + { &spd_key_mutex_wide_share_crd, "wide_share_crd", 0}, { &spd_key_mutex_pt_handler, "pt_handler", 0}, #endif { &spd_key_mutex_udf_table, "udf_table", 0}, @@ -365,12 +365,12 @@ extern pthread_mutex_t spider_conn_id_mutex; extern pthread_mutex_t spider_ipport_conn_mutex; #ifdef WITH_PARTITION_STORAGE_ENGINE -HASH spider_open_pt_share; -uint spider_open_pt_share_id; -const char *spider_open_pt_share_func_name; -const char *spider_open_pt_share_file_name; -ulong spider_open_pt_share_line_no; -pthread_mutex_t spider_pt_share_mutex; +HASH spider_open_wide_share; +uint spider_open_wide_share_id; +const char *spider_open_wide_share_func_name; +const char *spider_open_wide_share_file_name; +ulong spider_open_wide_share_line_no; +pthread_mutex_t spider_wide_share_mutex; #endif HASH spider_lgtm_tblhnd_share_hash; @@ -415,25 +415,25 @@ uchar *spider_tbl_get_key( DBUG_RETURN((uchar*) share->table_name); } -#ifdef WITH_PARTITION_STORAGE_ENGINE -uchar *spider_pt_share_get_key( - SPIDER_PARTITION_SHARE *share, +uchar *spider_wide_share_get_key( + SPIDER_WIDE_SHARE *share, size_t *length, my_bool not_used __attribute__ ((unused)) ) { - DBUG_ENTER("spider_pt_share_get_key"); + DBUG_ENTER("spider_wide_share_get_key"); *length = share->table_name_length; DBUG_RETURN((uchar*) share->table_name); } +#ifdef WITH_PARTITION_STORAGE_ENGINE uchar *spider_pt_handler_share_get_key( SPIDER_PARTITION_HANDLER_SHARE *share, size_t *length, my_bool not_used __attribute__ ((unused)) ) { DBUG_ENTER("spider_pt_handler_share_get_key"); - *length = sizeof(TABLE *); - DBUG_RETURN((uchar*) &share->table); + *length = sizeof(ha_spider *); + DBUG_RETURN((uchar*) share->owner); } #endif @@ -913,10 +913,8 @@ int spider_free_share_alloc( delete [] share->key_hint; share->key_hint = NULL; } -#ifdef WITH_PARTITION_STORAGE_ENGINE - if (share->partition_share) - spider_free_pt_share(share->partition_share); -#endif + if (share->wide_share) + spider_free_wide_share(share->wide_share); DBUG_RETURN(0); } @@ -4517,8 +4515,6 @@ SPIDER_SHARE *spider_create_share( goto error_init_crd_mutex; } - thr_lock_init(&share->lock); - #ifdef SPIDER_HAS_HASH_VALUE_TYPE if (!(share->lgtm_tblhnd_share = spider_get_lgtm_tblhnd_share(tmp_name, length, hash_value, FALSE, TRUE, @@ -4531,11 +4527,9 @@ SPIDER_SHARE *spider_create_share( goto error_get_lgtm_tblhnd_share; } -#ifdef WITH_PARTITION_STORAGE_ENGINE - if (!(share->partition_share = - spider_get_pt_share(share, table_share, error_num))) - goto error_get_pt_share; -#endif + if (!(share->wide_share = + spider_get_wide_share(share, table_share, error_num))) + goto error_get_wide_share; for (roop_count = 0; roop_count < SPIDER_DBTON_SIZE; roop_count++) { @@ -4583,12 +4577,9 @@ error_init_dbton: share->dbton_share[roop_count] = NULL; } } -#ifdef WITH_PARTITION_STORAGE_ENGINE - spider_free_pt_share(share->partition_share); -error_get_pt_share: -#endif + spider_free_wide_share(share->wide_share); +error_get_wide_share: error_get_lgtm_tblhnd_share: - thr_lock_delete(&share->lock); pthread_mutex_destroy(&share->crd_mutex); error_init_crd_mutex: pthread_mutex_destroy(&share->sts_mutex); @@ -4810,7 +4801,7 @@ SPIDER_SHARE *spider_get_share( else first_byte = '0'; - if (!(spider->trx = spider_get_trx(thd, TRUE, error_num))) + if (!(spider->wide_handler->trx = spider_get_trx(thd, TRUE, error_num))) { share->init_error = TRUE; share->init_error_time = (time_t) time((time_t*) 0); @@ -4827,7 +4818,7 @@ SPIDER_SHARE *spider_get_share( if (!share->sts_spider_init) { if ((*error_num = spider_create_spider_object_for_share( - spider->trx, share, &share->sts_spider))) + spider->wide_handler->trx, share, &share->sts_spider))) { pthread_mutex_unlock(&share->mutex); share->init_error = TRUE; @@ -4855,7 +4846,7 @@ SPIDER_SHARE *spider_get_share( if (!share->crd_spider_init) { if ((*error_num = spider_create_spider_object_for_share( - spider->trx, share, &share->crd_spider))) + spider->wide_handler->trx, share, &share->crd_spider))) { pthread_mutex_unlock(&share->mutex); share->init_error = TRUE; @@ -4883,7 +4874,8 @@ SPIDER_SHARE *spider_get_share( sql_command != SQLCOM_DROP_TABLE && sql_command != SQLCOM_ALTER_TABLE && sql_command != SQLCOM_SHOW_CREATE && - (*error_num = spider_create_mon_threads(spider->trx, share)) + (*error_num = spider_create_mon_threads(spider->wide_handler->trx, + share)) ) { share->init_error = TRUE; share->init_error_time = (time_t) time((time_t*) 0); @@ -5054,7 +5046,8 @@ SPIDER_SHARE *spider_get_share( if ( !(spider->conns[roop_count] = spider_get_conn(share, roop_count, spider->conn_keys[roop_count], - spider->trx, spider, FALSE, TRUE, SPIDER_CONN_KIND_MYSQL, + spider->wide_handler->trx, spider, FALSE, TRUE, + SPIDER_CONN_KIND_MYSQL, error_num)) ) { if ( @@ -5062,8 +5055,8 @@ SPIDER_SHARE *spider_get_share( spider->need_mons[roop_count] ) { *error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5162,7 +5155,7 @@ SPIDER_SHARE *spider_get_share( pthread_mutex_lock(&share->sts_mutex); pthread_mutex_lock(&share->crd_mutex); if ((spider_init_error_table = - spider_get_init_error_table(spider->trx, share, FALSE))) + spider_get_init_error_table(spider->wide_handler->trx, share, FALSE))) { DBUG_PRINT("info",("spider diff1=%f", difftime(tmp_time, spider_init_error_table->init_error_time))); @@ -5361,7 +5354,7 @@ SPIDER_SHARE *spider_get_share( first_byte = '0'; spider->share = share; - if (!(spider->trx = spider_get_trx(thd, TRUE, error_num))) + if (!(spider->wide_handler->trx = spider_get_trx(thd, TRUE, error_num))) { spider_free_share(share); goto error_but_no_delete; @@ -5375,7 +5368,7 @@ SPIDER_SHARE *spider_get_share( if (!share->sts_spider_init) { if ((*error_num = spider_create_spider_object_for_share( - spider->trx, share, &share->sts_spider))) + spider->wide_handler->trx, share, &share->sts_spider))) { pthread_mutex_unlock(&share->mutex); spider_free_share(share); @@ -5400,7 +5393,7 @@ SPIDER_SHARE *spider_get_share( if (!share->crd_spider_init) { if ((*error_num = spider_create_spider_object_for_share( - spider->trx, share, &share->crd_spider))) + spider->wide_handler->trx, share, &share->crd_spider))) { pthread_mutex_unlock(&share->mutex); spider_free_share(share); @@ -5425,7 +5418,8 @@ SPIDER_SHARE *spider_get_share( sql_command != SQLCOM_DROP_TABLE && sql_command != SQLCOM_ALTER_TABLE && sql_command != SQLCOM_SHOW_CREATE && - (*error_num = spider_create_mon_threads(spider->trx, share)) + (*error_num = spider_create_mon_threads(spider->wide_handler->trx, + share)) ) { spider_free_share(share); goto error_but_no_delete; @@ -5587,7 +5581,8 @@ SPIDER_SHARE *spider_get_share( if ( !(spider->conns[roop_count] = spider_get_conn(share, roop_count, spider->conn_keys[roop_count], - spider->trx, spider, FALSE, TRUE, SPIDER_CONN_KIND_MYSQL, + spider->wide_handler->trx, spider, FALSE, TRUE, + SPIDER_CONN_KIND_MYSQL, error_num)) ) { if ( @@ -5595,8 +5590,8 @@ SPIDER_SHARE *spider_get_share( spider->need_mons[roop_count] ) { *error_num = spider_ping_table_mon_from_table( - spider->trx, - spider->trx->thd, + spider->wide_handler->trx, + spider->wide_handler->trx->thd, share, roop_count, (uint32) share->monitoring_sid[roop_count], @@ -5687,7 +5682,8 @@ SPIDER_SHARE *spider_get_share( #endif time_t tmp_time = (time_t) time((time_t*) 0); if ((spider_init_error_table = - spider_get_init_error_table(spider->trx, share, FALSE))) + spider_get_init_error_table(spider->wide_handler->trx, share, + FALSE))) { DBUG_PRINT("info",("spider diff2=%f", difftime(tmp_time, spider_init_error_table->init_error_time))); @@ -5797,7 +5793,6 @@ void spider_free_share_resource_only( ) { DBUG_ENTER("spider_free_share_resource_only"); spider_free_share_alloc(share); - thr_lock_delete(&share->lock); pthread_mutex_destroy(&share->crd_mutex); pthread_mutex_destroy(&share->sts_mutex); pthread_mutex_destroy(&share->mutex); @@ -5877,7 +5872,6 @@ int spider_free_share( #else my_hash_delete(&spider_open_tables, (uchar*) share); #endif - thr_lock_delete(&share->lock); pthread_mutex_destroy(&share->crd_mutex); pthread_mutex_destroy(&share->sts_mutex); pthread_mutex_destroy(&share->mutex); @@ -6049,33 +6043,32 @@ void spider_free_lgtm_tblhnd_share_alloc( DBUG_VOID_RETURN; } -#ifdef WITH_PARTITION_STORAGE_ENGINE -SPIDER_PARTITION_SHARE *spider_get_pt_share( +SPIDER_WIDE_SHARE *spider_get_wide_share( SPIDER_SHARE *share, TABLE_SHARE *table_share, int *error_num ) { - SPIDER_PARTITION_SHARE *partition_share; + SPIDER_WIDE_SHARE *wide_share; char *tmp_name; longlong *tmp_cardinality; - DBUG_ENTER("spider_get_pt_share"); + DBUG_ENTER("spider_get_wide_share"); - pthread_mutex_lock(&spider_pt_share_mutex); + pthread_mutex_lock(&spider_wide_share_mutex); #ifdef SPIDER_HAS_HASH_VALUE_TYPE - if (!(partition_share = (SPIDER_PARTITION_SHARE*) + if (!(wide_share = (SPIDER_WIDE_SHARE*) my_hash_search_using_hash_value( - &spider_open_pt_share, share->table_path_hash_value, + &spider_open_wide_share, share->table_path_hash_value, (uchar*) table_share->path.str, table_share->path.length))) #else - if (!(partition_share = (SPIDER_PARTITION_SHARE*) my_hash_search( - &spider_open_pt_share, + if (!(wide_share = (SPIDER_WIDE_SHARE*) my_hash_search( + &spider_open_wide_share, (uchar*) table_share->path.str, table_share->path.length))) #endif { - DBUG_PRINT("info",("spider create new pt share")); - if (!(partition_share = (SPIDER_PARTITION_SHARE *) + DBUG_PRINT("info",("spider create new wide share")); + if (!(wide_share = (SPIDER_WIDE_SHARE *) spider_bulk_malloc(spider_current_trx, 51, MYF(MY_WME | MY_ZEROFILL), - &partition_share, (uint) (sizeof(*partition_share)), + &wide_share, sizeof(SPIDER_WIDE_SHARE), &tmp_name, (uint) (table_share->path.length + 1), &tmp_cardinality, (uint) (sizeof(*tmp_cardinality) * table_share->fields), @@ -6085,24 +6078,24 @@ SPIDER_PARTITION_SHARE *spider_get_pt_share( goto error_alloc_share; } - partition_share->use_count = 0; - partition_share->table_name_length = table_share->path.length; - partition_share->table_name = tmp_name; - memcpy(partition_share->table_name, table_share->path.str, - partition_share->table_name_length); + wide_share->use_count = 0; + wide_share->table_name_length = table_share->path.length; + wide_share->table_name = tmp_name; + memcpy(wide_share->table_name, table_share->path.str, + wide_share->table_name_length); #ifdef SPIDER_HAS_HASH_VALUE_TYPE - partition_share->table_path_hash_value = share->table_path_hash_value; + wide_share->table_path_hash_value = share->table_path_hash_value; #endif - partition_share->cardinality = tmp_cardinality; + wide_share->cardinality = tmp_cardinality; - partition_share->crd_get_time = partition_share->sts_get_time = + wide_share->crd_get_time = wide_share->sts_get_time = share->crd_get_time; #if MYSQL_VERSION_ID < 50500 - if (pthread_mutex_init(&partition_share->sts_mutex, MY_MUTEX_INIT_FAST)) + if (pthread_mutex_init(&wide_share->sts_mutex, MY_MUTEX_INIT_FAST)) #else - if (mysql_mutex_init(spd_key_mutex_pt_share_sts, - &partition_share->sts_mutex, MY_MUTEX_INIT_FAST)) + if (mysql_mutex_init(spd_key_mutex_wide_share_sts, + &wide_share->sts_mutex, MY_MUTEX_INIT_FAST)) #endif { *error_num = HA_ERR_OUT_OF_MEM; @@ -6110,10 +6103,10 @@ SPIDER_PARTITION_SHARE *spider_get_pt_share( } #if MYSQL_VERSION_ID < 50500 - if (pthread_mutex_init(&partition_share->crd_mutex, MY_MUTEX_INIT_FAST)) + if (pthread_mutex_init(&wide_share->crd_mutex, MY_MUTEX_INIT_FAST)) #else - if (mysql_mutex_init(spd_key_mutex_pt_share_crd, - &partition_share->crd_mutex, MY_MUTEX_INIT_FAST)) + if (mysql_mutex_init(spd_key_mutex_wide_share_crd, + &wide_share->crd_mutex, MY_MUTEX_INIT_FAST)) #endif { *error_num = HA_ERR_OUT_OF_MEM; @@ -6121,11 +6114,11 @@ SPIDER_PARTITION_SHARE *spider_get_pt_share( } #if MYSQL_VERSION_ID < 50500 - if (pthread_mutex_init(&partition_share->pt_handler_mutex, + if (pthread_mutex_init(&wide_share->pt_handler_mutex, MY_MUTEX_INIT_FAST)) #else if (mysql_mutex_init(spd_key_mutex_pt_handler, - &partition_share->pt_handler_mutex, MY_MUTEX_INIT_FAST)) + &wide_share->pt_handler_mutex, MY_MUTEX_INIT_FAST)) #endif { *error_num = HA_ERR_OUT_OF_MEM; @@ -6133,130 +6126,133 @@ SPIDER_PARTITION_SHARE *spider_get_pt_share( } if( - my_hash_init(PSI_INSTRUMENT_ME, &partition_share->pt_handler_hash, spd_charset_utf8mb3_bin, + my_hash_init(PSI_INSTRUMENT_ME, &wide_share->pt_handler_hash, spd_charset_utf8mb3_bin, 32, 0, 0, (my_hash_get_key) spider_pt_handler_share_get_key, 0, 0) ) { *error_num = HA_ERR_OUT_OF_MEM; goto error_init_pt_handler_hash; } - spider_alloc_calc_mem_init(partition_share->pt_handler_hash, 142); + + thr_lock_init(&wide_share->lock); + + spider_alloc_calc_mem_init(wide_share->pt_handler_hash, 142); spider_alloc_calc_mem(spider_current_trx, - partition_share->pt_handler_hash, - partition_share->pt_handler_hash.array.max_element * - partition_share->pt_handler_hash.array.size_of_element); + wide_share->pt_handler_hash, + wide_share->pt_handler_hash.array.max_element * + wide_share->pt_handler_hash.array.size_of_element); - uint old_elements = spider_open_pt_share.array.max_element; + uint old_elements = spider_open_wide_share.array.max_element; #ifdef HASH_UPDATE_WITH_HASH_VALUE - if (my_hash_insert_with_hash_value(&spider_open_pt_share, + if (my_hash_insert_with_hash_value(&spider_open_wide_share, share->table_path_hash_value, - (uchar*) partition_share)) + (uchar*) wide_share)) #else - if (my_hash_insert(&spider_open_pt_share, (uchar*) partition_share)) + if (my_hash_insert(&spider_open_wide_share, (uchar*) wide_share)) #endif { *error_num = HA_ERR_OUT_OF_MEM; goto error_hash_insert; } - if (spider_open_pt_share.array.max_element > old_elements) + if (spider_open_wide_share.array.max_element > old_elements) { spider_alloc_calc_mem(spider_current_trx, - spider_open_pt_share, - (spider_open_pt_share.array.max_element - old_elements) * - spider_open_pt_share.array.size_of_element); + spider_open_wide_share, + (spider_open_wide_share.array.max_element - old_elements) * + spider_open_wide_share.array.size_of_element); } } - partition_share->use_count++; - pthread_mutex_unlock(&spider_pt_share_mutex); + wide_share->use_count++; + pthread_mutex_unlock(&spider_wide_share_mutex); - DBUG_PRINT("info",("spider partition_share=%p", partition_share)); - DBUG_RETURN(partition_share); + DBUG_PRINT("info",("spider wide_share=%p", wide_share)); + DBUG_RETURN(wide_share); error_hash_insert: spider_free_mem_calc(spider_current_trx, - partition_share->pt_handler_hash_id, - partition_share->pt_handler_hash.array.max_element * - partition_share->pt_handler_hash.array.size_of_element); - my_hash_free(&partition_share->pt_handler_hash); + wide_share->pt_handler_hash_id, + wide_share->pt_handler_hash.array.max_element * + wide_share->pt_handler_hash.array.size_of_element); + my_hash_free(&wide_share->pt_handler_hash); error_init_pt_handler_hash: - pthread_mutex_destroy(&partition_share->pt_handler_mutex); + pthread_mutex_destroy(&wide_share->pt_handler_mutex); error_init_pt_handler_mutex: - pthread_mutex_destroy(&partition_share->crd_mutex); + pthread_mutex_destroy(&wide_share->crd_mutex); error_init_crd_mutex: - pthread_mutex_destroy(&partition_share->sts_mutex); + pthread_mutex_destroy(&wide_share->sts_mutex); error_init_sts_mutex: - spider_free(spider_current_trx, partition_share, MYF(0)); + spider_free(spider_current_trx, wide_share, MYF(0)); error_alloc_share: - pthread_mutex_unlock(&spider_pt_share_mutex); + pthread_mutex_unlock(&spider_wide_share_mutex); DBUG_RETURN(NULL); } -int spider_free_pt_share( - SPIDER_PARTITION_SHARE *partition_share +int spider_free_wide_share( + SPIDER_WIDE_SHARE *wide_share ) { - DBUG_ENTER("spider_free_pt_share"); - pthread_mutex_lock(&spider_pt_share_mutex); - if (!--partition_share->use_count) + DBUG_ENTER("spider_free_wide_share"); + pthread_mutex_lock(&spider_wide_share_mutex); + if (!--wide_share->use_count) { + thr_lock_delete(&wide_share->lock); #ifdef HASH_UPDATE_WITH_HASH_VALUE - my_hash_delete_with_hash_value(&spider_open_pt_share, - partition_share->table_path_hash_value, (uchar*) partition_share); + my_hash_delete_with_hash_value(&spider_open_wide_share, + wide_share->table_path_hash_value, (uchar*) wide_share); #else - my_hash_delete(&spider_open_pt_share, (uchar*) partition_share); + my_hash_delete(&spider_open_wide_share, (uchar*) wide_share); #endif spider_free_mem_calc(spider_current_trx, - partition_share->pt_handler_hash_id, - partition_share->pt_handler_hash.array.max_element * - partition_share->pt_handler_hash.array.size_of_element); - my_hash_free(&partition_share->pt_handler_hash); - pthread_mutex_destroy(&partition_share->pt_handler_mutex); - pthread_mutex_destroy(&partition_share->crd_mutex); - pthread_mutex_destroy(&partition_share->sts_mutex); - spider_free(spider_current_trx, partition_share, MYF(0)); - } - pthread_mutex_unlock(&spider_pt_share_mutex); + wide_share->pt_handler_hash_id, + wide_share->pt_handler_hash.array.max_element * + wide_share->pt_handler_hash.array.size_of_element); + my_hash_free(&wide_share->pt_handler_hash); + pthread_mutex_destroy(&wide_share->pt_handler_mutex); + pthread_mutex_destroy(&wide_share->crd_mutex); + pthread_mutex_destroy(&wide_share->sts_mutex); + spider_free(spider_current_trx, wide_share, MYF(0)); + } + pthread_mutex_unlock(&spider_wide_share_mutex); DBUG_RETURN(0); } -void spider_copy_sts_to_pt_share( - SPIDER_PARTITION_SHARE *partition_share, +void spider_copy_sts_to_wide_share( + SPIDER_WIDE_SHARE *wide_share, SPIDER_SHARE *share ) { DBUG_ENTER("spider_copy_sts_to_pt_share"); - partition_share->stat = share->stat; + wide_share->stat = share->stat; DBUG_VOID_RETURN; } void spider_copy_sts_to_share( SPIDER_SHARE *share, - SPIDER_PARTITION_SHARE *partition_share + SPIDER_WIDE_SHARE *wide_share ) { DBUG_ENTER("spider_copy_sts_to_share"); - share->stat = partition_share->stat; + share->stat = wide_share->stat; DBUG_VOID_RETURN; } -void spider_copy_crd_to_pt_share( - SPIDER_PARTITION_SHARE *partition_share, +void spider_copy_crd_to_wide_share( + SPIDER_WIDE_SHARE *wide_share, SPIDER_SHARE *share, int fields ) { - DBUG_ENTER("spider_copy_crd_to_pt_share"); - memcpy(partition_share->cardinality, share->cardinality, + DBUG_ENTER("spider_copy_crd_to_wide_share"); + memcpy(wide_share->cardinality, share->cardinality, sizeof(longlong) * fields); DBUG_VOID_RETURN; } void spider_copy_crd_to_share( SPIDER_SHARE *share, - SPIDER_PARTITION_SHARE *partition_share, + SPIDER_WIDE_SHARE *wide_share, int fields ) { DBUG_ENTER("spider_copy_crd_to_share"); - memcpy(share->cardinality, partition_share->cardinality, + memcpy(share->cardinality, wide_share->cardinality, sizeof(longlong) * fields); DBUG_VOID_RETURN; } -#endif int spider_open_all_tables( SPIDER_TRX *trx, @@ -6420,7 +6416,7 @@ int spider_open_all_tables( free_root(&mem_root, MYF(0)); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - spider->lock_type = TL_READ_NO_INSERT; + spider->wide_handler->lock_type = TL_READ_NO_INSERT; if (!(share = (SPIDER_SHARE *) spider_bulk_malloc(spider_current_trx, 52, MYF(MY_WME | MY_ZEROFILL), @@ -6458,7 +6454,7 @@ int spider_open_all_tables( memcpy(longlong_info, &tmp_longlong, sizeof(longlong) * SPIDER_TMP_SHARE_LONGLONG_COUNT); spider->share = share; - spider->trx = trx; + spider->wide_handler->trx = trx; spider->conns = conns; spider->need_mons = need_mon; spider->conn_link_idx[0] = 0; @@ -6831,10 +6827,10 @@ int spider_db_done( my_hash_free(&spider_lgtm_tblhnd_share_hash); #ifdef WITH_PARTITION_STORAGE_ENGINE spider_free_mem_calc(spider_current_trx, - spider_open_pt_share_id, - spider_open_pt_share.array.max_element * - spider_open_pt_share.array.size_of_element); - my_hash_free(&spider_open_pt_share); + spider_open_wide_share_id, + spider_open_wide_share.array.max_element * + spider_open_wide_share.array.size_of_element); + my_hash_free(&spider_open_wide_share); #endif pthread_mutex_lock(&spider_init_error_tbl_mutex); while ((spider_init_error_table = (SPIDER_INIT_ERROR_TABLE*) @@ -6872,7 +6868,7 @@ int spider_db_done( pthread_mutex_destroy(&spider_conn_mutex); pthread_mutex_destroy(&spider_lgtm_tblhnd_share_mutex); #ifdef WITH_PARTITION_STORAGE_ENGINE - pthread_mutex_destroy(&spider_pt_share_mutex); + pthread_mutex_destroy(&spider_wide_share_mutex); #endif pthread_mutex_destroy(&spider_init_error_tbl_mutex); pthread_mutex_destroy(&spider_conn_id_mutex); @@ -7048,12 +7044,12 @@ int spider_db_init( #ifdef WITH_PARTITION_STORAGE_ENGINE #if MYSQL_VERSION_ID < 50500 - if (pthread_mutex_init(&spider_pt_share_mutex, MY_MUTEX_INIT_FAST)) + if (pthread_mutex_init(&spider_wide_share_mutex, MY_MUTEX_INIT_FAST)) #else - if (mysql_mutex_init(spd_key_mutex_pt_share, - &spider_pt_share_mutex, MY_MUTEX_INIT_FAST)) + if (mysql_mutex_init(spd_key_mutex_wide_share, + &spider_wide_share_mutex, MY_MUTEX_INIT_FAST)) #endif - goto error_pt_share_mutex_init; + goto error_wide_share_mutex_init; #endif #if MYSQL_VERSION_ID < 50500 @@ -7141,15 +7137,17 @@ int spider_db_init( spider_init_error_tables.array.max_element * spider_init_error_tables.array.size_of_element); #ifdef WITH_PARTITION_STORAGE_ENGINE - if (my_hash_init(PSI_INSTRUMENT_ME, &spider_open_pt_share, spd_charset_utf8mb3_bin, 32, 0, 0, - (my_hash_get_key) spider_pt_share_get_key, 0, 0)) - goto error_open_pt_share_hash_init; + if( + my_hash_init(PSI_INSTRUMENT_ME, &spider_open_wide_share, spd_charset_utf8mb3_bin, 32, 0, 0, + (my_hash_get_key) spider_wide_share_get_key, 0, 0) + ) + goto error_open_wide_share_hash_init; - spider_alloc_calc_mem_init(spider_open_pt_share, 145); + spider_alloc_calc_mem_init(spider_open_wide_share, 145); spider_alloc_calc_mem(NULL, - spider_open_pt_share, - spider_open_pt_share.array.max_element * - spider_open_pt_share.array.size_of_element); + spider_open_wide_share, + spider_open_wide_share.array.max_element * + spider_open_wide_share.array.size_of_element); #endif if (my_hash_init(PSI_INSTRUMENT_ME, &spider_lgtm_tblhnd_share_hash, spd_charset_utf8mb3_bin, 32, 0, 0, @@ -7417,11 +7415,11 @@ error_open_connections_hash_init: error_lgtm_tblhnd_share_hash_init: #ifdef WITH_PARTITION_STORAGE_ENGINE spider_free_mem_calc(NULL, - spider_open_pt_share_id, - spider_open_pt_share.array.max_element * - spider_open_pt_share.array.size_of_element); - my_hash_free(&spider_open_pt_share); -error_open_pt_share_hash_init: + spider_open_wide_share_id, + spider_open_wide_share.array.max_element * + spider_open_wide_share.array.size_of_element); + my_hash_free(&spider_open_wide_share); +error_open_wide_share_hash_init: #endif spider_free_mem_calc(NULL, spider_init_error_tables_id, @@ -7454,8 +7452,8 @@ error_conn_mutex_init: pthread_mutex_destroy(&spider_lgtm_tblhnd_share_mutex); error_lgtm_tblhnd_share_mutex_init: #ifdef WITH_PARTITION_STORAGE_ENGINE - pthread_mutex_destroy(&spider_pt_share_mutex); -error_pt_share_mutex_init: + pthread_mutex_destroy(&spider_wide_share_mutex); +error_wide_share_mutex_init: #endif pthread_mutex_destroy(&spider_init_error_tbl_mutex); error_init_error_tbl_mutex_init: @@ -7633,26 +7631,26 @@ int spider_get_sts( /* get */ get_type = 1; } else if ( - !share->partition_share->sts_init + !share->wide_share->sts_init ) { - pthread_mutex_lock(&share->partition_share->sts_mutex); - if (!share->partition_share->sts_init) + pthread_mutex_lock(&share->wide_share->sts_mutex); + if (!share->wide_share->sts_init) { /* get after mutex_lock */ get_type = 2; } else { - pthread_mutex_unlock(&share->partition_share->sts_mutex); + pthread_mutex_unlock(&share->wide_share->sts_mutex); /* copy */ get_type = 0; } } else if ( - difftime(share->sts_get_time, share->partition_share->sts_get_time) < + difftime(share->sts_get_time, share->wide_share->sts_get_time) < sts_interval ) { /* copy */ get_type = 0; } else if ( - !pthread_mutex_trylock(&share->partition_share->sts_mutex) + !pthread_mutex_trylock(&share->wide_share->sts_mutex) ) { /* get after mutex_trylock */ get_type = 3; @@ -7684,7 +7682,7 @@ int spider_get_sts( { #ifdef WITH_PARTITION_STORAGE_ENGINE if (get_type == 0) - spider_copy_sts_to_share(share, share->partition_share); + spider_copy_sts_to_share(share, share->wide_share); else { #endif error_num = spider_db_show_table_status(spider, link_idx, sts_mode, flag); @@ -7694,7 +7692,7 @@ int spider_get_sts( } #ifdef WITH_PARTITION_STORAGE_ENGINE if (get_type >= 2) - pthread_mutex_unlock(&share->partition_share->sts_mutex); + pthread_mutex_unlock(&share->wide_share->sts_mutex); #endif if (error_num) { @@ -7702,7 +7700,7 @@ int spider_get_sts( SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share = spider->partition_handler_share; if ( - !share->partition_share->sts_init && + !share->wide_share->sts_init && sts_sync >= sts_sync_level && get_type > 1 && partition_handler_share && @@ -7715,9 +7713,9 @@ int spider_get_sts( double tmp_sts_interval; int tmp_sts_mode; int tmp_sts_sync; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; for (roop_count = 1; - roop_count < (int) partition_handler_share->use_count; + roop_count < (int) partition_handler_share->no_parts; roop_count++) { tmp_spider = @@ -7729,12 +7727,12 @@ int spider_get_sts( spider_get_sts(tmp_share, tmp_spider->search_link_idx, tmp_time, tmp_spider, tmp_sts_interval, tmp_sts_mode, tmp_sts_sync, 1, flag); - if (share->partition_share->sts_init) + if (share->wide_share->sts_init) { error_num = 0; thd->clear_error(); get_type = 0; - spider_copy_sts_to_share(share, share->partition_share); + spider_copy_sts_to_share(share, share->wide_share); break; } } @@ -7746,9 +7744,9 @@ int spider_get_sts( #ifdef WITH_PARTITION_STORAGE_ENGINE if (sts_sync >= sts_sync_level && get_type > 0) { - spider_copy_sts_to_pt_share(share->partition_share, share); - share->partition_share->sts_get_time = tmp_time; - share->partition_share->sts_init = TRUE; + spider_copy_sts_to_wide_share(share->wide_share, share); + share->wide_share->sts_get_time = tmp_time; + share->wide_share->sts_init = TRUE; } #endif share->sts_get_time = tmp_time; @@ -7781,26 +7779,26 @@ int spider_get_crd( /* get */ get_type = 1; } else if ( - !share->partition_share->crd_init + !share->wide_share->crd_init ) { - pthread_mutex_lock(&share->partition_share->crd_mutex); - if (!share->partition_share->crd_init) + pthread_mutex_lock(&share->wide_share->crd_mutex); + if (!share->wide_share->crd_init) { /* get after mutex_lock */ get_type = 2; } else { - pthread_mutex_unlock(&share->partition_share->crd_mutex); + pthread_mutex_unlock(&share->wide_share->crd_mutex); /* copy */ get_type = 0; } } else if ( - difftime(share->crd_get_time, share->partition_share->crd_get_time) < + difftime(share->crd_get_time, share->wide_share->crd_get_time) < crd_interval ) { /* copy */ get_type = 0; } else if ( - !pthread_mutex_trylock(&share->partition_share->crd_mutex) + !pthread_mutex_trylock(&share->wide_share->crd_mutex) ) { /* get after mutex_trylock */ get_type = 3; @@ -7832,7 +7830,7 @@ int spider_get_crd( { #ifdef WITH_PARTITION_STORAGE_ENGINE if (get_type == 0) - spider_copy_crd_to_share(share, share->partition_share, + spider_copy_crd_to_share(share, share->wide_share, table->s->fields); else { #endif @@ -7843,7 +7841,7 @@ int spider_get_crd( } #ifdef WITH_PARTITION_STORAGE_ENGINE if (get_type >= 2) - pthread_mutex_unlock(&share->partition_share->crd_mutex); + pthread_mutex_unlock(&share->wide_share->crd_mutex); #endif if (error_num) { @@ -7851,7 +7849,7 @@ int spider_get_crd( SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share = spider->partition_handler_share; if ( - !share->partition_share->crd_init && + !share->wide_share->crd_init && crd_sync >= crd_sync_level && get_type > 1 && partition_handler_share && @@ -7864,9 +7862,9 @@ int spider_get_crd( double tmp_crd_interval; int tmp_crd_mode; int tmp_crd_sync; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; for (roop_count = 1; - roop_count < (int) partition_handler_share->use_count; + roop_count < (int) partition_handler_share->no_parts; roop_count++) { tmp_spider = @@ -7878,12 +7876,12 @@ int spider_get_crd( spider_get_crd(tmp_share, tmp_spider->search_link_idx, tmp_time, tmp_spider, table, tmp_crd_interval, tmp_crd_mode, tmp_crd_sync, 1); - if (share->partition_share->crd_init) + if (share->wide_share->crd_init) { error_num = 0; thd->clear_error(); get_type = 0; - spider_copy_crd_to_share(share, share->partition_share, + spider_copy_crd_to_share(share, share->wide_share, table->s->fields); break; } @@ -7896,10 +7894,10 @@ int spider_get_crd( #ifdef WITH_PARTITION_STORAGE_ENGINE if (crd_sync >= crd_sync_level && get_type > 0) { - spider_copy_crd_to_pt_share(share->partition_share, share, + spider_copy_crd_to_wide_share(share->wide_share, share, table->s->fields); - share->partition_share->crd_get_time = tmp_time; - share->partition_share->crd_init = TRUE; + share->wide_share->crd_get_time = tmp_time; + share->wide_share->crd_init = TRUE; } #endif share->crd_get_time = tmp_time; @@ -7912,14 +7910,14 @@ void spider_set_result_list_param( ) { SPIDER_RESULT_LIST *result_list = &spider->result_list; SPIDER_SHARE *share = spider->share; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; DBUG_ENTER("spider_set_result_list_param"); result_list->internal_offset = spider_param_internal_offset(thd, share->internal_offset); result_list->internal_limit = #ifdef INFO_KIND_FORCE_LIMIT_BEGIN - spider->info_limit < 9223372036854775807LL ? - spider->info_limit : + spider->wide_handler->info_limit < 9223372036854775807LL ? + spider->wide_handler->info_limit : #endif spider_param_internal_limit(thd, share->internal_limit); result_list->split_read = spider_split_read_param(spider); @@ -8465,7 +8463,7 @@ longlong spider_split_read_param( ) { SPIDER_SHARE *share = spider->share; SPIDER_RESULT_LIST *result_list = &spider->result_list; - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; st_select_lex *select_lex; longlong select_limit; longlong offset_limit; @@ -8474,10 +8472,11 @@ longlong spider_split_read_param( DBUG_ENTER("spider_split_read_param"); result_list->set_split_read_count = 1; #ifdef INFO_KIND_FORCE_LIMIT_BEGIN - if (spider->info_limit < 9223372036854775807LL) + if (spider->wide_handler->info_limit < 9223372036854775807LL) { - DBUG_PRINT("info",("spider info_limit=%lld", spider->info_limit)); - longlong info_limit = spider->info_limit; + DBUG_PRINT("info",("spider info_limit=%lld", + spider->wide_handler->info_limit)); + longlong info_limit = spider->wide_handler->info_limit; result_list->split_read_base = info_limit; result_list->semi_split_read = 0; result_list->first_read = info_limit; @@ -8497,7 +8496,8 @@ longlong spider_split_read_param( { int bulk_update_mode = spider_param_bulk_update_mode(thd, share->bulk_update_mode); - DBUG_PRINT("info",("spider sql_command=%u", spider->sql_command)); + DBUG_PRINT("info",("spider sql_command=%u", + spider->wide_handler->sql_command)); DBUG_PRINT("info",("spider bulk_update_mode=%d", bulk_update_mode)); DBUG_PRINT("info",("spider support_bulk_update_sql=%s", spider->support_bulk_update_sql() ? "TRUE" : "FALSE")); @@ -8505,32 +8505,32 @@ longlong spider_split_read_param( bool inserting = ( #ifdef HS_HAS_SQLCOM - spider->sql_command == SQLCOM_HS_INSERT || + spider->wide_handler->sql_command == SQLCOM_HS_INSERT || #endif - spider->sql_command == SQLCOM_INSERT || - spider->sql_command == SQLCOM_INSERT_SELECT + spider->wide_handler->sql_command == SQLCOM_INSERT || + spider->wide_handler->sql_command == SQLCOM_INSERT_SELECT ); #endif bool updating = ( #ifdef HS_HAS_SQLCOM - spider->sql_command == SQLCOM_HS_UPDATE || + spider->wide_handler->sql_command == SQLCOM_HS_UPDATE || #endif - spider->sql_command == SQLCOM_UPDATE || - spider->sql_command == SQLCOM_UPDATE_MULTI + spider->wide_handler->sql_command == SQLCOM_UPDATE || + spider->wide_handler->sql_command == SQLCOM_UPDATE_MULTI ); bool deleting = ( #ifdef HS_HAS_SQLCOM - spider->sql_command == SQLCOM_HS_DELETE || + spider->wide_handler->sql_command == SQLCOM_HS_DELETE || #endif - spider->sql_command == SQLCOM_DELETE || - spider->sql_command == SQLCOM_DELETE_MULTI + spider->wide_handler->sql_command == SQLCOM_DELETE || + spider->wide_handler->sql_command == SQLCOM_DELETE_MULTI ); bool replacing = ( - spider->sql_command == SQLCOM_REPLACE || - spider->sql_command == SQLCOM_REPLACE_SELECT + spider->wide_handler->sql_command == SQLCOM_REPLACE || + spider->wide_handler->sql_command == SQLCOM_REPLACE_SELECT ); DBUG_PRINT("info",("spider updating=%s", updating ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider deleting=%s", deleting ? "TRUE" : "FALSE")); @@ -8716,7 +8716,7 @@ void spider_next_split_read_param( bool spider_check_direct_order_limit( ha_spider *spider ) { - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; st_select_lex *select_lex; longlong select_limit; @@ -8729,7 +8729,7 @@ bool spider_check_direct_order_limit( spider->use_index_merge = TRUE; } DBUG_PRINT("info",("spider SQLCOM_HA_READ=%s", - (spider->sql_command == SQLCOM_HA_READ) ? "TRUE" : "FALSE")); + (spider->wide_handler->sql_command == SQLCOM_HA_READ) ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider sql_kinds with SPIDER_SQL_KIND_HANDLER=%s", (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER) ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider use_index_merge=%s", @@ -8741,7 +8741,7 @@ bool spider_check_direct_order_limit( spider->is_bulk_access_clone ? "TRUE" : "FALSE")); #endif if ( - spider->sql_command != SQLCOM_HA_READ && + spider->wide_handler->sql_command != SQLCOM_HA_READ && !spider->use_index_merge && #ifdef HA_CAN_BULK_ACCESS (!spider->is_clone || spider->is_bulk_access_clone) @@ -8899,7 +8899,7 @@ bool spider_check_direct_order_limit( DBUG_PRINT("info",("spider TRUE")); spider->result_list.internal_limit = select_limit + offset_limit; spider->result_list.split_read = select_limit + offset_limit; - spider->trx->direct_order_limit_count++; + spider->wide_handler->trx->direct_order_limit_count++; DBUG_RETURN(TRUE); } } @@ -9003,7 +9003,7 @@ int spider_set_direct_limit_offset( ha_spider *spider ) { #ifndef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON - THD *thd = spider->trx->thd; + THD *thd = spider->wide_handler->trx->thd; #endif st_select_lex *select_lex; longlong select_limit; @@ -9015,10 +9015,11 @@ int spider_set_direct_limit_offset( DBUG_RETURN(TRUE); if ( - spider->pt_handler_share_creator && - spider->pt_handler_share_creator != spider + spider->partition_handler_share && + !spider->pt_handler_share_owner ) { - if (spider->pt_handler_share_creator->result_list.direct_limit_offset == TRUE) + if (spider->partition_handler_share->owner-> + result_list.direct_limit_offset == TRUE) { spider->result_list.direct_limit_offset = TRUE; DBUG_RETURN(TRUE); @@ -9028,7 +9029,7 @@ int spider_set_direct_limit_offset( } if ( - spider->sql_command != SQLCOM_SELECT || + spider->wide_handler->sql_command != SQLCOM_SELECT || #ifdef HANDLER_HAS_DIRECT_AGGREGATE spider->result_list.direct_aggregate || #endif @@ -9071,7 +9072,8 @@ int spider_set_direct_limit_offset( OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN) || #endif #endif - spider->condition // conditions is null may be no where condition in rand_init + // conditions is null may be no where condition in rand_init + spider->wide_handler->condition ) DBUG_RETURN(FALSE); @@ -9626,6 +9628,7 @@ int spider_create_spider_object_for_share( char **hs_w_conn_keys; #endif spider_db_handler **dbton_hdl; + SPIDER_WIDE_HANDLER *wide_handler; DBUG_ENTER("spider_create_spider_object_for_share"); DBUG_PRINT("info",("spider trx=%p", trx)); DBUG_PRINT("info",("spider share=%p", share)); @@ -9655,6 +9658,7 @@ int spider_create_spider_object_for_share( &hs_r_conn_keys, (uint) (sizeof(char *) * share->link_count), &hs_w_conn_keys, (uint) (sizeof(char *) * share->link_count), &dbton_hdl, (uint) (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE), + &wide_handler, (uint) sizeof(SPIDER_WIDE_HANDLER), NullS)) ) #else @@ -9666,6 +9670,7 @@ int spider_create_spider_object_for_share( &conn_can_fo, (uint) (sizeof(uchar) * share->link_bitmap_size), &conn_keys, (uint) (sizeof(char *) * share->link_count), &dbton_hdl, (uint) (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE), + &wide_handler, (uint) sizeof(SPIDER_WIDE_HANDLER), NullS)) ) #endif @@ -9674,7 +9679,8 @@ int spider_create_spider_object_for_share( goto error_need_mons_alloc; } DBUG_PRINT("info",("spider need_mons=%p", need_mons)); - (*spider)->trx = trx; + (*spider)->wide_handler = wide_handler; + wide_handler->trx = trx; (*spider)->change_table_ptr(&share->table, share->table_share); (*spider)->share = share; (*spider)->conns = conns; @@ -10052,7 +10058,7 @@ void *spider_table_bg_sts_action( conns = spider->conns; if (spider->search_link_idx < 0) { - spider->trx = trx; + spider->wide_handler->trx = trx; spider_trx_set_link_idx_for_all(spider); spider->search_link_idx = spider_conn_first_link_idx(thd, share->link_statuses, share->access_balances, spider->conn_link_idx, @@ -10205,7 +10211,7 @@ void *spider_table_bg_crd_action( conns = spider->conns; if (spider->search_link_idx < 0) { - spider->trx = trx; + spider->wide_handler->trx = trx; spider_trx_set_link_idx_for_all(spider); spider->search_link_idx = spider_conn_first_link_idx(thd, share->link_statuses, share->access_balances, spider->conn_link_idx, diff --git a/storage/spider/spd_table.h b/storage/spider/spd_table.h index baeec2a9a3b..c4e3de32372 100644 --- a/storage/spider/spd_table.h +++ b/storage/spider/spd_table.h @@ -224,13 +224,13 @@ uchar *spider_tbl_get_key( my_bool not_used __attribute__ ((unused)) ); -#ifdef WITH_PARTITION_STORAGE_ENGINE -uchar *spider_pt_share_get_key( - SPIDER_PARTITION_SHARE *share, +uchar *spider_wide_share_get_key( + SPIDER_WIDE_SHARE *share, size_t *length, my_bool not_used __attribute__ ((unused)) ); +#ifdef WITH_PARTITION_STORAGE_ENGINE uchar *spider_pt_handler_share_get_key( SPIDER_PARTITION_HANDLER_SHARE *share, size_t *length, @@ -420,39 +420,37 @@ void spider_update_link_status_for_share( long link_status ); -#ifdef WITH_PARTITION_STORAGE_ENGINE -SPIDER_PARTITION_SHARE *spider_get_pt_share( +SPIDER_WIDE_SHARE *spider_get_wide_share( SPIDER_SHARE *share, TABLE_SHARE *table_share, int *error_num ); -int spider_free_pt_share( - SPIDER_PARTITION_SHARE *partition_share +int spider_free_wide_share( + SPIDER_WIDE_SHARE *wide_share ); -void spider_copy_sts_to_pt_share( - SPIDER_PARTITION_SHARE *partition_share, +void spider_copy_sts_to_wide_share( + SPIDER_WIDE_SHARE *wide_share, SPIDER_SHARE *share ); void spider_copy_sts_to_share( SPIDER_SHARE *share, - SPIDER_PARTITION_SHARE *partition_share + SPIDER_WIDE_SHARE *wide_share ); -void spider_copy_crd_to_pt_share( - SPIDER_PARTITION_SHARE *partition_share, +void spider_copy_crd_to_wide_share( + SPIDER_WIDE_SHARE *wide_share, SPIDER_SHARE *share, int fields ); void spider_copy_crd_to_share( SPIDER_SHARE *share, - SPIDER_PARTITION_SHARE *partition_share, + SPIDER_WIDE_SHARE *wide_share, int fields ); -#endif int spider_open_all_tables( SPIDER_TRX *trx, diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc index 0e6d81e28f1..a339b5bebcb 100644 --- a/storage/spider/spd_trx.cc +++ b/storage/spider/spd_trx.cc @@ -247,6 +247,7 @@ int spider_trx_another_lock_tables( SPIDER_CONN *conn; ha_spider tmp_spider; SPIDER_SHARE tmp_share; + SPIDER_WIDE_HANDLER tmp_wide_handler; char sql_buf[MAX_FIELD_WIDTH]; spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info); DBUG_ENTER("spider_trx_another_lock_tables"); @@ -255,13 +256,11 @@ int spider_trx_another_lock_tables( sql_str.length(0); memset((void*)&tmp_spider, 0, sizeof(ha_spider)); memset((void*)&tmp_share, 0, sizeof(SPIDER_SHARE)); + memset((void*)&tmp_wide_handler, 0, sizeof(SPIDER_WIDE_HANDLER)); tmp_spider.share = &tmp_share; - tmp_spider.trx = trx; + tmp_spider.wide_handler = &tmp_wide_handler; + tmp_wide_handler.trx = trx; tmp_share.access_charset = system_charset_info; -/* - if ((error_num = spider_db_append_set_names(&tmp_share))) - DBUG_RETURN(error_num); -*/ tmp_spider.conns = &conn; tmp_spider.result_list.sqls = &sql_str; tmp_spider.need_mons = &need_mon; @@ -273,17 +272,11 @@ int spider_trx_another_lock_tables( SPIDER_CONN_RESTORE_DASTATUS_AND_RESET_ERROR_NUM; if (error_num) { -/* - spider_db_free_set_names(&tmp_share); -*/ DBUG_RETURN(error_num); } } roop_count++; } -/* - spider_db_free_set_names(&tmp_share); -*/ DBUG_RETURN(0); } @@ -387,10 +380,13 @@ int spider_trx_all_start_trx( THD *thd = trx->thd; SPIDER_CONN *conn; ha_spider tmp_spider; + SPIDER_WIDE_HANDLER tmp_wide_handler; DBUG_ENTER("spider_trx_all_start_trx"); SPIDER_BACKUP_DASTATUS; memset((void*)&tmp_spider, 0, sizeof(ha_spider)); - tmp_spider.trx = trx; + memset(&tmp_wide_handler, 0, sizeof(SPIDER_WIDE_HANDLER)); + tmp_spider.wide_handler = &tmp_wide_handler; + tmp_wide_handler.trx = trx; tmp_spider.need_mons = &need_mon; while ((conn = (SPIDER_CONN*) my_hash_element(&trx->trx_conn_hash, roop_count))) @@ -398,7 +394,8 @@ int spider_trx_all_start_trx( if ( (spider_param_sync_trx_isolation(trx->thd) && (error_num = spider_check_and_set_trx_isolation(conn, &need_mon))) || - (error_num = spider_internal_start_trx(&tmp_spider, conn, 0)) + (error_num = spider_internal_start_trx_for_connection(&tmp_spider, + conn, 0)) ) { SPIDER_CONN_RESTORE_DASTATUS_AND_RESET_ERROR_NUM; if (error_num) @@ -418,6 +415,7 @@ int spider_trx_all_flush_logs( SPIDER_CONN *conn; ha_spider tmp_spider; SPIDER_SHARE tmp_share; + SPIDER_WIDE_HANDLER tmp_wide_handler; long tmp_link_statuses = SPIDER_LINK_STATUS_OK; uint conn_link_idx = 0; long net_read_timeout = 600; @@ -425,6 +423,7 @@ int spider_trx_all_flush_logs( DBUG_ENTER("spider_trx_all_flush_logs"); SPIDER_BACKUP_DASTATUS; memset((void*)&tmp_spider, 0, sizeof(ha_spider)); + memset(&tmp_wide_handler, 0, sizeof(SPIDER_WIDE_HANDLER)); tmp_share.link_count = 1; tmp_share.all_link_count = 1; tmp_share.link_statuses = &tmp_link_statuses; @@ -437,7 +436,8 @@ int spider_trx_all_flush_logs( tmp_spider.conns = &conn; tmp_spider.need_mons = &need_mon; tmp_spider.conn_link_idx = &conn_link_idx; - tmp_spider.trx = trx; + tmp_spider.wide_handler = &tmp_wide_handler; + tmp_wide_handler.trx = trx; while ((conn = (SPIDER_CONN*) my_hash_element(&trx->trx_conn_hash, roop_count))) { @@ -1200,6 +1200,7 @@ SPIDER_TRX *spider_get_trx( int roop_count = 0, roop_count2; SPIDER_TRX *trx; SPIDER_SHARE *tmp_share; + SPIDER_WIDE_HANDLER *tmp_wide_handler; pthread_mutex_t *udf_table_mutexes; DBUG_ENTER("spider_get_trx"); @@ -1212,6 +1213,7 @@ SPIDER_TRX *spider_get_trx( spider_bulk_malloc(NULL, 56, MYF(MY_WME | MY_ZEROFILL), &trx, (uint) (sizeof(*trx)), &tmp_share, (uint) (sizeof(SPIDER_SHARE)), + &tmp_wide_handler, (uint) sizeof(SPIDER_WIDE_HANDLER), &udf_table_mutexes, (uint) (sizeof(pthread_mutex_t) * spider_param_udf_table_lock_mutex_count()), NullS)) @@ -1387,7 +1389,8 @@ SPIDER_TRX *spider_get_trx( } trx->tmp_spider->need_mons = &trx->tmp_need_mon; trx->tmp_spider->share = trx->tmp_share; - trx->tmp_spider->trx = trx; + trx->tmp_spider->wide_handler = tmp_wide_handler; + tmp_wide_handler->trx = trx; trx->tmp_spider->dbton_handler = trx->tmp_dbton_handler; if (!(trx->tmp_spider->result_list.sqls = new spider_string[trx->tmp_share->link_count])) @@ -1875,27 +1878,14 @@ int spider_start_internal_consistent_snapshot( } int spider_internal_start_trx( - ha_spider *spider, - SPIDER_CONN *conn, - int link_idx + ha_spider *spider ) { int error_num; - SPIDER_TRX *trx = spider->trx; + SPIDER_TRX *trx = spider->wide_handler->trx; THD *thd = trx->thd; - bool sync_autocommit = spider_param_sync_autocommit(thd); - double ping_interval_at_trx_start = - spider_param_ping_interval_at_trx_start(thd); bool xa_lock = FALSE; - time_t tmp_time = (time_t) time((time_t*) 0); DBUG_ENTER("spider_internal_start_trx"); - if ( - conn->server_lost || - difftime(tmp_time, conn->ping_time) >= ping_interval_at_trx_start - ) { - spider_conn_queue_ping(spider, conn, link_idx); - } - conn->disable_reconnect = TRUE; if (!trx->trx_start) { if (!trx->trx_consistent_snapshot) @@ -1906,19 +1896,7 @@ int spider_internal_start_trx( trx->internal_xa_snapshot = spider_param_internal_xa_snapshot(thd); } } - if ( - (error_num = spider_check_and_set_sql_log_off(thd, conn, - &spider->need_mons[link_idx])) || - (error_num = spider_check_and_set_wait_timeout(thd, conn, - &spider->need_mons[link_idx])) || - (spider_param_sync_sql_mode(thd) && - (error_num = spider_check_and_set_sql_mode(thd, conn, - &spider->need_mons[link_idx]))) || - (sync_autocommit && - (error_num = spider_check_and_set_autocommit(thd, conn, - &spider->need_mons[link_idx]))) - ) - goto error; + spider->wide_handler->consistent_snapshot = FALSE; if (trx->trx_consistent_snapshot) { if (trx->internal_xa && trx->internal_xa_snapshot < 2) @@ -1929,9 +1907,7 @@ int spider_internal_start_trx( goto error; } else if (!trx->internal_xa || trx->internal_xa_snapshot == 2) { - if ((error_num = spider_start_internal_consistent_snapshot(trx, conn, - &spider->need_mons[link_idx]))) - goto error; + spider->wide_handler->consistent_snapshot = TRUE; } } DBUG_PRINT("info",("spider trx->trx_start= %s", @@ -1950,7 +1926,7 @@ int spider_internal_start_trx( !trx->trx_xa && trx->internal_xa && (!trx->trx_consistent_snapshot || trx->internal_xa_snapshot == 3) && - spider->sql_command != SQLCOM_LOCK_TABLES + spider->wide_handler->sql_command != SQLCOM_LOCK_TABLES ) { trx->trx_xa = TRUE; trx->xid.formatID = 1; @@ -2003,6 +1979,54 @@ int spider_internal_start_trx( trx->updated_in_this_trx = FALSE; DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE")); } + DBUG_RETURN(0); + +error: + if (xa_lock) + spider_xa_unlock(&trx->internal_xid_state); + DBUG_RETURN(error_num); +} + +int spider_internal_start_trx_for_connection( + ha_spider *spider, + SPIDER_CONN *conn, + int link_idx +) { + int error_num; + SPIDER_TRX *trx = spider->wide_handler->trx; + THD *thd = trx->thd; + bool sync_autocommit = spider_param_sync_autocommit(thd); + double ping_interval_at_trx_start = + spider_param_ping_interval_at_trx_start(thd); + time_t tmp_time = (time_t) time((time_t*) 0); + DBUG_ENTER("spider_internal_start_trx_for_connection"); + if ( + conn->server_lost || + difftime(tmp_time, conn->ping_time) >= ping_interval_at_trx_start + ) { + spider_conn_queue_ping(spider, conn, link_idx); + } + conn->disable_reconnect = TRUE; + if ( + (error_num = spider_check_and_set_sql_log_off(thd, conn, + &spider->need_mons[link_idx])) || + (error_num = spider_check_and_set_wait_timeout(thd, conn, + &spider->need_mons[link_idx])) || + (spider_param_sync_sql_mode(thd) && + (error_num = spider_check_and_set_sql_mode(thd, conn, + &spider->need_mons[link_idx]))) || + (sync_autocommit && + (error_num = spider_check_and_set_autocommit(thd, conn, + &spider->need_mons[link_idx]))) + ) + goto error; + + if (spider->wide_handler->consistent_snapshot) + { + if ((error_num = spider_start_internal_consistent_snapshot(trx, conn, + &spider->need_mons[link_idx]))) + goto error; + } DBUG_PRINT("info",("spider sync_autocommit = %d", sync_autocommit)); DBUG_PRINT("info",("spider conn->semi_trx_chk = %d", conn->semi_trx_chk)); @@ -2068,8 +2092,6 @@ int spider_internal_start_trx( DBUG_RETURN(0); error: - if (xa_lock) - spider_xa_unlock(&trx->internal_xid_state); DBUG_RETURN(error_num); } @@ -3750,11 +3772,11 @@ int spider_check_trx_and_get_conn( DBUG_PRINT("info",("spider get trx error")); DBUG_RETURN(error_num); } - spider->trx = trx; + spider->wide_handler->trx = trx; spider->set_error_mode(); if ( - spider->sql_command != SQLCOM_DROP_TABLE && - spider->sql_command != SQLCOM_ALTER_TABLE + spider->wide_handler->sql_command != SQLCOM_DROP_TABLE && + spider->wide_handler->sql_command != SQLCOM_ALTER_TABLE ) { SPIDER_TRX_HA *trx_ha = spider_check_trx_ha(trx, spider); if (!trx_ha || trx_ha->wait_for_reusing) @@ -3810,9 +3832,9 @@ int spider_check_trx_and_get_conn( SPIDER_LINK_STATUS_NG ) { DBUG_PRINT("info",(first_byte != *spider->conn_keys[0] ? - "spider change conn type" : trx != spider->trx ? "spider change thd" : - "spider next trx")); - spider->trx = trx; + "spider change conn type" : trx != spider->wide_handler->trx ? + "spider change thd" : "spider next trx")); + spider->wide_handler->trx = trx; spider->trx_conn_adjustment = trx->trx_conn_adjustment; #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) if (use_conn_kind) diff --git a/storage/spider/spd_trx.h b/storage/spider/spd_trx.h index ca46bae20cc..3bf93aada1a 100644 --- a/storage/spider/spd_trx.h +++ b/storage/spider/spd_trx.h @@ -126,6 +126,10 @@ int spider_start_internal_consistent_snapshot( ); int spider_internal_start_trx( + ha_spider *spider +); + +int spider_internal_start_trx_for_connection( ha_spider *spider, SPIDER_CONN *conn, int link_idx |