1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

fix a case of different linked table name for mrr.

This commit is contained in:
Kentoku SHIBA
2013-09-17 03:19:55 +09:00
parent 74bea98ea5
commit e9d53a384c
10 changed files with 308 additions and 17 deletions

View File

@@ -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);
}

View File

@@ -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();
};

View File

@@ -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

View File

@@ -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
);
};

View File

@@ -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

View File

@@ -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(

View File

@@ -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

View File

@@ -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(

View File

@@ -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

View File

@@ -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