From e9d53a384cdfd4174bc1c69100cf04006d217ec7 Mon Sep 17 00:00:00 2001 From: Kentoku SHIBA Date: Tue, 17 Sep 2013 03:19:55 +0900 Subject: [PATCH] fix a case of different linked table name for mrr. --- storage/spider/ha_spider.cc | 64 +++++++++++++++-- storage/spider/ha_spider.h | 2 + storage/spider/spd_db_handlersocket.cc | 27 ++++++++ storage/spider/spd_db_handlersocket.h | 7 ++ storage/spider/spd_db_include.h | 7 ++ storage/spider/spd_db_mysql.cc | 95 ++++++++++++++++++++++++-- storage/spider/spd_db_mysql.h | 9 +++ storage/spider/spd_db_oracle.cc | 95 ++++++++++++++++++++++++-- storage/spider/spd_db_oracle.h | 9 +++ storage/spider/spd_include.h | 10 ++- 10 files changed, 308 insertions(+), 17 deletions(-) diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index 74ebcfb6190..c069ddfb770 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -5023,8 +5023,11 @@ int ha_spider::read_multi_range_first_internal( } } else { result_list.limit_num = result_list.internal_limit; - if ((error_num = append_union_all_start_sql_part( - SPIDER_SQL_TYPE_SELECT_SQL))) + if ( + (error_num = init_union_table_name_pos_sql()) || + (error_num = append_union_all_start_sql_part( + SPIDER_SQL_TYPE_SELECT_SQL)) + ) DBUG_RETURN(error_num); #ifdef HA_MRR_USE_DEFAULT_IMPL @@ -5050,7 +5053,10 @@ int ha_spider::read_multi_range_first_internal( if ((error_num = append_multi_range_cnt_sql_part( SPIDER_SQL_TYPE_SELECT_SQL, multi_range_cnt, TRUE))) DBUG_RETURN(error_num); - if ((error_num = spider_db_append_select_columns(this))) + if ( + (error_num = spider_db_append_select_columns(this)) || + (error_num = set_union_table_name_pos_sql()) + ) DBUG_RETURN(error_num); high_priority = FALSE; if ( @@ -6371,8 +6377,11 @@ int ha_spider::read_multi_range_next( } else { result_list.limit_num = result_list.internal_limit - result_list.record_num; - if ((error_num = - append_union_all_start_sql_part(SPIDER_SQL_TYPE_SELECT_SQL))) + if ( + (error_num = init_union_table_name_pos_sql()) || + (error_num = + append_union_all_start_sql_part(SPIDER_SQL_TYPE_SELECT_SQL)) + ) DBUG_RETURN(error_num); #ifdef HA_MRR_USE_DEFAULT_IMPL do @@ -6396,7 +6405,10 @@ int ha_spider::read_multi_range_next( if ((error_num = append_multi_range_cnt_sql_part( SPIDER_SQL_TYPE_SELECT_SQL, multi_range_cnt, TRUE))) DBUG_RETURN(error_num); - if ((error_num = spider_db_append_select_columns(this))) + if ( + (error_num = spider_db_append_select_columns(this)) || + (error_num = set_union_table_name_pos_sql()) + ) DBUG_RETURN(error_num); high_priority = FALSE; if ( @@ -13958,3 +13970,43 @@ bool ha_spider::support_bulk_access_hs() const DBUG_RETURN(TRUE); } #endif + +int ha_spider::init_union_table_name_pos_sql() +{ + int error_num; + uint roop_count, dbton_id; + spider_db_handler *dbton_hdl; + DBUG_ENTER("ha_spider::init_union_table_name_pos_sql"); + for (roop_count = 0; roop_count < share->use_sql_dbton_count; roop_count++) + { + dbton_id = share->use_sql_dbton_ids[roop_count]; + dbton_hdl = dbton_handler[dbton_id]; + if ( + dbton_hdl->first_link_idx >= 0 && + (error_num = dbton_hdl->init_union_table_name_pos()) + ) { + DBUG_RETURN(error_num); + } + } + DBUG_RETURN(0); +} + +int ha_spider::set_union_table_name_pos_sql() +{ + int error_num; + uint roop_count, dbton_id; + spider_db_handler *dbton_hdl; + DBUG_ENTER("ha_spider::set_union_table_name_pos_sql"); + for (roop_count = 0; roop_count < share->use_sql_dbton_count; roop_count++) + { + dbton_id = share->use_sql_dbton_ids[roop_count]; + dbton_hdl = dbton_handler[dbton_id]; + if ( + dbton_hdl->first_link_idx >= 0 && + (error_num = dbton_hdl->set_union_table_name_pos()) + ) { + DBUG_RETURN(error_num); + } + } + DBUG_RETURN(0); +} diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h index de34e085359..50ddeb1c050 100644 --- a/storage/spider/ha_spider.h +++ b/storage/spider/ha_spider.h @@ -1043,4 +1043,6 @@ public: #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) bool support_bulk_access_hs() const; #endif + int init_union_table_name_pos_sql(); + int set_union_table_name_pos_sql(); }; diff --git a/storage/spider/spd_db_handlersocket.cc b/storage/spider/spd_db_handlersocket.cc index a828a98c597..876eeeb656c 100644 --- a/storage/spider/spd_db_handlersocket.cc +++ b/storage/spider/spd_db_handlersocket.cc @@ -5415,4 +5415,31 @@ void spider_handlersocket_handler::copy_minimum_select_bitmap( } DBUG_VOID_RETURN; } + +int spider_handlersocket_handler::init_union_table_name_pos() +{ + DBUG_ENTER("spider_handlersocket_handler::init_union_table_name_pos"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_ASSERT(0); + DBUG_RETURN(0); +} + +int spider_handlersocket_handler::set_union_table_name_pos() +{ + DBUG_ENTER("spider_handlersocket_handler::set_union_table_name_pos"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_ASSERT(0); + DBUG_RETURN(0); +} + +int spider_handlersocket_handler::reset_union_table_name( + spider_string *str, + int link_idx, + ulong sql_type +) { + DBUG_ENTER("spider_handlersocket_handler::reset_union_table_name"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_ASSERT(0); + DBUG_RETURN(0); +} #endif diff --git a/storage/spider/spd_db_handlersocket.h b/storage/spider/spd_db_handlersocket.h index 51cbc7e6c79..ed3d55752bc 100644 --- a/storage/spider/spd_db_handlersocket.h +++ b/storage/spider/spd_db_handlersocket.h @@ -914,4 +914,11 @@ public: void copy_minimum_select_bitmap( uchar *bitmap ); + int init_union_table_name_pos(); + int set_union_table_name_pos(); + int reset_union_table_name( + spider_string *str, + int link_idx, + ulong sql_type + ); }; diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h index f35652646ea..c51bca146cd 100644 --- a/storage/spider/spd_db_include.h +++ b/storage/spider/spd_db_include.h @@ -1371,6 +1371,13 @@ public: virtual void copy_minimum_select_bitmap( uchar *bitmap ) = 0; + virtual int init_union_table_name_pos() = 0; + virtual int set_union_table_name_pos() = 0; + virtual int reset_union_table_name( + spider_string *str, + int link_idx, + ulong sql_type + ) = 0; }; class spider_db_copy_table diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index cea61083d29..f6ef1ff947e 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -4552,6 +4552,8 @@ spider_mysql_handler::spider_mysql_handler( tmp_sql_pos4(0), tmp_sql_pos5(0), reading_from_bulk_tmp_table(FALSE), + union_table_name_pos_first(NULL), + union_table_name_pos_current(NULL), mysql_share(db_share), link_for_hash(NULL) { @@ -4566,6 +4568,12 @@ spider_mysql_handler::~spider_mysql_handler() { DBUG_ENTER("spider_mysql_handler::~spider_mysql_handler"); DBUG_PRINT("info",("spider this=%p", this)); + while (union_table_name_pos_first) + { + SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first; + union_table_name_pos_first = tmp_pos->next; + spider_free(spider_current_trx, tmp_pos, MYF(0)); + } if (link_for_hash) { spider_free(spider_current_trx, link_for_hash, MYF(0)); @@ -9114,14 +9122,14 @@ int spider_mysql_handler::set_sql_for_exec( uint table_name_lengths[2], table_alias_lengths[2]; tgt_table_name_str.init_calc_mem(104); tgt_table_name_str.length(0); - if (result_list->tmp_table_join) + if (result_list->tmp_table_join && spider->bka_mode != 2) { create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length, link_idx); append_table_name_with_adjusting(&tgt_table_name_str, link_idx, SPIDER_SQL_TYPE_TMP_SQL); table_names[0] = tmp_table_name; - table_names[1] = tgt_table_name_str.c_ptr(); + table_names[1] = tgt_table_name_str.ptr(); table_name_lengths[0] = tmp_table_name_length; table_name_lengths[1] = tgt_table_name_str.length(); table_aliases[0] = SPIDER_SQL_A_STR; @@ -9134,10 +9142,15 @@ int spider_mysql_handler::set_sql_for_exec( exec_sql = &result_list->sqls[link_idx]; if (exec_sql->copy(sql)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - else { + else if (result_list->use_union) + { + if ((error_num = reset_union_table_name(exec_sql, link_idx, + SPIDER_SQL_TYPE_SELECT_SQL))) + DBUG_RETURN(error_num); + } else { tmp_pos = exec_sql->length(); exec_sql->length(table_name_pos); - if (result_list->tmp_table_join) + if (result_list->tmp_table_join && spider->bka_mode != 2) { if ((error_num = spider_db_mysql_utility.append_from_with_alias( exec_sql, table_names, table_name_lengths, @@ -9145,6 +9158,7 @@ int spider_mysql_handler::set_sql_for_exec( &table_name_pos, TRUE)) ) DBUG_RETURN(error_num); + exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } else { append_table_name_with_adjusting(exec_sql, link_idx, SPIDER_SQL_TYPE_SELECT_SQL); @@ -9155,7 +9169,7 @@ int spider_mysql_handler::set_sql_for_exec( if (sql_type & SPIDER_SQL_TYPE_TMP_SQL) { exec_tmp_sql = &result_list->tmp_sqls[link_idx]; - if (result_list->tmp_table_join) + if (result_list->tmp_table_join && spider->bka_mode != 2) { if (exec_tmp_sql->copy(tmp_sql)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -10743,6 +10757,77 @@ void spider_mysql_handler::copy_minimum_select_bitmap( DBUG_VOID_RETURN; } +int spider_mysql_handler::init_union_table_name_pos() +{ + DBUG_ENTER("spider_mysql_handler::init_union_table_name_pos"); + DBUG_PRINT("info",("spider this=%p", this)); + if (!union_table_name_pos_first) + { + if (!spider_bulk_malloc(spider_current_trx, 236, MYF(MY_WME), + &union_table_name_pos_first, sizeof(SPIDER_INT_HLD), + NullS) + ) { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + union_table_name_pos_first->next = NULL; + } + union_table_name_pos_current = union_table_name_pos_first; + union_table_name_pos_current->tgt_num = 0; + DBUG_RETURN(0); +} + +int spider_mysql_handler::set_union_table_name_pos() +{ + DBUG_ENTER("spider_mysql_handler::set_union_table_name_pos"); + DBUG_PRINT("info",("spider this=%p", this)); + if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE) + { + if (!union_table_name_pos_current->next) + { + if (!spider_bulk_malloc(spider_current_trx, 237, MYF(MY_WME), + &union_table_name_pos_current->next, sizeof(SPIDER_INT_HLD), + NullS) + ) { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + union_table_name_pos_current->next->next = NULL; + } + union_table_name_pos_current = union_table_name_pos_current->next; + union_table_name_pos_current->tgt_num = 0; + } + union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] = + table_name_pos; + ++union_table_name_pos_current->tgt_num; + DBUG_RETURN(0); +} + +int spider_mysql_handler::reset_union_table_name( + spider_string *str, + int link_idx, + ulong sql_type +) { + DBUG_ENTER("spider_mysql_handler::reset_union_table_name"); + DBUG_PRINT("info",("spider this=%p", this)); + if (!union_table_name_pos_current) + DBUG_RETURN(0); + + SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first; + uint cur_num, pos_backup = str->length(); + while(TRUE) + { + for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num) + { + str->length(tmp_pos->tgt[cur_num]); + append_table_name_with_adjusting(str, link_idx, sql_type); + } + if (tmp_pos == union_table_name_pos_current) + break; + tmp_pos = tmp_pos->next; + } + str->length(pos_backup); + DBUG_RETURN(0); +} + spider_mysql_copy_table::spider_mysql_copy_table( spider_mysql_share *db_share ) : spider_db_copy_table( diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h index 96436a90b7b..71d6a262cf8 100644 --- a/storage/spider/spd_db_mysql.h +++ b/storage/spider/spd_db_mysql.h @@ -521,6 +521,8 @@ class spider_mysql_handler: public spider_db_handler #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) SPIDER_DB_HS_STRING_REF_BUFFER hs_upds; #endif + SPIDER_INT_HLD *union_table_name_pos_first; + SPIDER_INT_HLD *union_table_name_pos_current; public: spider_mysql_share *mysql_share; SPIDER_LINK_FOR_HASH *link_for_hash; @@ -1249,6 +1251,13 @@ public: void copy_minimum_select_bitmap( uchar *bitmap ); + int init_union_table_name_pos(); + int set_union_table_name_pos(); + int reset_union_table_name( + spider_string *str, + int link_idx, + ulong sql_type + ); }; class spider_mysql_copy_table: public spider_db_copy_table diff --git a/storage/spider/spd_db_oracle.cc b/storage/spider/spd_db_oracle.cc index 7446156c1d5..1254dd8332e 100644 --- a/storage/spider/spd_db_oracle.cc +++ b/storage/spider/spd_db_oracle.cc @@ -4638,6 +4638,8 @@ spider_oracle_handler::spider_oracle_handler( filled_up(FALSE), select_rownum_appended(FALSE), update_rownum_appended(FALSE), + union_table_name_pos_first(NULL), + union_table_name_pos_current(NULL), oracle_share(db_share), link_for_hash(NULL) { @@ -4652,6 +4654,12 @@ spider_oracle_handler::~spider_oracle_handler() { DBUG_ENTER("spider_oracle_handler::~spider_oracle_handler"); DBUG_PRINT("info",("spider this=%p", this)); + while (union_table_name_pos_first) + { + SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first; + union_table_name_pos_first = tmp_pos->next; + spider_free(spider_current_trx, tmp_pos, MYF(0)); + } if (link_for_hash) { spider_free(spider_current_trx, link_for_hash, MYF(0)); @@ -9622,14 +9630,14 @@ int spider_oracle_handler::set_sql_for_exec( uint table_name_lengths[2], table_alias_lengths[2]; tgt_table_name_str.init_calc_mem(212); tgt_table_name_str.length(0); - if (result_list->tmp_table_join) + if (result_list->tmp_table_join && spider->bka_mode != 2) { create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length, link_idx); append_table_name_with_adjusting(&tgt_table_name_str, link_idx, SPIDER_SQL_TYPE_TMP_SQL); table_names[0] = tmp_table_name; - table_names[1] = tgt_table_name_str.c_ptr(); + table_names[1] = tgt_table_name_str.ptr(); table_name_lengths[0] = tmp_table_name_length; table_name_lengths[1] = tgt_table_name_str.length(); table_aliases[0] = SPIDER_SQL_A_STR; @@ -9642,10 +9650,15 @@ int spider_oracle_handler::set_sql_for_exec( exec_sql = &result_list->sqls[link_idx]; if (exec_sql->copy(sql)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - else { + else if (result_list->use_union) + { + if ((error_num = reset_union_table_name(exec_sql, link_idx, + SPIDER_SQL_TYPE_SELECT_SQL))) + DBUG_RETURN(error_num); + } else { tmp_pos = exec_sql->length(); exec_sql->length(table_name_pos); - if (result_list->tmp_table_join) + if (result_list->tmp_table_join && spider->bka_mode != 2) { if ((error_num = spider_db_oracle_utility.append_from_with_alias( exec_sql, table_names, table_name_lengths, @@ -9653,6 +9666,7 @@ int spider_oracle_handler::set_sql_for_exec( &table_name_pos, TRUE)) ) DBUG_RETURN(error_num); + exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } else { append_table_name_with_adjusting(exec_sql, link_idx, SPIDER_SQL_TYPE_SELECT_SQL); @@ -9663,7 +9677,7 @@ int spider_oracle_handler::set_sql_for_exec( if (sql_type & SPIDER_SQL_TYPE_TMP_SQL) { exec_tmp_sql = &result_list->tmp_sqls[link_idx]; - if (result_list->tmp_table_join) + if (result_list->tmp_table_join && spider->bka_mode != 2) { if (exec_tmp_sql->copy(tmp_sql)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -11352,6 +11366,77 @@ void spider_oracle_handler::copy_minimum_select_bitmap( DBUG_VOID_RETURN; } +int spider_oracle_handler::init_union_table_name_pos() +{ + DBUG_ENTER("spider_oracle_handler::init_union_table_name_pos"); + DBUG_PRINT("info",("spider this=%p", this)); + if (!union_table_name_pos_first) + { + if (!spider_bulk_malloc(spider_current_trx, 238, MYF(MY_WME), + &union_table_name_pos_first, sizeof(SPIDER_INT_HLD), + NullS) + ) { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + union_table_name_pos_first->next = NULL; + } + union_table_name_pos_current = union_table_name_pos_first; + union_table_name_pos_current->tgt_num = 0; + DBUG_RETURN(0); +} + +int spider_oracle_handler::set_union_table_name_pos() +{ + DBUG_ENTER("spider_oracle_handler::set_union_table_name_pos"); + DBUG_PRINT("info",("spider this=%p", this)); + if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE) + { + if (!union_table_name_pos_current->next) + { + if (!spider_bulk_malloc(spider_current_trx, 239, MYF(MY_WME), + &union_table_name_pos_current->next, sizeof(SPIDER_INT_HLD), + NullS) + ) { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + union_table_name_pos_current->next->next = NULL; + } + union_table_name_pos_current = union_table_name_pos_current->next; + union_table_name_pos_current->tgt_num = 0; + } + union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] = + table_name_pos; + ++union_table_name_pos_current->tgt_num; + DBUG_RETURN(0); +} + +int spider_oracle_handler::reset_union_table_name( + spider_string *str, + int link_idx, + ulong sql_type +) { + DBUG_ENTER("spider_oracle_handler::reset_union_table_name"); + DBUG_PRINT("info",("spider this=%p", this)); + if (!union_table_name_pos_current) + DBUG_RETURN(0); + + SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first; + uint cur_num, pos_backup = str->length(); + while(TRUE) + { + for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num) + { + str->length(tmp_pos->tgt[cur_num]); + append_table_name_with_adjusting(str, link_idx, sql_type); + } + if (tmp_pos == union_table_name_pos_current) + break; + tmp_pos = tmp_pos->next; + } + str->length(pos_backup); + DBUG_RETURN(0); +} + spider_oracle_copy_table::spider_oracle_copy_table( spider_oracle_share *db_share ) : spider_db_copy_table( diff --git a/storage/spider/spd_db_oracle.h b/storage/spider/spd_db_oracle.h index 79dfe56d27d..db5eac88ca9 100644 --- a/storage/spider/spd_db_oracle.h +++ b/storage/spider/spd_db_oracle.h @@ -604,6 +604,8 @@ class spider_oracle_handler: public spider_db_handler #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) SPIDER_DB_HS_STRING_REF_BUFFER hs_upds; #endif + SPIDER_INT_HLD *union_table_name_pos_first; + SPIDER_INT_HLD *union_table_name_pos_current; public: spider_oracle_share *oracle_share; SPIDER_LINK_FOR_HASH *link_for_hash; @@ -1335,6 +1337,13 @@ public: void copy_minimum_select_bitmap( uchar *bitmap ); + int init_union_table_name_pos(); + int set_union_table_name_pos(); + int reset_union_table_name( + spider_string *str, + int link_idx, + ulong sql_type + ); }; class spider_oracle_copy_table: public spider_db_copy_table diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h index 4dc97cef505..6db537462ef 100644 --- a/storage/spider/spd_include.h +++ b/storage/spider/spd_include.h @@ -118,7 +118,7 @@ #define SPIDER_TMP_SHARE_LONG_COUNT 15 #define SPIDER_TMP_SHARE_LONGLONG_COUNT 3 -#define SPIDER_MEM_CALC_LIST_NUM 236 +#define SPIDER_MEM_CALC_LIST_NUM 240 #define SPIDER_BACKUP_DASTATUS \ bool da_status; if (thd) da_status = thd->is_error(); else da_status = FALSE; @@ -1150,6 +1150,14 @@ typedef struct st_spider_bulk_access_link } SPIDER_BULK_ACCESS_LINK; #endif +#define SPIDER_INT_HLD_TGT_SIZE 100 +typedef struct st_spider_int_hld +{ + uint tgt_num; + int tgt[SPIDER_INT_HLD_TGT_SIZE]; + st_spider_int_hld *next; +} SPIDER_INT_HLD; + char *spider_create_string( const char *str, uint length