diff options
author | Kentoku SHIBA <kentokushiba@gmail.com> | 2014-03-25 05:15:55 +0900 |
---|---|---|
committer | Kentoku SHIBA <kentokushiba@gmail.com> | 2014-03-25 05:15:55 +0900 |
commit | 088b981e2af7050a6d029a4f92ced61dd8644d17 (patch) | |
tree | 2235d6549ef3b85d55846f73efec7af8e593e87a /storage/spider | |
parent | 3a931cdc5f0b8bd39a059c203b75cf01dce4ca7e (diff) | |
download | mariadb-git-088b981e2af7050a6d029a4f92ced61dd8644d17.tar.gz |
fix bg mrr crash
Diffstat (limited to 'storage/spider')
-rw-r--r-- | storage/spider/ha_spider.cc | 82 | ||||
-rw-r--r-- | storage/spider/ha_spider.h | 3 | ||||
-rw-r--r-- | storage/spider/spd_db_conn.cc | 8 |
3 files changed, 67 insertions, 26 deletions
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index 74ce3099614..92325aa16b9 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -3832,6 +3832,7 @@ int ha_spider::read_range_first_internal( result_list.limit_num = result_list.internal_limit >= result_list.split_read ? result_list.split_read : result_list.internal_limit; + DBUG_PRINT("info",("spider limit_num=%lld", result_list.limit_num)); if ( (error_num = spider_db_append_key_where( start_key, eq_range ? NULL : end_key, this)) @@ -4264,28 +4265,6 @@ int ha_spider::multi_range_read_init( ) ); } - -#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000 -int ha_spider::multi_range_read_next( - range_id_t *range_info -) -#else -int ha_spider::multi_range_read_next( - char **range_info -) -#endif -{ - int error_num; - DBUG_ENTER("ha_spider::multi_range_read_next"); - DBUG_PRINT("info",("spider this=%p", this)); - if (!mrr_have_range) - { - error_num = multi_range_read_next_first(range_info); - mrr_have_range = TRUE; - } else - error_num = multi_range_read_next_next(range_info); - DBUG_RETURN(error_num); -} #endif #ifdef HA_MRR_USE_DEFAULT_IMPL @@ -4408,6 +4387,7 @@ int ha_spider::read_multi_range_first_internal( result_list.split_read ? result_list.split_read : result_list.internal_limit - result_list.record_num; + DBUG_PRINT("info",("spider limit_num=%lld", result_list.limit_num)); if ( #ifdef HA_MRR_USE_DEFAULT_IMPL (error_num = spider_db_append_key_where( @@ -4695,6 +4675,8 @@ int ha_spider::read_multi_range_first_internal( } } else { #ifdef HA_MRR_USE_DEFAULT_IMPL + if (!range_info) + DBUG_RETURN(0); if (!(error_num = spider_db_fetch(table->record[0], this, table))) #else if (!buf || !(error_num = spider_db_fetch(buf, this, table))) @@ -5094,6 +5076,7 @@ int ha_spider::read_multi_range_first_internal( } } else { result_list.limit_num = result_list.internal_limit; + result_list.split_read = result_list.internal_limit; if ( (error_num = init_union_table_name_pos_sql()) || (error_num = append_union_all_start_sql_part( @@ -5137,6 +5120,9 @@ int ha_spider::read_multi_range_first_internal( ) DBUG_RETURN(error_num); set_where_pos_sql(SPIDER_SQL_TYPE_SELECT_SQL); + DBUG_PRINT("info",("spider internal_offset=%lld", + result_list.internal_offset)); + DBUG_PRINT("info",("spider limit_num=%lld", result_list.limit_num)); if ( #ifdef HA_MRR_USE_DEFAULT_IMPL (error_num = spider_db_append_key_where( @@ -5537,6 +5523,8 @@ int ha_spider::read_multi_range_first_internal( DBUG_RETURN(error_num); } else { #ifdef HA_MRR_USE_DEFAULT_IMPL + if (!range_info) + DBUG_RETURN(0); if (!(error_num = spider_db_fetch(table->record[0], this, table))) #else if (!buf || !(error_num = spider_db_fetch(buf, this, table))) @@ -5611,6 +5599,56 @@ int ha_spider::read_multi_range_first_internal( } #ifdef HA_MRR_USE_DEFAULT_IMPL +int ha_spider::pre_multi_range_read_next( + bool use_parallel +) { + DBUG_ENTER("ha_spider::pre_multi_range_read_next"); + DBUG_PRINT("info",("spider this=%p", this)); + check_pre_call(use_parallel); + if (use_pre_call) + { + store_error_num = + multi_range_read_next_first(NULL); + DBUG_RETURN(store_error_num); + } + DBUG_RETURN(0); +} + +#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000 +int ha_spider::multi_range_read_next( + range_id_t *range_info +) +#else +int ha_spider::multi_range_read_next( + char **range_info +) +#endif +{ + int error_num; + DBUG_ENTER("ha_spider::multi_range_read_next"); + DBUG_PRINT("info",("spider this=%p", this)); + if (use_pre_call) + { + if (store_error_num) + { + if (store_error_num == HA_ERR_END_OF_FILE) + table->status = STATUS_NOT_FOUND; + DBUG_RETURN(store_error_num); + } + if ((error_num = spider_bg_all_conn_pre_next(this, search_link_idx))) + DBUG_RETURN(error_num); + use_pre_call = FALSE; + mrr_have_range = TRUE; + DBUG_RETURN(multi_range_read_next_next(range_info)); + } + if (!mrr_have_range) + { + error_num = multi_range_read_next_first(range_info); + mrr_have_range = TRUE; + } else + error_num = multi_range_read_next_next(range_info); + DBUG_RETURN(error_num); +} #else int ha_spider::pre_read_multi_range_first( KEY_MULTI_RANGE **found_range_p, diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h index 0af8127dca6..c26a8781f88 100644 --- a/storage/spider/ha_spider.h +++ b/storage/spider/ha_spider.h @@ -469,6 +469,9 @@ public: bool use_parallel ); #ifdef HA_MRR_USE_DEFAULT_IMPL + int pre_multi_range_read_next( + bool use_parallel + ); #else int pre_read_multi_range_first( KEY_MULTI_RANGE **found_range_p, diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index ca58ab430f2..d5c282ac8cb 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -3680,14 +3680,14 @@ int spider_db_store_result( current->record_num)); DBUG_PRINT("info",("spider result_list->record_num=%lld", result_list->record_num)); + DBUG_PRINT("info",("spider result_list->internal_limit=%lld", + result_list->internal_limit)); + DBUG_PRINT("info",("spider result_list->split_read=%lld", + result_list->split_read)); if ( result_list->internal_limit <= result_list->record_num || result_list->split_read > current->record_num ) { - DBUG_PRINT("info",("spider result_list->internal_limit=%lld", - result_list->internal_limit)); - DBUG_PRINT("info",("spider result_list->split_read=%lld", - result_list->split_read)); DBUG_PRINT("info",("spider set finish_flg point 2")); DBUG_PRINT("info",("spider current->finish_flg = TRUE")); DBUG_PRINT("info",("spider result_list->finish_flg = TRUE")); |