Merge Spider 3.2.11
This commit is contained in:
parent
c338772a59
commit
391fddf660
@ -33,9 +33,7 @@ IF(EXISTS ${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake)
|
|||||||
|
|
||||||
MYSQL_STORAGE_ENGINE(SPIDER)
|
MYSQL_STORAGE_ENGINE(SPIDER)
|
||||||
ELSE()
|
ELSE()
|
||||||
INCLUDE_DIRECTORIES(
|
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/storage/spider/hs_client)
|
||||||
${CMAKE_SOURCE_DIR}/storage/spider/hs_client
|
|
||||||
${ORACLE_INCLUDE_DIR})
|
|
||||||
|
|
||||||
INSTALL(FILES
|
INSTALL(FILES
|
||||||
${CMAKE_SOURCE_DIR}/storage/spider/scripts/install_spider.sql
|
${CMAKE_SOURCE_DIR}/storage/spider/scripts/install_spider.sql
|
||||||
@ -46,7 +44,11 @@ ELSE()
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(ORACLE_INCLUDE_DIR AND ORACLE_OCI_LIBRARY)
|
IF(ORACLE_INCLUDE_DIR AND ORACLE_OCI_LIBRARY)
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_ORACLE_OCI -DLINUX -D_GNU_SOURCE -D_REENTRANT")
|
SET(SPIDER_WITH_ORACLE_OCI OFF CACHE BOOL "Spider is compiled with Oracle OCI library.")
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_ORACLE_OCI -DLINUX -D_GNU_SOURCE -D_REENTRANT")
|
IF(SPIDER_WITH_ORACLE_OCI)
|
||||||
TARGET_LINK_LIBRARIES (spider ${ORACLE_OCI_LIBRARY})
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_ORACLE_OCI -DLINUX -D_GNU_SOURCE -D_REENTRANT")
|
||||||
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_ORACLE_OCI -DLINUX -D_GNU_SOURCE -D_REENTRANT")
|
||||||
|
INCLUDE_DIRECTORIES(${ORACLE_INCLUDE_DIR})
|
||||||
|
TARGET_LINK_LIBRARIES (spider ${ORACLE_OCI_LIBRARY})
|
||||||
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
@ -158,6 +158,7 @@ ha_spider::ha_spider(
|
|||||||
result_list.direct_aggregate = FALSE;
|
result_list.direct_aggregate = FALSE;
|
||||||
result_list.snap_direct_aggregate = FALSE;
|
result_list.snap_direct_aggregate = FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
result_list.direct_distinct = FALSE;
|
||||||
result_list.casual_read = NULL;
|
result_list.casual_read = NULL;
|
||||||
result_list.use_both_key = FALSE;
|
result_list.use_both_key = FALSE;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
@ -264,6 +265,7 @@ ha_spider::ha_spider(
|
|||||||
result_list.direct_aggregate = FALSE;
|
result_list.direct_aggregate = FALSE;
|
||||||
result_list.snap_direct_aggregate = FALSE;
|
result_list.snap_direct_aggregate = FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
result_list.direct_distinct = FALSE;
|
||||||
result_list.casual_read = NULL;
|
result_list.casual_read = NULL;
|
||||||
result_list.use_both_key = FALSE;
|
result_list.use_both_key = FALSE;
|
||||||
ref_length = sizeof(SPIDER_POSITION);
|
ref_length = sizeof(SPIDER_POSITION);
|
||||||
@ -1585,6 +1587,7 @@ int ha_spider::reset()
|
|||||||
result_list.direct_aggregate = FALSE;
|
result_list.direct_aggregate = FALSE;
|
||||||
result_list.snap_direct_aggregate = FALSE;
|
result_list.snap_direct_aggregate = FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
result_list.direct_distinct = FALSE;
|
||||||
store_error_num = 0;
|
store_error_num = 0;
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
if (
|
if (
|
||||||
@ -7765,9 +7768,6 @@ void ha_spider::ft_end()
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("ha_spider::ft_end");
|
DBUG_ENTER("ha_spider::ft_end");
|
||||||
DBUG_PRINT("info",("spider this=%p", this));
|
DBUG_PRINT("info",("spider this=%p", this));
|
||||||
ft_handler = NULL;
|
|
||||||
ft_current = NULL;
|
|
||||||
ft_count = 0;
|
|
||||||
if (ft_init_without_index_init)
|
if (ft_init_without_index_init)
|
||||||
{
|
{
|
||||||
if (ft_init_idx == MAX_KEY)
|
if (ft_init_idx == MAX_KEY)
|
||||||
@ -8183,15 +8183,13 @@ int ha_spider::info(
|
|||||||
auto_inc_temporary = FALSE;
|
auto_inc_temporary = FALSE;
|
||||||
#endif
|
#endif
|
||||||
sql_command = thd_sql_command(thd);
|
sql_command = thd_sql_command(thd);
|
||||||
if (
|
|
||||||
/*
|
/*
|
||||||
|
if (
|
||||||
sql_command == SQLCOM_DROP_TABLE ||
|
sql_command == SQLCOM_DROP_TABLE ||
|
||||||
sql_command == SQLCOM_ALTER_TABLE ||
|
sql_command == SQLCOM_ALTER_TABLE ||
|
||||||
sql_command == SQLCOM_SHOW_CREATE
|
sql_command == SQLCOM_SHOW_CREATE
|
||||||
*/
|
|
||||||
sql_command == SQLCOM_DROP_TABLE ||
|
|
||||||
sql_command == SQLCOM_ALTER_TABLE
|
|
||||||
) {
|
) {
|
||||||
|
*/
|
||||||
if (flag & HA_STATUS_AUTO)
|
if (flag & HA_STATUS_AUTO)
|
||||||
{
|
{
|
||||||
if (share->lgtm_tblhnd_share->auto_increment_value)
|
if (share->lgtm_tblhnd_share->auto_increment_value)
|
||||||
@ -8204,8 +8202,14 @@ int ha_spider::info(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DBUG_RETURN(0);
|
if (
|
||||||
|
sql_command == SQLCOM_DROP_TABLE ||
|
||||||
|
sql_command == SQLCOM_ALTER_TABLE
|
||||||
|
)
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
/*
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if (flag &
|
if (flag &
|
||||||
(HA_STATUS_TIME | HA_STATUS_CONST | HA_STATUS_VARIABLE | HA_STATUS_AUTO))
|
(HA_STATUS_TIME | HA_STATUS_CONST | HA_STATUS_VARIABLE | HA_STATUS_AUTO))
|
||||||
@ -8240,6 +8244,15 @@ int ha_spider::info(
|
|||||||
spider_param_table_init_error_interval())
|
spider_param_table_init_error_interval())
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(&share->sts_mutex);
|
pthread_mutex_unlock(&share->sts_mutex);
|
||||||
|
if (sql_command == SQLCOM_SHOW_CREATE)
|
||||||
|
{
|
||||||
|
if (thd->is_error())
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info", ("spider clear_error"));
|
||||||
|
thd->clear_error();
|
||||||
|
}
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
if (spider_init_error_table->init_error_with_message)
|
if (spider_init_error_table->init_error_with_message)
|
||||||
my_message(spider_init_error_table->init_error,
|
my_message(spider_init_error_table->init_error,
|
||||||
spider_init_error_table->init_error_msg, MYF(0));
|
spider_init_error_table->init_error_msg, MYF(0));
|
||||||
@ -8304,6 +8317,15 @@ int ha_spider::info(
|
|||||||
share->init_error = TRUE;
|
share->init_error = TRUE;
|
||||||
share->init = TRUE;
|
share->init = TRUE;
|
||||||
}
|
}
|
||||||
|
if (sql_command == SQLCOM_SHOW_CREATE)
|
||||||
|
{
|
||||||
|
if (thd->is_error())
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info", ("spider clear_error"));
|
||||||
|
thd->clear_error();
|
||||||
|
}
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
DBUG_RETURN(check_error_mode(error_num));
|
DBUG_RETURN(check_error_mode(error_num));
|
||||||
}
|
}
|
||||||
if ((error_num = spider_get_sts(share, search_link_idx, tmp_time,
|
if ((error_num = spider_get_sts(share, search_link_idx, tmp_time,
|
||||||
@ -8356,6 +8378,15 @@ int ha_spider::info(
|
|||||||
share->init_error = TRUE;
|
share->init_error = TRUE;
|
||||||
share->init = TRUE;
|
share->init = TRUE;
|
||||||
}
|
}
|
||||||
|
if (sql_command == SQLCOM_SHOW_CREATE)
|
||||||
|
{
|
||||||
|
if (thd->is_error())
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info", ("spider clear_error"));
|
||||||
|
thd->clear_error();
|
||||||
|
}
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
DBUG_RETURN(check_error_mode(error_num));
|
DBUG_RETURN(check_error_mode(error_num));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8376,6 +8407,15 @@ int ha_spider::info(
|
|||||||
if ((error_num = spider_create_sts_thread(share)))
|
if ((error_num = spider_create_sts_thread(share)))
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(&share->sts_mutex);
|
pthread_mutex_unlock(&share->sts_mutex);
|
||||||
|
if (sql_command == SQLCOM_SHOW_CREATE)
|
||||||
|
{
|
||||||
|
if (thd->is_error())
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info", ("spider clear_error"));
|
||||||
|
thd->clear_error();
|
||||||
|
}
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
DBUG_RETURN(error_num);
|
DBUG_RETURN(error_num);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@ -8389,7 +8429,18 @@ int ha_spider::info(
|
|||||||
if (flag & HA_STATUS_CONST)
|
if (flag & HA_STATUS_CONST)
|
||||||
{
|
{
|
||||||
if ((error_num = check_crd()))
|
if ((error_num = check_crd()))
|
||||||
|
{
|
||||||
|
if (sql_command == SQLCOM_SHOW_CREATE)
|
||||||
|
{
|
||||||
|
if (thd->is_error())
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info", ("spider clear_error"));
|
||||||
|
thd->clear_error();
|
||||||
|
}
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
DBUG_RETURN(error_num);
|
DBUG_RETURN(error_num);
|
||||||
|
}
|
||||||
spider_db_set_cardinarity(this, table);
|
spider_db_set_cardinarity(this, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8413,6 +8464,9 @@ int ha_spider::info(
|
|||||||
}
|
}
|
||||||
if (flag & HA_STATUS_AUTO)
|
if (flag & HA_STATUS_AUTO)
|
||||||
{
|
{
|
||||||
|
#ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT
|
||||||
|
auto_inc_temporary = FALSE;
|
||||||
|
#endif
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
if (share->partition_share && table->next_number_field)
|
if (share->partition_share && table->next_number_field)
|
||||||
{
|
{
|
||||||
@ -8481,6 +8535,7 @@ ha_rows ha_spider::records_in_range(
|
|||||||
spider_db_handler *dbton_hdl;
|
spider_db_handler *dbton_hdl;
|
||||||
DBUG_ENTER("ha_spider::records_in_range");
|
DBUG_ENTER("ha_spider::records_in_range");
|
||||||
DBUG_PRINT("info",("spider this=%p", this));
|
DBUG_PRINT("info",("spider this=%p", this));
|
||||||
|
DBUG_PRINT("info",("spider inx=%u", inx));
|
||||||
time_t tmp_time = (time_t) time((time_t*) 0);
|
time_t tmp_time = (time_t) time((time_t*) 0);
|
||||||
if (!share->crd_init)
|
if (!share->crd_init)
|
||||||
{
|
{
|
||||||
@ -8517,12 +8572,16 @@ ha_rows ha_spider::records_in_range(
|
|||||||
crd_mode = dbton_hdl->crd_mode_exchange(crd_mode);
|
crd_mode = dbton_hdl->crd_mode_exchange(crd_mode);
|
||||||
if (crd_mode == 1 || crd_mode == 2)
|
if (crd_mode == 1 || crd_mode == 2)
|
||||||
{
|
{
|
||||||
|
DBUG_PRINT("info", ("spider static_key_cardinality[%u]=%lld", inx,
|
||||||
|
share->static_key_cardinality[inx]));
|
||||||
DBUG_PRINT("info",
|
DBUG_PRINT("info",
|
||||||
("spider difftime=%f", difftime(tmp_time, share->crd_get_time)));
|
("spider difftime=%f", difftime(tmp_time, share->crd_get_time)));
|
||||||
DBUG_PRINT("info",
|
DBUG_PRINT("info",
|
||||||
("spider crd_interval=%f", crd_interval));
|
("spider crd_interval=%f", crd_interval));
|
||||||
if (difftime(tmp_time, share->crd_get_time) >= crd_interval)
|
if (
|
||||||
{
|
share->static_key_cardinality[inx] == -1 &&
|
||||||
|
difftime(tmp_time, share->crd_get_time) >= crd_interval
|
||||||
|
) {
|
||||||
if (
|
if (
|
||||||
crd_interval == 0 ||
|
crd_interval == 0 ||
|
||||||
!pthread_mutex_trylock(&share->crd_mutex)
|
!pthread_mutex_trylock(&share->crd_mutex)
|
||||||
@ -8654,44 +8713,89 @@ ha_rows ha_spider::records_in_range(
|
|||||||
else
|
else
|
||||||
weight = 1;
|
weight = 1;
|
||||||
|
|
||||||
for (
|
if (share->static_key_cardinality[inx] == -1)
|
||||||
key_part = key_info->key_part;
|
{
|
||||||
tgt_key_part_map > 1;
|
for (
|
||||||
tgt_key_part_map >>= 1,
|
key_part = key_info->key_part;
|
||||||
key_part++
|
tgt_key_part_map > 1;
|
||||||
) {
|
tgt_key_part_map >>= 1,
|
||||||
field = key_part->field;
|
key_part++
|
||||||
if ((rate =
|
|
||||||
((double) share->cardinality[field->field_index]) / weight) >= 1
|
|
||||||
) {
|
) {
|
||||||
if ((rows = rows / rate) < 2)
|
field = key_part->field;
|
||||||
|
DBUG_PRINT("info",
|
||||||
|
("spider field_index=%u",
|
||||||
|
field->field_index));
|
||||||
|
DBUG_PRINT("info",
|
||||||
|
("spider cardinality=%lld", share->cardinality[field->field_index]));
|
||||||
|
if (share->cardinality[field->field_index] == -1)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info",("spider rows2=%f then ret 2", rows));
|
DBUG_PRINT("info",
|
||||||
DBUG_RETURN((ha_rows) 2);
|
("spider uninitialized column cardinality"));
|
||||||
|
DBUG_RETURN(HA_POS_ERROR);
|
||||||
}
|
}
|
||||||
|
if ((rate =
|
||||||
|
((double) share->cardinality[field->field_index]) / weight) >= 1
|
||||||
|
) {
|
||||||
|
if ((rows = rows / rate) < 2)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("spider rows2=%f then ret 2", rows));
|
||||||
|
DBUG_RETURN((ha_rows) 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (crd_type == 1)
|
||||||
|
weight += spider_param_crd_weight(thd, share->crd_weight);
|
||||||
|
else if (crd_type == 2)
|
||||||
|
weight *= spider_param_crd_weight(thd, share->crd_weight);
|
||||||
|
}
|
||||||
|
field = key_part->field;
|
||||||
|
DBUG_PRINT("info",
|
||||||
|
("spider field_index=%u",
|
||||||
|
field->field_index));
|
||||||
|
DBUG_PRINT("info",
|
||||||
|
("spider cardinality=%lld", share->cardinality[field->field_index]));
|
||||||
|
if (share->cardinality[field->field_index] == -1)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",
|
||||||
|
("spider uninitialized column cardinality"));
|
||||||
|
DBUG_RETURN(HA_POS_ERROR);
|
||||||
}
|
}
|
||||||
if (crd_type == 1)
|
|
||||||
weight += spider_param_crd_weight(thd, share->crd_weight);
|
|
||||||
else if (crd_type == 2)
|
|
||||||
weight *= spider_param_crd_weight(thd, share->crd_weight);
|
|
||||||
}
|
}
|
||||||
field = key_part->field;
|
|
||||||
if (
|
if (
|
||||||
start_key_part_map >= end_key_part_map &&
|
start_key_part_map >= end_key_part_map &&
|
||||||
start_key->flag == HA_READ_KEY_EXACT
|
start_key->flag == HA_READ_KEY_EXACT
|
||||||
) {
|
) {
|
||||||
if ((rate =
|
if (share->static_key_cardinality[inx] == -1)
|
||||||
((double) share->cardinality[field->field_index]) / weight) >= 1)
|
{
|
||||||
|
if ((rate =
|
||||||
|
((double) share->cardinality[field->field_index]) / weight) >= 1)
|
||||||
|
rows = rows / rate;
|
||||||
|
} else {
|
||||||
|
rate = ((double) share->static_key_cardinality[inx]);
|
||||||
rows = rows / rate;
|
rows = rows / rate;
|
||||||
|
}
|
||||||
} else if (start_key_part_map == end_key_part_map)
|
} else if (start_key_part_map == end_key_part_map)
|
||||||
{
|
{
|
||||||
if ((rate =
|
if (share->static_key_cardinality[inx] == -1)
|
||||||
((double) share->cardinality[field->field_index]) / weight / 4) >= 1)
|
{
|
||||||
rows = rows / rate;
|
if ((rate =
|
||||||
|
((double) share->cardinality[field->field_index]) / weight / 4) >= 1)
|
||||||
|
rows = rows / rate;
|
||||||
|
} else {
|
||||||
|
if ((rate =
|
||||||
|
((double) share->static_key_cardinality[inx]) / 4) >= 1)
|
||||||
|
rows = rows / rate;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((rate =
|
if (share->static_key_cardinality[inx] == -1)
|
||||||
((double) share->cardinality[field->field_index]) / weight / 16) >= 1)
|
{
|
||||||
rows = rows / rate;
|
if ((rate =
|
||||||
|
((double) share->cardinality[field->field_index]) / weight / 16) >= 1)
|
||||||
|
rows = rows / rate;
|
||||||
|
} else {
|
||||||
|
if ((rate =
|
||||||
|
((double) share->static_key_cardinality[inx]) / 16) >= 1)
|
||||||
|
rows = rows / rate;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (rows < 2)
|
if (rows < 2)
|
||||||
{
|
{
|
||||||
@ -10270,6 +10374,17 @@ ha_rows ha_spider::estimate_rows_upper_bound()
|
|||||||
DBUG_RETURN(HA_POS_ERROR);
|
DBUG_RETURN(HA_POS_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ha_spider::print_error(
|
||||||
|
int error,
|
||||||
|
myf errflag
|
||||||
|
) {
|
||||||
|
DBUG_ENTER("ha_spider::print_error");
|
||||||
|
DBUG_PRINT("info",("spider this=%p", this));
|
||||||
|
if (!current_thd->is_error())
|
||||||
|
handler::print_error(error, errflag);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
bool ha_spider::get_error_message(
|
bool ha_spider::get_error_message(
|
||||||
int error,
|
int error,
|
||||||
String *buf
|
String *buf
|
||||||
@ -10350,11 +10465,22 @@ int ha_spider::create(
|
|||||||
{
|
{
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (form->s->keys > 0 &&
|
if (form->s->keys > 0)
|
||||||
!(tmp_share.key_hint = new spider_string[form->s->keys])
|
{
|
||||||
) {
|
if (!(tmp_share.static_key_cardinality = (longlong *)
|
||||||
error_num = HA_ERR_OUT_OF_MEM;
|
spider_bulk_malloc(spider_current_trx, 246, MYF(MY_WME),
|
||||||
goto error;
|
&tmp_share.static_key_cardinality,
|
||||||
|
sizeof(*tmp_share.static_key_cardinality) * form->s->keys,
|
||||||
|
NullS))
|
||||||
|
) {
|
||||||
|
error_num = HA_ERR_OUT_OF_MEM;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (!(tmp_share.key_hint = new spider_string[form->s->keys]))
|
||||||
|
{
|
||||||
|
error_num = HA_ERR_OUT_OF_MEM;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (roop_count = 0; roop_count < form->s->keys; roop_count++)
|
for (roop_count = 0; roop_count < form->s->keys; roop_count++)
|
||||||
tmp_share.key_hint[roop_count].init_calc_mem(85);
|
tmp_share.key_hint[roop_count].init_calc_mem(85);
|
||||||
@ -10460,6 +10586,8 @@ int ha_spider::create(
|
|||||||
pthread_mutex_unlock(&tmp_share.lgtm_tblhnd_share->auto_increment_mutex);
|
pthread_mutex_unlock(&tmp_share.lgtm_tblhnd_share->auto_increment_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tmp_share.static_key_cardinality)
|
||||||
|
spider_free(spider_current_trx, tmp_share.static_key_cardinality, MYF(0));
|
||||||
spider_free_share_alloc(&tmp_share);
|
spider_free_share_alloc(&tmp_share);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
@ -10469,6 +10597,8 @@ error:
|
|||||||
&open_tables_backup, need_lock);
|
&open_tables_backup, need_lock);
|
||||||
if (tmp_share.lgtm_tblhnd_share)
|
if (tmp_share.lgtm_tblhnd_share)
|
||||||
spider_free_lgtm_tblhnd_share_alloc(tmp_share.lgtm_tblhnd_share, FALSE);
|
spider_free_lgtm_tblhnd_share_alloc(tmp_share.lgtm_tblhnd_share, FALSE);
|
||||||
|
if (tmp_share.static_key_cardinality)
|
||||||
|
spider_free(spider_current_trx, tmp_share.static_key_cardinality, MYF(0));
|
||||||
spider_free_share_alloc(&tmp_share);
|
spider_free_share_alloc(&tmp_share);
|
||||||
error_alter_before_unlock:
|
error_alter_before_unlock:
|
||||||
error_get_trx:
|
error_get_trx:
|
||||||
@ -10478,7 +10608,6 @@ error_get_trx:
|
|||||||
void ha_spider::update_create_info(
|
void ha_spider::update_create_info(
|
||||||
HA_CREATE_INFO* create_info
|
HA_CREATE_INFO* create_info
|
||||||
) {
|
) {
|
||||||
THD *thd = ha_thd();
|
|
||||||
DBUG_ENTER("ha_spider::update_create_info");
|
DBUG_ENTER("ha_spider::update_create_info");
|
||||||
DBUG_PRINT("info",("spider this=%p", this));
|
DBUG_PRINT("info",("spider this=%p", this));
|
||||||
if (!create_info->connect_string.str)
|
if (!create_info->connect_string.str)
|
||||||
@ -10495,13 +10624,6 @@ void ha_spider::update_create_info(
|
|||||||
info(HA_STATUS_AUTO);
|
info(HA_STATUS_AUTO);
|
||||||
create_info->auto_increment_value = stats.auto_increment_value;
|
create_info->auto_increment_value = stats.auto_increment_value;
|
||||||
}
|
}
|
||||||
if (
|
|
||||||
thd->is_error() &&
|
|
||||||
thd_sql_command(thd) == SQLCOM_SHOW_CREATE
|
|
||||||
) {
|
|
||||||
DBUG_PRINT("info", ("spider clear_error"));
|
|
||||||
thd->clear_error();
|
|
||||||
}
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11363,10 +11485,20 @@ void ha_spider::set_ft_discard_bitmap()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
item_next = ha_thd()->free_list;
|
THD *thd = ha_thd();
|
||||||
|
Statement *stmt = thd->stmt_map.find(thd->id);
|
||||||
|
if (stmt && stmt->free_list)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("spider item from stmt"));
|
||||||
|
item_next = stmt->free_list;
|
||||||
|
} else {
|
||||||
|
DBUG_PRINT("info",("spider item from thd"));
|
||||||
|
item_next = thd->free_list;
|
||||||
|
}
|
||||||
while ((item = item_next))
|
while ((item = item_next))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info",("spider item=%p", item));
|
DBUG_PRINT("info",("spider item=%p", item));
|
||||||
|
DBUG_PRINT("info",("spider itemtype=%u", item->type()));
|
||||||
item_next = item->next;
|
item_next = item->next;
|
||||||
if (item->type() != Item::FIELD_ITEM)
|
if (item->type() != Item::FIELD_ITEM)
|
||||||
continue;
|
continue;
|
||||||
|
@ -658,6 +658,10 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
const key_map *keys_to_use_for_scanning();
|
const key_map *keys_to_use_for_scanning();
|
||||||
ha_rows estimate_rows_upper_bound();
|
ha_rows estimate_rows_upper_bound();
|
||||||
|
void print_error(
|
||||||
|
int error,
|
||||||
|
myf errflag
|
||||||
|
);
|
||||||
bool get_error_message(
|
bool get_error_message(
|
||||||
int error,
|
int error,
|
||||||
String *buf
|
String *buf
|
||||||
|
@ -2505,14 +2505,21 @@ void *spider_bg_conn_action(
|
|||||||
) {
|
) {
|
||||||
if (thd->is_error())
|
if (thd->is_error())
|
||||||
{
|
{
|
||||||
SPIDER_BG_DIRECT_SQL *bg_direct_sql =
|
if (
|
||||||
(SPIDER_BG_DIRECT_SQL *) direct_sql->parent;
|
direct_sql->error_rw_mode &&
|
||||||
pthread_mutex_lock(direct_sql->bg_mutex);
|
spider_db_conn_is_network_error(error_num)
|
||||||
bg_direct_sql->bg_error = spider_stmt_da_sql_errno(thd);
|
) {
|
||||||
strmov((char *) bg_direct_sql->bg_error_msg,
|
thd->clear_error();
|
||||||
spider_stmt_da_message(thd));
|
} else {
|
||||||
pthread_mutex_unlock(direct_sql->bg_mutex);
|
SPIDER_BG_DIRECT_SQL *bg_direct_sql =
|
||||||
is_error = TRUE;
|
(SPIDER_BG_DIRECT_SQL *) direct_sql->parent;
|
||||||
|
pthread_mutex_lock(direct_sql->bg_mutex);
|
||||||
|
bg_direct_sql->bg_error = spider_stmt_da_sql_errno(thd);
|
||||||
|
strmov((char *) bg_direct_sql->bg_error_msg,
|
||||||
|
spider_stmt_da_message(thd));
|
||||||
|
pthread_mutex_unlock(direct_sql->bg_mutex);
|
||||||
|
is_error = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (direct_sql->modified_non_trans_table)
|
if (direct_sql->modified_non_trans_table)
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "sql_analyse.h"
|
#include "sql_analyse.h"
|
||||||
#include "sql_base.h"
|
#include "sql_base.h"
|
||||||
#include "tztime.h"
|
#include "tztime.h"
|
||||||
|
#include "errmsg.h"
|
||||||
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
||||||
#include "sql_select.h"
|
#include "sql_select.h"
|
||||||
#endif
|
#endif
|
||||||
@ -637,8 +638,11 @@ int spider_db_errorno(
|
|||||||
if (conn->server_lost)
|
if (conn->server_lost)
|
||||||
{
|
{
|
||||||
*conn->need_mon = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM;
|
*conn->need_mon = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM;
|
||||||
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
|
if (!current_thd->is_error())
|
||||||
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
|
{
|
||||||
|
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
|
||||||
|
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
|
||||||
|
}
|
||||||
if (!conn->mta_conn_mutex_unlock_later)
|
if (!conn->mta_conn_mutex_unlock_later)
|
||||||
{
|
{
|
||||||
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
|
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
|
||||||
@ -3199,7 +3203,8 @@ void spider_db_free_one_result_for_start_next(
|
|||||||
result = (SPIDER_RESULT *) result_list->current;
|
result = (SPIDER_RESULT *) result_list->current;
|
||||||
if (
|
if (
|
||||||
!result->result &&
|
!result->result &&
|
||||||
!result->first_position
|
!result->first_position &&
|
||||||
|
!result->tmp_tbl_use_position
|
||||||
)
|
)
|
||||||
result_list->current = result->prev;
|
result_list->current = result->prev;
|
||||||
}
|
}
|
||||||
@ -3263,6 +3268,35 @@ void spider_db_free_one_result(
|
|||||||
position[roop_count].row = NULL;
|
position[roop_count].row = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (result_list->quick_mode == 3)
|
||||||
|
{
|
||||||
|
if (!result->first_pos_use_position)
|
||||||
|
{
|
||||||
|
spider_free(spider_current_trx, position, MYF(0));
|
||||||
|
result->first_position = NULL;
|
||||||
|
}
|
||||||
|
if (result->result)
|
||||||
|
{
|
||||||
|
result->result->free_result();
|
||||||
|
delete result->result;
|
||||||
|
result->result = NULL;
|
||||||
|
}
|
||||||
|
if (!result->tmp_tbl_use_position)
|
||||||
|
{
|
||||||
|
if (result->result_tmp_tbl)
|
||||||
|
{
|
||||||
|
if (result->result_tmp_tbl_inited)
|
||||||
|
{
|
||||||
|
result->result_tmp_tbl->file->ha_rnd_end();
|
||||||
|
result->result_tmp_tbl_inited = 0;
|
||||||
|
}
|
||||||
|
spider_rm_sys_tmp_table_for_result(result->result_tmp_tbl_thd,
|
||||||
|
result->result_tmp_tbl, &result->result_tmp_tbl_prm);
|
||||||
|
result->result_tmp_tbl = NULL;
|
||||||
|
result->result_tmp_tbl_thd = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
@ -3472,6 +3506,8 @@ int spider_db_free_result(
|
|||||||
result->record_num = 0;
|
result->record_num = 0;
|
||||||
DBUG_PRINT("info",("spider result->finish_flg = FALSE"));
|
DBUG_PRINT("info",("spider result->finish_flg = FALSE"));
|
||||||
result->finish_flg = FALSE;
|
result->finish_flg = FALSE;
|
||||||
|
result->first_pos_use_position = FALSE;
|
||||||
|
result->tmp_tbl_use_position = FALSE;
|
||||||
result->use_position = FALSE;
|
result->use_position = FALSE;
|
||||||
result = (SPIDER_RESULT*) result->next;
|
result = (SPIDER_RESULT*) result->next;
|
||||||
}
|
}
|
||||||
@ -3872,8 +3908,10 @@ int spider_db_store_result(
|
|||||||
DBUG_PRINT("info", ("spider conn[%p]->quick_target=NULL", conn));
|
DBUG_PRINT("info", ("spider conn[%p]->quick_target=NULL", conn));
|
||||||
conn->quick_target = NULL;
|
conn->quick_target = NULL;
|
||||||
spider->quick_targets[link_idx] = NULL;
|
spider->quick_targets[link_idx] = NULL;
|
||||||
} else if (result_list->limit_num == roop_count)
|
} else if (
|
||||||
{
|
result_list->quick_mode == 3 ||
|
||||||
|
result_list->limit_num == roop_count
|
||||||
|
) {
|
||||||
current->result->free_result();
|
current->result->free_result();
|
||||||
if (!current->result_tmp_tbl)
|
if (!current->result_tmp_tbl)
|
||||||
{
|
{
|
||||||
@ -4176,6 +4214,7 @@ int spider_db_seek_next(
|
|||||||
spider_next_split_read_param(spider);
|
spider_next_split_read_param(spider);
|
||||||
if (
|
if (
|
||||||
result_list->quick_mode == 0 ||
|
result_list->quick_mode == 0 ||
|
||||||
|
result_list->quick_mode == 3 ||
|
||||||
!result_list->current->result
|
!result_list->current->result
|
||||||
) {
|
) {
|
||||||
result_list->limit_num =
|
result_list->limit_num =
|
||||||
@ -4839,6 +4878,7 @@ void spider_db_create_position(
|
|||||||
tmp_pos->use_position = TRUE;
|
tmp_pos->use_position = TRUE;
|
||||||
tmp_pos->pos_mode = 0;
|
tmp_pos->pos_mode = 0;
|
||||||
pos->pos_mode = 0;
|
pos->pos_mode = 0;
|
||||||
|
current->first_pos_use_position = TRUE;
|
||||||
} else {
|
} else {
|
||||||
TABLE *tmp_tbl = current->result_tmp_tbl;
|
TABLE *tmp_tbl = current->result_tmp_tbl;
|
||||||
pos->row = NULL;
|
pos->row = NULL;
|
||||||
@ -4848,6 +4888,7 @@ void spider_db_create_position(
|
|||||||
DBUG_PRINT("info",("spider tmp_tbl->file->ref=%p", tmp_tbl->file->ref));
|
DBUG_PRINT("info",("spider tmp_tbl->file->ref=%p", tmp_tbl->file->ref));
|
||||||
tmp_tbl->file->ref = (uchar *) &pos->tmp_tbl_pos;
|
tmp_tbl->file->ref = (uchar *) &pos->tmp_tbl_pos;
|
||||||
tmp_tbl->file->position(tmp_tbl->record[0]);
|
tmp_tbl->file->position(tmp_tbl->record[0]);
|
||||||
|
current->tmp_tbl_use_position = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
current->use_position = TRUE;
|
current->use_position = TRUE;
|
||||||
@ -10256,3 +10297,20 @@ void spider_db_hs_request_buf_reset(
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool spider_db_conn_is_network_error(
|
||||||
|
int error_num
|
||||||
|
) {
|
||||||
|
DBUG_ENTER("spider_db_conn_is_network_error");
|
||||||
|
if (
|
||||||
|
error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM ||
|
||||||
|
error_num == ER_CONNECT_TO_FOREIGN_DATA_SOURCE ||
|
||||||
|
(
|
||||||
|
error_num >= CR_MIN_ERROR &&
|
||||||
|
error_num <= CR_MAX_ERROR
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
|
DBUG_RETURN(FALSE);
|
||||||
|
}
|
||||||
|
@ -69,6 +69,8 @@
|
|||||||
#define SPIDER_SQL_UPDATE_LEN (sizeof(SPIDER_SQL_UPDATE_STR) - 1)
|
#define SPIDER_SQL_UPDATE_LEN (sizeof(SPIDER_SQL_UPDATE_STR) - 1)
|
||||||
#define SPIDER_SQL_DELETE_STR "delete "
|
#define SPIDER_SQL_DELETE_STR "delete "
|
||||||
#define SPIDER_SQL_DELETE_LEN (sizeof(SPIDER_SQL_DELETE_STR) - 1)
|
#define SPIDER_SQL_DELETE_LEN (sizeof(SPIDER_SQL_DELETE_STR) - 1)
|
||||||
|
#define SPIDER_SQL_DISTINCT_STR "distinct "
|
||||||
|
#define SPIDER_SQL_DISTINCT_LEN (sizeof(SPIDER_SQL_DISTINCT_STR) - 1)
|
||||||
#define SPIDER_SQL_HIGH_PRIORITY_STR "high_priority "
|
#define SPIDER_SQL_HIGH_PRIORITY_STR "high_priority "
|
||||||
#define SPIDER_SQL_HIGH_PRIORITY_LEN (sizeof(SPIDER_SQL_HIGH_PRIORITY_STR) - 1)
|
#define SPIDER_SQL_HIGH_PRIORITY_LEN (sizeof(SPIDER_SQL_HIGH_PRIORITY_STR) - 1)
|
||||||
#define SPIDER_SQL_LOW_PRIORITY_STR "low_priority "
|
#define SPIDER_SQL_LOW_PRIORITY_STR "low_priority "
|
||||||
@ -1049,3 +1051,7 @@ void spider_db_hs_request_buf_reset(
|
|||||||
SPIDER_CONN *conn
|
SPIDER_CONN *conn
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool spider_db_conn_is_network_error(
|
||||||
|
int error_num
|
||||||
|
);
|
||||||
|
@ -493,7 +493,6 @@ public:
|
|||||||
uint32 arg_length,
|
uint32 arg_length,
|
||||||
uint32 step_alloc
|
uint32 step_alloc
|
||||||
);
|
);
|
||||||
#ifdef SPIDER_HAS_APPEND_FOR_SINGLE_QUOTE
|
|
||||||
bool append_for_single_quote(
|
bool append_for_single_quote(
|
||||||
const char *st,
|
const char *st,
|
||||||
uint len
|
uint len
|
||||||
@ -504,7 +503,6 @@ public:
|
|||||||
bool append_for_single_quote(
|
bool append_for_single_quote(
|
||||||
const char *st
|
const char *st
|
||||||
);
|
);
|
||||||
#endif
|
|
||||||
void print(
|
void print(
|
||||||
String *print
|
String *print
|
||||||
);
|
);
|
||||||
@ -1566,6 +1564,8 @@ typedef struct st_spider_result
|
|||||||
longlong record_num;
|
longlong record_num;
|
||||||
bool finish_flg;
|
bool finish_flg;
|
||||||
bool use_position;
|
bool use_position;
|
||||||
|
bool first_pos_use_position;
|
||||||
|
bool tmp_tbl_use_position;
|
||||||
uint field_count; /* for quick mode */
|
uint field_count; /* for quick mode */
|
||||||
TABLE *result_tmp_tbl;
|
TABLE *result_tmp_tbl;
|
||||||
TMP_TABLE_PARAM result_tmp_tbl_prm;
|
TMP_TABLE_PARAM result_tmp_tbl_prm;
|
||||||
@ -1642,6 +1642,7 @@ typedef struct st_spider_result_list
|
|||||||
spider_bulk_upd_start bulk_update_start;
|
spider_bulk_upd_start bulk_update_start;
|
||||||
bool check_direct_order_limit;
|
bool check_direct_order_limit;
|
||||||
bool direct_order_limit;
|
bool direct_order_limit;
|
||||||
|
bool direct_distinct;
|
||||||
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
||||||
bool direct_aggregate;
|
bool direct_aggregate;
|
||||||
bool snap_mrr_with_cnt;
|
bool snap_mrr_with_cnt;
|
||||||
|
@ -919,13 +919,13 @@ int spider_db_mysql_result::fetch_table_cardinality(
|
|||||||
Field *field;
|
Field *field;
|
||||||
DBUG_ENTER("spider_db_mysql_result::fetch_table_cardinality");
|
DBUG_ENTER("spider_db_mysql_result::fetch_table_cardinality");
|
||||||
DBUG_PRINT("info",("spider this=%p", this));
|
DBUG_PRINT("info",("spider this=%p", this));
|
||||||
|
memset((uchar *) cardinality_upd, 0, sizeof(uchar) * bitmap_size);
|
||||||
if (!(mysql_row = mysql_fetch_row(db_result)))
|
if (!(mysql_row = mysql_fetch_row(db_result)))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info",("spider fetch row is null"));
|
DBUG_PRINT("info",("spider fetch row is null"));
|
||||||
/* no index */
|
/* no index */
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
memset((uchar *) cardinality_upd, 0, sizeof(uchar) * bitmap_size);
|
|
||||||
if (mode == 1)
|
if (mode == 1)
|
||||||
{
|
{
|
||||||
uint num_fields = this->num_fields();
|
uint num_fields = this->num_fields();
|
||||||
@ -2096,6 +2096,7 @@ int spider_db_mysql::rollback(
|
|||||||
int error_num;
|
int error_num;
|
||||||
DBUG_ENTER("spider_db_mysql::rollback");
|
DBUG_ENTER("spider_db_mysql::rollback");
|
||||||
DBUG_PRINT("info",("spider this=%p", this));
|
DBUG_PRINT("info",("spider this=%p", this));
|
||||||
|
conn->mta_conn_mutex_unlock_later = TRUE;
|
||||||
if (spider_db_query(
|
if (spider_db_query(
|
||||||
conn,
|
conn,
|
||||||
SPIDER_SQL_ROLLBACK_STR,
|
SPIDER_SQL_ROLLBACK_STR,
|
||||||
@ -2104,7 +2105,6 @@ int spider_db_mysql::rollback(
|
|||||||
need_mon)
|
need_mon)
|
||||||
) {
|
) {
|
||||||
is_error = conn->thd->is_error();
|
is_error = conn->thd->is_error();
|
||||||
conn->mta_conn_mutex_unlock_later = TRUE;
|
|
||||||
error_num = spider_db_errorno(conn);
|
error_num = spider_db_errorno(conn);
|
||||||
if (
|
if (
|
||||||
error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
|
error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
|
||||||
@ -4814,6 +4814,21 @@ int spider_mysql_share::discover_table_structure(
|
|||||||
) {
|
) {
|
||||||
DBUG_RETURN(error_num);
|
DBUG_RETURN(error_num);
|
||||||
}
|
}
|
||||||
|
if (!conn->disable_reconnect)
|
||||||
|
{
|
||||||
|
ha_spider tmp_spider;
|
||||||
|
int need_mon = 0;
|
||||||
|
uint tmp_conn_link_idx = 0;
|
||||||
|
tmp_spider.trx = trx;
|
||||||
|
tmp_spider.share = spider_share;
|
||||||
|
tmp_spider.need_mons = &need_mon;
|
||||||
|
tmp_spider.conn_link_idx = &tmp_conn_link_idx;
|
||||||
|
if ((error_num = spider_db_ping(&tmp_spider, conn, 0)))
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("spider spider_db_ping error"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
pthread_mutex_lock(&conn->mta_conn_mutex);
|
pthread_mutex_lock(&conn->mta_conn_mutex);
|
||||||
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
|
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
|
||||||
conn->need_mon = &need_mon;
|
conn->need_mon = &need_mon;
|
||||||
@ -4879,6 +4894,11 @@ int spider_mysql_share::discover_table_structure(
|
|||||||
conn->mta_conn_mutex_unlock_later = FALSE;
|
conn->mta_conn_mutex_unlock_later = FALSE;
|
||||||
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
|
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
|
||||||
pthread_mutex_unlock(&conn->mta_conn_mutex);
|
pthread_mutex_unlock(&conn->mta_conn_mutex);
|
||||||
|
my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
|
||||||
|
ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
|
||||||
|
db_names_str[roop_count].ptr(),
|
||||||
|
table_names_str[roop_count].ptr());
|
||||||
|
error_num = ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
res->free_result();
|
res->free_result();
|
||||||
@ -6238,6 +6258,12 @@ int spider_mysql_handler::append_select(
|
|||||||
if (str->reserve(SPIDER_SQL_SELECT_LEN))
|
if (str->reserve(SPIDER_SQL_SELECT_LEN))
|
||||||
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
||||||
str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
|
str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
|
||||||
|
if (result_list->direct_distinct)
|
||||||
|
{
|
||||||
|
if (str->reserve(SPIDER_SQL_DISTINCT_LEN))
|
||||||
|
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 (result_list->lock_type != F_WRLCK && spider->lock_mode < 1)
|
||||||
{
|
{
|
||||||
/* no lock */
|
/* no lock */
|
||||||
@ -10328,6 +10354,14 @@ int spider_mysql_handler::show_table_status(
|
|||||||
DBUG_RETURN(error_num);
|
DBUG_RETURN(error_num);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (share->static_records_for_status != -1)
|
||||||
|
{
|
||||||
|
share->records = (ha_rows) share->static_records_for_status;
|
||||||
|
}
|
||||||
|
if (share->static_mean_rec_length != -1)
|
||||||
|
{
|
||||||
|
share->mean_rec_length = (ulong) share->static_mean_rec_length;
|
||||||
|
}
|
||||||
if (auto_increment_value > share->lgtm_tblhnd_share->auto_increment_value)
|
if (auto_increment_value > share->lgtm_tblhnd_share->auto_increment_value)
|
||||||
{
|
{
|
||||||
share->lgtm_tblhnd_share->auto_increment_value = auto_increment_value;
|
share->lgtm_tblhnd_share->auto_increment_value = auto_increment_value;
|
||||||
@ -10462,8 +10496,8 @@ int spider_mysql_handler::show_index(
|
|||||||
if (!spider_bit_is_set(share->cardinality_upd, roop_count))
|
if (!spider_bit_is_set(share->cardinality_upd, roop_count))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info",
|
DBUG_PRINT("info",
|
||||||
("spider init column cardinality id=%d", roop_count));
|
("spider uninitialized column cardinality id=%d", roop_count));
|
||||||
*tmp_cardinality = 1;
|
*tmp_cardinality = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (res)
|
if (res)
|
||||||
@ -10596,8 +10630,8 @@ int spider_mysql_handler::show_index(
|
|||||||
if (!spider_bit_is_set(share->cardinality_upd, roop_count))
|
if (!spider_bit_is_set(share->cardinality_upd, roop_count))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info",
|
DBUG_PRINT("info",
|
||||||
("spider init column cardinality id=%d", roop_count));
|
("spider uninitialized column cardinality id=%d", roop_count));
|
||||||
*tmp_cardinality = 1;
|
*tmp_cardinality = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (res)
|
if (res)
|
||||||
|
@ -5935,6 +5935,12 @@ int spider_oracle_handler::append_select(
|
|||||||
if (str->reserve(SPIDER_SQL_SELECT_LEN))
|
if (str->reserve(SPIDER_SQL_SELECT_LEN))
|
||||||
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
||||||
str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
|
str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
|
||||||
|
if (spider->result_list.direct_distinct)
|
||||||
|
{
|
||||||
|
if (str->reserve(SPIDER_SQL_DISTINCT_LEN))
|
||||||
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
||||||
|
str->q_append(SPIDER_SQL_DISTINCT_STR, SPIDER_SQL_DISTINCT_LEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
@ -1045,6 +1045,7 @@ int spider_udf_parse_direct_sql_param(
|
|||||||
#else
|
#else
|
||||||
direct_sql->use_real_table = -1;
|
direct_sql->use_real_table = -1;
|
||||||
#endif
|
#endif
|
||||||
|
direct_sql->error_rw_mode = -1;
|
||||||
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
|
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
|
||||||
direct_sql->iop[roop_count] = -1;
|
direct_sql->iop[roop_count] = -1;
|
||||||
|
|
||||||
@ -1123,9 +1124,10 @@ int spider_udf_parse_direct_sql_param(
|
|||||||
MYF(0), tmp_ptr);
|
MYF(0), tmp_ptr);
|
||||||
goto error;
|
goto error;
|
||||||
case 4:
|
case 4:
|
||||||
|
SPIDER_PARAM_INT_WITH_MAX("erwm", error_rw_mode, 0, 1);
|
||||||
SPIDER_PARAM_STR("host", tgt_host);
|
SPIDER_PARAM_STR("host", tgt_host);
|
||||||
SPIDER_PARAM_STR("user", tgt_username);
|
|
||||||
SPIDER_PARAM_INT_WITH_MAX("port", tgt_port, 0, 65535);
|
SPIDER_PARAM_INT_WITH_MAX("port", tgt_port, 0, 65535);
|
||||||
|
SPIDER_PARAM_STR("user", tgt_username);
|
||||||
error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
|
error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
|
||||||
my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
|
my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
|
||||||
MYF(0), tmp_ptr);
|
MYF(0), tmp_ptr);
|
||||||
@ -1178,6 +1180,7 @@ int spider_udf_parse_direct_sql_param(
|
|||||||
goto error;
|
goto error;
|
||||||
case 13:
|
case 13:
|
||||||
SPIDER_PARAM_STR("default_group", tgt_default_group);
|
SPIDER_PARAM_STR("default_group", tgt_default_group);
|
||||||
|
SPIDER_PARAM_INT_WITH_MAX("error_rw_mode", error_rw_mode, 0, 1);
|
||||||
error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
|
error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
|
||||||
my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
|
my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
|
||||||
MYF(0), tmp_ptr);
|
MYF(0), tmp_ptr);
|
||||||
@ -1400,6 +1403,8 @@ int spider_udf_set_direct_sql_param_default(
|
|||||||
if (direct_sql->use_real_table == -1)
|
if (direct_sql->use_real_table == -1)
|
||||||
direct_sql->use_real_table = 0;
|
direct_sql->use_real_table = 0;
|
||||||
#endif
|
#endif
|
||||||
|
if (direct_sql->error_rw_mode == -1)
|
||||||
|
direct_sql->error_rw_mode = 0;
|
||||||
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
|
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
|
||||||
{
|
{
|
||||||
if (direct_sql->iop[roop_count] == -1)
|
if (direct_sql->iop[roop_count] == -1)
|
||||||
@ -1526,12 +1531,14 @@ long long spider_direct_sql_body(
|
|||||||
uint use_real_table = 0;
|
uint use_real_table = 0;
|
||||||
#endif
|
#endif
|
||||||
DBUG_ENTER("spider_direct_sql_body");
|
DBUG_ENTER("spider_direct_sql_body");
|
||||||
|
SPIDER_BACKUP_DASTATUS;
|
||||||
if (!(direct_sql = (SPIDER_DIRECT_SQL *)
|
if (!(direct_sql = (SPIDER_DIRECT_SQL *)
|
||||||
spider_bulk_malloc(spider_current_trx, 34, MYF(MY_WME | MY_ZEROFILL),
|
spider_bulk_malloc(spider_current_trx, 34, MYF(MY_WME | MY_ZEROFILL),
|
||||||
&direct_sql, sizeof(SPIDER_DIRECT_SQL),
|
&direct_sql, sizeof(SPIDER_DIRECT_SQL),
|
||||||
&sql, sizeof(char) * args->lengths[0],
|
&sql, sizeof(char) * args->lengths[0],
|
||||||
NullS))
|
NullS))
|
||||||
) {
|
) {
|
||||||
|
error_num = HA_ERR_OUT_OF_MEM;
|
||||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -1556,48 +1563,51 @@ long long spider_direct_sql_body(
|
|||||||
#endif
|
#endif
|
||||||
if (!(trx = spider_get_trx(thd, TRUE, &error_num)))
|
if (!(trx = spider_get_trx(thd, TRUE, &error_num)))
|
||||||
{
|
{
|
||||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
||||||
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
direct_sql->trx = trx;
|
direct_sql->trx = trx;
|
||||||
|
|
||||||
if (args->args[1])
|
if (args->args[1])
|
||||||
{
|
{
|
||||||
if (spider_udf_direct_sql_create_table_list(
|
if ((error_num = spider_udf_direct_sql_create_table_list(
|
||||||
direct_sql,
|
direct_sql,
|
||||||
args->args[1],
|
args->args[1],
|
||||||
args->lengths[1]
|
args->lengths[1]
|
||||||
)) {
|
))) {
|
||||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
||||||
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (spider_udf_direct_sql_create_table_list(
|
if ((error_num = spider_udf_direct_sql_create_table_list(
|
||||||
direct_sql,
|
direct_sql,
|
||||||
(char *) "",
|
(char *) "",
|
||||||
0
|
0
|
||||||
)) {
|
))) {
|
||||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
||||||
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (args->args[2])
|
if (args->args[2])
|
||||||
{
|
{
|
||||||
if (spider_udf_parse_direct_sql_param(
|
if ((error_num = spider_udf_parse_direct_sql_param(
|
||||||
trx,
|
trx,
|
||||||
direct_sql,
|
direct_sql,
|
||||||
args->args[2],
|
args->args[2],
|
||||||
args->lengths[2]
|
args->lengths[2]
|
||||||
)) {
|
))) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (spider_udf_parse_direct_sql_param(
|
if ((error_num = spider_udf_parse_direct_sql_param(
|
||||||
trx,
|
trx,
|
||||||
direct_sql,
|
direct_sql,
|
||||||
"",
|
"",
|
||||||
0
|
0
|
||||||
)) {
|
))) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1626,6 +1636,7 @@ long long spider_direct_sql_body(
|
|||||||
if (!use_real_table)
|
if (!use_real_table)
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
error_num = ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_NUM;
|
||||||
my_printf_error(ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_NUM,
|
my_printf_error(ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_NUM,
|
||||||
ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_STR,
|
ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_STR,
|
||||||
MYF(0), table_list.db, table_list.table_name);
|
MYF(0), table_list.db, table_list.table_name);
|
||||||
@ -1651,20 +1662,24 @@ long long spider_direct_sql_body(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (spider_udf_direct_sql_create_conn_key(direct_sql))
|
if ((error_num = spider_udf_direct_sql_create_conn_key(direct_sql)))
|
||||||
{
|
{
|
||||||
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
||||||
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (!(conn = spider_udf_direct_sql_get_conn(direct_sql, trx, &error_num)))
|
if (!(conn = spider_udf_direct_sql_get_conn(direct_sql, trx, &error_num)))
|
||||||
{
|
{
|
||||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
||||||
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
conn->error_mode = 0;
|
conn->error_mode = 0;
|
||||||
direct_sql->conn = conn;
|
direct_sql->conn = conn;
|
||||||
if (spider_db_udf_check_and_set_set_names(trx))
|
if ((error_num = spider_db_udf_check_and_set_set_names(trx)))
|
||||||
{
|
{
|
||||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
||||||
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (args->args[0])
|
if (args->args[0])
|
||||||
@ -1678,21 +1693,24 @@ long long spider_direct_sql_body(
|
|||||||
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
||||||
if (bg)
|
if (bg)
|
||||||
{
|
{
|
||||||
if (spider_udf_bg_direct_sql(direct_sql))
|
if ((error_num = spider_udf_bg_direct_sql(direct_sql)))
|
||||||
{
|
{
|
||||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
||||||
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#endif
|
#endif
|
||||||
if (conn->bg_init)
|
if (conn->bg_init)
|
||||||
pthread_mutex_lock(&conn->bg_conn_mutex);
|
pthread_mutex_lock(&conn->bg_conn_mutex);
|
||||||
if (spider_db_udf_direct_sql(direct_sql))
|
if ((error_num = spider_db_udf_direct_sql(direct_sql)))
|
||||||
{
|
{
|
||||||
if (conn->bg_init)
|
if (conn->bg_init)
|
||||||
pthread_mutex_unlock(&conn->bg_conn_mutex);
|
pthread_mutex_unlock(&conn->bg_conn_mutex);
|
||||||
if (direct_sql->modified_non_trans_table)
|
if (direct_sql->modified_non_trans_table)
|
||||||
thd->transaction.stmt.modified_non_trans_table = TRUE;
|
thd->transaction.stmt.modified_non_trans_table = TRUE;
|
||||||
|
if (error_num == HA_ERR_OUT_OF_MEM)
|
||||||
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (conn->bg_init)
|
if (conn->bg_init)
|
||||||
@ -1712,7 +1730,17 @@ long long spider_direct_sql_body(
|
|||||||
|
|
||||||
error:
|
error:
|
||||||
if (direct_sql)
|
if (direct_sql)
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
direct_sql->error_rw_mode &&
|
||||||
|
spider_db_conn_is_network_error(error_num)
|
||||||
|
) {
|
||||||
|
SPIDER_RESTORE_DASTATUS;
|
||||||
|
spider_udf_free_direct_sql_alloc(direct_sql, bg);
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
spider_udf_free_direct_sql_alloc(direct_sql, bg);
|
spider_udf_free_direct_sql_alloc(direct_sql, bg);
|
||||||
|
}
|
||||||
*error = 1;
|
*error = 1;
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
@ -1790,6 +1818,15 @@ void spider_direct_sql_deinit_body(
|
|||||||
DBUG_ENTER("spider_direct_sql_deinit_body");
|
DBUG_ENTER("spider_direct_sql_deinit_body");
|
||||||
if (bg_direct_sql)
|
if (bg_direct_sql)
|
||||||
{
|
{
|
||||||
|
pthread_mutex_lock(&bg_direct_sql->bg_mutex);
|
||||||
|
while (bg_direct_sql->direct_sql)
|
||||||
|
pthread_cond_wait(&bg_direct_sql->bg_cond, &bg_direct_sql->bg_mutex);
|
||||||
|
pthread_mutex_unlock(&bg_direct_sql->bg_mutex);
|
||||||
|
if (bg_direct_sql->modified_non_trans_table)
|
||||||
|
{
|
||||||
|
THD *thd = current_thd;
|
||||||
|
thd->transaction.stmt.modified_non_trans_table = TRUE;
|
||||||
|
}
|
||||||
pthread_cond_destroy(&bg_direct_sql->bg_cond);
|
pthread_cond_destroy(&bg_direct_sql->bg_cond);
|
||||||
pthread_mutex_destroy(&bg_direct_sql->bg_mutex);
|
pthread_mutex_destroy(&bg_direct_sql->bg_mutex);
|
||||||
spider_free(spider_current_trx, bg_direct_sql, MYF(0));
|
spider_free(spider_current_trx, bg_direct_sql, MYF(0));
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
#define SPIDER_DETAIL_VERSION "3.2.4"
|
#define SPIDER_DETAIL_VERSION "3.2.11"
|
||||||
#define SPIDER_HEX_VERSION 0x0302
|
#define SPIDER_HEX_VERSION 0x0302
|
||||||
|
|
||||||
#if MYSQL_VERSION_ID < 50500
|
#if MYSQL_VERSION_ID < 50500
|
||||||
@ -138,7 +138,7 @@
|
|||||||
#define SPIDER_TMP_SHARE_LONG_COUNT 15
|
#define SPIDER_TMP_SHARE_LONG_COUNT 15
|
||||||
#define SPIDER_TMP_SHARE_LONGLONG_COUNT 3
|
#define SPIDER_TMP_SHARE_LONGLONG_COUNT 3
|
||||||
|
|
||||||
#define SPIDER_MEM_CALC_LIST_NUM 246
|
#define SPIDER_MEM_CALC_LIST_NUM 247
|
||||||
|
|
||||||
#define SPIDER_BACKUP_DASTATUS \
|
#define SPIDER_BACKUP_DASTATUS \
|
||||||
bool da_status; if (thd) da_status = thd->is_error(); else da_status = FALSE;
|
bool da_status; if (thd) da_status = thd->is_error(); else da_status = FALSE;
|
||||||
@ -709,9 +709,13 @@ typedef struct st_spider_share
|
|||||||
time_t create_time;
|
time_t create_time;
|
||||||
time_t update_time;
|
time_t update_time;
|
||||||
|
|
||||||
|
longlong static_records_for_status;
|
||||||
|
longlong static_mean_rec_length;
|
||||||
|
|
||||||
int bitmap_size;
|
int bitmap_size;
|
||||||
spider_string *key_hint;
|
spider_string *key_hint;
|
||||||
CHARSET_INFO *access_charset;
|
CHARSET_INFO *access_charset;
|
||||||
|
longlong *static_key_cardinality;
|
||||||
longlong *cardinality;
|
longlong *cardinality;
|
||||||
uchar *cardinality_upd;
|
uchar *cardinality_upd;
|
||||||
longlong additional_table_flags;
|
longlong additional_table_flags;
|
||||||
@ -1039,6 +1043,7 @@ typedef struct st_spider_direct_sql
|
|||||||
#else
|
#else
|
||||||
int use_real_table;
|
int use_real_table;
|
||||||
#endif
|
#endif
|
||||||
|
int error_rw_mode;
|
||||||
|
|
||||||
char *server_name;
|
char *server_name;
|
||||||
char *tgt_default_db_name;
|
char *tgt_default_db_name;
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "sql_priv.h"
|
#include "sql_priv.h"
|
||||||
#include "probes_mysql.h"
|
#include "probes_mysql.h"
|
||||||
#include "sql_class.h"
|
#include "sql_class.h"
|
||||||
|
#include "sql_analyse.h"
|
||||||
#endif
|
#endif
|
||||||
#include "spd_db_include.h"
|
#include "spd_db_include.h"
|
||||||
#include "spd_include.h"
|
#include "spd_include.h"
|
||||||
@ -1251,7 +1252,7 @@ bool spider_string::append_for_single_quote(
|
|||||||
#ifdef SPIDER_HAS_APPEND_FOR_SINGLE_QUOTE
|
#ifdef SPIDER_HAS_APPEND_FOR_SINGLE_QUOTE
|
||||||
bool res = str.append_for_single_quote(s);
|
bool res = str.append_for_single_quote(s);
|
||||||
#else
|
#else
|
||||||
bool res = append_escaped(&str, s);
|
bool res = append_escaped(&str, (String *) s);
|
||||||
#endif
|
#endif
|
||||||
SPIDER_STRING_CALC_MEM;
|
SPIDER_STRING_CALC_MEM;
|
||||||
DBUG_RETURN(res);
|
DBUG_RETURN(res);
|
||||||
|
@ -25,10 +25,8 @@
|
|||||||
#include "sql_class.h"
|
#include "sql_class.h"
|
||||||
#include "sql_partition.h"
|
#include "sql_partition.h"
|
||||||
#include "sql_servers.h"
|
#include "sql_servers.h"
|
||||||
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
|
||||||
#include "sql_select.h"
|
#include "sql_select.h"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
#include "spd_err.h"
|
#include "spd_err.h"
|
||||||
#include "spd_param.h"
|
#include "spd_param.h"
|
||||||
#include "spd_db_include.h"
|
#include "spd_db_include.h"
|
||||||
@ -907,6 +905,8 @@ void spider_free_tmp_share_alloc(
|
|||||||
spider_free(spider_current_trx, share->conn_keys, MYF(0));
|
spider_free(spider_current_trx, share->conn_keys, MYF(0));
|
||||||
share->conn_keys = NULL;
|
share->conn_keys = NULL;
|
||||||
}
|
}
|
||||||
|
if (share->static_key_cardinality)
|
||||||
|
spider_free(spider_current_trx, share->static_key_cardinality, MYF(0));
|
||||||
if (share->key_hint)
|
if (share->key_hint)
|
||||||
{
|
{
|
||||||
delete [] share->key_hint;
|
delete [] share->key_hint;
|
||||||
@ -1476,6 +1476,16 @@ int spider_increase_longlong_list(
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int spider_set_ll_value(
|
||||||
|
longlong *value,
|
||||||
|
char *str
|
||||||
|
) {
|
||||||
|
int error_num = 0;
|
||||||
|
DBUG_ENTER("spider_set_ll_value");
|
||||||
|
*value = my_strtoll10(str, (char**) NULL, &error_num);
|
||||||
|
DBUG_RETURN(error_num);
|
||||||
|
}
|
||||||
|
|
||||||
#define SPIDER_PARAM_STR_LEN(name) name ## _length
|
#define SPIDER_PARAM_STR_LEN(name) name ## _length
|
||||||
#define SPIDER_PARAM_STR(title_name, param_name) \
|
#define SPIDER_PARAM_STR(title_name, param_name) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
||||||
@ -1556,6 +1566,38 @@ int spider_increase_longlong_list(
|
|||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
|
#define SPIDER_PARAM_NUMHINT(title_name, param_name, check_length, max_size, append_method) \
|
||||||
|
if (!strncasecmp(tmp_ptr, title_name, check_length)) \
|
||||||
|
{ \
|
||||||
|
DBUG_PRINT("info",("spider "title_name" start")); \
|
||||||
|
DBUG_PRINT("info",("spider max_size=%d", max_size)); \
|
||||||
|
int hint_num = atoi(tmp_ptr + check_length); \
|
||||||
|
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
|
||||||
|
DBUG_PRINT("info",("spider share->param_name=%p", share->param_name)); \
|
||||||
|
if (share->param_name) \
|
||||||
|
{ \
|
||||||
|
if (hint_num < 0 || hint_num >= max_size) \
|
||||||
|
{ \
|
||||||
|
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
|
||||||
|
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
|
||||||
|
MYF(0), tmp_ptr); \
|
||||||
|
goto error; \
|
||||||
|
} else if (share->param_name[hint_num] != -1) \
|
||||||
|
break; \
|
||||||
|
char *hint_str = spider_get_string_between_quote(start_ptr, FALSE); \
|
||||||
|
if ((error_num = \
|
||||||
|
append_method(&share->param_name[hint_num], hint_str))) \
|
||||||
|
goto error; \
|
||||||
|
DBUG_PRINT("info",("spider "title_name"[%d]=%lld", hint_num, \
|
||||||
|
share->param_name[hint_num])); \
|
||||||
|
} else { \
|
||||||
|
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
|
||||||
|
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
|
||||||
|
MYF(0), tmp_ptr); \
|
||||||
|
goto error; \
|
||||||
|
} \
|
||||||
|
break; \
|
||||||
|
}
|
||||||
#define SPIDER_PARAM_LONG_LEN(name) name ## _length
|
#define SPIDER_PARAM_LONG_LEN(name) name ## _length
|
||||||
#define SPIDER_PARAM_LONG_LIST_WITH_MAX(title_name, param_name, \
|
#define SPIDER_PARAM_LONG_LIST_WITH_MAX(title_name, param_name, \
|
||||||
min_val, max_val) \
|
min_val, max_val) \
|
||||||
@ -1817,6 +1859,12 @@ int spider_parse_connect_info(
|
|||||||
#endif
|
#endif
|
||||||
share->casual_read = -1;
|
share->casual_read = -1;
|
||||||
share->delete_all_rows_type = -1;
|
share->delete_all_rows_type = -1;
|
||||||
|
share->static_records_for_status = -1;
|
||||||
|
share->static_mean_rec_length = -1;
|
||||||
|
for (roop_count = 0; roop_count < (int) table_share->keys; roop_count++)
|
||||||
|
{
|
||||||
|
share->static_key_cardinality[roop_count] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
for (roop_count = 4; roop_count > 0; roop_count--)
|
for (roop_count = 4; roop_count > 0; roop_count--)
|
||||||
@ -2025,6 +2073,7 @@ int spider_parse_connect_info(
|
|||||||
SPIDER_PARAM_STR_LIST("sky", tgt_ssl_keys);
|
SPIDER_PARAM_STR_LIST("sky", tgt_ssl_keys);
|
||||||
SPIDER_PARAM_INT_WITH_MAX("slm", selupd_lock_mode, 0, 2);
|
SPIDER_PARAM_INT_WITH_MAX("slm", selupd_lock_mode, 0, 2);
|
||||||
SPIDER_PARAM_INT_WITH_MAX("smd", sts_mode, 1, 2);
|
SPIDER_PARAM_INT_WITH_MAX("smd", sts_mode, 1, 2);
|
||||||
|
SPIDER_PARAM_LONGLONG("smr", static_mean_rec_length, 0);
|
||||||
SPIDER_PARAM_LONGLONG("spr", split_read, 0);
|
SPIDER_PARAM_LONGLONG("spr", split_read, 0);
|
||||||
SPIDER_PARAM_STR_LIST("sqn", tgt_sequence_names);
|
SPIDER_PARAM_STR_LIST("sqn", tgt_sequence_names);
|
||||||
SPIDER_PARAM_LONGLONG("srd", second_read, 0);
|
SPIDER_PARAM_LONGLONG("srd", second_read, 0);
|
||||||
@ -2037,6 +2086,7 @@ int spider_parse_connect_info(
|
|||||||
#endif
|
#endif
|
||||||
SPIDER_PARAM_INT_WITH_MAX("stc", semi_table_lock_conn, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("stc", semi_table_lock_conn, 0, 1);
|
||||||
SPIDER_PARAM_INT_WITH_MAX("stl", semi_table_lock, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("stl", semi_table_lock, 0, 1);
|
||||||
|
SPIDER_PARAM_LONGLONG("srs", static_records_for_status, 0);
|
||||||
SPIDER_PARAM_LONG_LIST_WITH_MAX("svc", tgt_ssl_vscs, 0, 1);
|
SPIDER_PARAM_LONG_LIST_WITH_MAX("svc", tgt_ssl_vscs, 0, 1);
|
||||||
SPIDER_PARAM_STR_LIST("tbl", tgt_table_names);
|
SPIDER_PARAM_STR_LIST("tbl", tgt_table_names);
|
||||||
SPIDER_PARAM_INT_WITH_MAX("tcm", table_count_mode, 0, 3);
|
SPIDER_PARAM_INT_WITH_MAX("tcm", table_count_mode, 0, 3);
|
||||||
@ -2073,6 +2123,8 @@ int spider_parse_connect_info(
|
|||||||
SPIDER_PARAM_HINT("idx", key_hint, 3, (int) table_share->keys,
|
SPIDER_PARAM_HINT("idx", key_hint, 3, (int) table_share->keys,
|
||||||
spider_db_append_key_hint);
|
spider_db_append_key_hint);
|
||||||
SPIDER_PARAM_STR_LIST("ssl_ca", tgt_ssl_cas);
|
SPIDER_PARAM_STR_LIST("ssl_ca", tgt_ssl_cas);
|
||||||
|
SPIDER_PARAM_NUMHINT("skc", static_key_cardinality, 3,
|
||||||
|
(int) table_share->keys, spider_set_ll_value);
|
||||||
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
|
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
|
||||||
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
|
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
|
||||||
MYF(0), tmp_ptr);
|
MYF(0), tmp_ptr);
|
||||||
@ -2312,6 +2364,8 @@ int spider_parse_connect_info(
|
|||||||
#endif
|
#endif
|
||||||
SPIDER_PARAM_INT_WITH_MAX(
|
SPIDER_PARAM_INT_WITH_MAX(
|
||||||
"skip_default_condition", skip_default_condition, 0, 1);
|
"skip_default_condition", skip_default_condition, 0, 1);
|
||||||
|
SPIDER_PARAM_LONGLONG(
|
||||||
|
"static_mean_rec_length", static_mean_rec_length, 0);
|
||||||
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
|
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
|
||||||
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
|
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
|
||||||
MYF(0), tmp_ptr);
|
MYF(0), tmp_ptr);
|
||||||
@ -2323,6 +2377,15 @@ int spider_parse_connect_info(
|
|||||||
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
|
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
|
||||||
MYF(0), tmp_ptr);
|
MYF(0), tmp_ptr);
|
||||||
goto error;
|
goto error;
|
||||||
|
case 25:
|
||||||
|
SPIDER_PARAM_LONGLONG("static_records_for_status",
|
||||||
|
static_records_for_status, 0);
|
||||||
|
SPIDER_PARAM_NUMHINT("static_key_cardinality", static_key_cardinality,
|
||||||
|
3, (int) table_share->keys, spider_set_ll_value);
|
||||||
|
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
|
||||||
|
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
|
||||||
|
MYF(0), tmp_ptr);
|
||||||
|
goto error;
|
||||||
case 26:
|
case 26:
|
||||||
SPIDER_PARAM_INT_WITH_MAX(
|
SPIDER_PARAM_INT_WITH_MAX(
|
||||||
"semi_table_lock_connection", semi_table_lock_conn, 0, 1);
|
"semi_table_lock_connection", semi_table_lock_conn, 0, 1);
|
||||||
@ -3963,7 +4026,7 @@ SPIDER_SHARE *spider_create_share(
|
|||||||
int use_table_charset;
|
int use_table_charset;
|
||||||
SPIDER_SHARE *share;
|
SPIDER_SHARE *share;
|
||||||
char *tmp_name;
|
char *tmp_name;
|
||||||
longlong *tmp_cardinality;
|
longlong *tmp_cardinality, *tmp_static_key_cardinality;
|
||||||
uchar *tmp_cardinality_upd;
|
uchar *tmp_cardinality_upd;
|
||||||
DBUG_ENTER("spider_create_share");
|
DBUG_ENTER("spider_create_share");
|
||||||
length = (uint) strlen(table_name);
|
length = (uint) strlen(table_name);
|
||||||
@ -3972,6 +4035,7 @@ SPIDER_SHARE *spider_create_share(
|
|||||||
spider_bulk_malloc(spider_current_trx, 46, MYF(MY_WME | MY_ZEROFILL),
|
spider_bulk_malloc(spider_current_trx, 46, MYF(MY_WME | MY_ZEROFILL),
|
||||||
&share, sizeof(*share),
|
&share, sizeof(*share),
|
||||||
&tmp_name, length + 1,
|
&tmp_name, length + 1,
|
||||||
|
&tmp_static_key_cardinality, sizeof(*tmp_static_key_cardinality) * table_share->keys,
|
||||||
&tmp_cardinality, sizeof(*tmp_cardinality) * table_share->fields,
|
&tmp_cardinality, sizeof(*tmp_cardinality) * table_share->fields,
|
||||||
&tmp_cardinality_upd, sizeof(*tmp_cardinality_upd) * bitmap_size,
|
&tmp_cardinality_upd, sizeof(*tmp_cardinality_upd) * bitmap_size,
|
||||||
NullS))
|
NullS))
|
||||||
@ -3988,6 +4052,7 @@ SPIDER_SHARE *spider_create_share(
|
|||||||
share->table_name_length = length;
|
share->table_name_length = length;
|
||||||
share->table_name = tmp_name;
|
share->table_name = tmp_name;
|
||||||
strmov(share->table_name, table_name);
|
strmov(share->table_name, table_name);
|
||||||
|
share->static_key_cardinality = tmp_static_key_cardinality;
|
||||||
share->cardinality = tmp_cardinality;
|
share->cardinality = tmp_cardinality;
|
||||||
share->cardinality_upd = tmp_cardinality_upd;
|
share->cardinality_upd = tmp_cardinality_upd;
|
||||||
share->bitmap_size = bitmap_size;
|
share->bitmap_size = bitmap_size;
|
||||||
@ -7737,12 +7802,42 @@ longlong spider_split_read_param(
|
|||||||
result_list->set_split_read = TRUE;
|
result_list->set_split_read = TRUE;
|
||||||
DBUG_RETURN(9223372036854775807LL);
|
DBUG_RETURN(9223372036854775807LL);
|
||||||
}
|
}
|
||||||
|
Explain_query *explain = thd->lex->explain;
|
||||||
|
bool filesort = FALSE;
|
||||||
|
if (explain)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("spider explain=%p", explain));
|
||||||
|
Explain_select *explain_select = NULL;
|
||||||
|
if (select_lex)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("spider select_lex=%p", select_lex));
|
||||||
|
DBUG_PRINT("info",("spider select_number=%u",
|
||||||
|
select_lex->select_number));
|
||||||
|
explain_select =
|
||||||
|
explain->get_select(select_lex->select_number);
|
||||||
|
}
|
||||||
|
if (explain_select)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("spider explain_select=%p", explain_select));
|
||||||
|
if (explain_select->using_filesort)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("spider using filesort"));
|
||||||
|
filesort = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
result_list->split_read_base =
|
result_list->split_read_base =
|
||||||
spider_param_split_read(thd, share->split_read);
|
spider_param_split_read(thd, share->split_read);
|
||||||
result_list->semi_split_read =
|
if (filesort)
|
||||||
spider_param_semi_split_read(thd, share->semi_split_read);
|
{
|
||||||
result_list->semi_split_read_limit =
|
result_list->semi_split_read = 0;
|
||||||
spider_param_semi_split_read_limit(thd, share->semi_split_read_limit);
|
result_list->semi_split_read_limit = 9223372036854775807LL;
|
||||||
|
} else {
|
||||||
|
result_list->semi_split_read =
|
||||||
|
spider_param_semi_split_read(thd, share->semi_split_read);
|
||||||
|
result_list->semi_split_read_limit =
|
||||||
|
spider_param_semi_split_read_limit(thd, share->semi_split_read_limit);
|
||||||
|
}
|
||||||
result_list->first_read =
|
result_list->first_read =
|
||||||
spider_param_first_read(thd, share->first_read);
|
spider_param_first_read(thd, share->first_read);
|
||||||
result_list->second_read =
|
result_list->second_read =
|
||||||
@ -7864,6 +7959,12 @@ bool spider_check_direct_order_limit(
|
|||||||
DBUG_PRINT("info",("spider leaf_tables.elements=%u",
|
DBUG_PRINT("info",("spider leaf_tables.elements=%u",
|
||||||
select_lex->leaf_tables.elements));
|
select_lex->leaf_tables.elements));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (select_lex->options & SELECT_DISTINCT)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("spider with distinct"));
|
||||||
|
spider->result_list.direct_distinct = TRUE;
|
||||||
|
}
|
||||||
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
||||||
spider->result_list.direct_aggregate = TRUE;
|
spider->result_list.direct_aggregate = TRUE;
|
||||||
#endif
|
#endif
|
||||||
@ -7884,6 +7985,7 @@ bool spider_check_direct_order_limit(
|
|||||||
) {
|
) {
|
||||||
DBUG_PRINT("info",("spider first_check is FALSE"));
|
DBUG_PRINT("info",("spider first_check is FALSE"));
|
||||||
first_check = FALSE;
|
first_check = FALSE;
|
||||||
|
spider->result_list.direct_distinct = FALSE;
|
||||||
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
||||||
spider->result_list.direct_aggregate = FALSE;
|
spider->result_list.direct_aggregate = FALSE;
|
||||||
#endif
|
#endif
|
||||||
@ -7891,6 +7993,14 @@ bool spider_check_direct_order_limit(
|
|||||||
{
|
{
|
||||||
DBUG_PRINT("info",("spider FALSE by condition"));
|
DBUG_PRINT("info",("spider FALSE by condition"));
|
||||||
first_check = FALSE;
|
first_check = FALSE;
|
||||||
|
spider->result_list.direct_distinct = FALSE;
|
||||||
|
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
||||||
|
spider->result_list.direct_aggregate = FALSE;
|
||||||
|
#endif
|
||||||
|
} else if (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("spider sql_kinds with SPIDER_SQL_KIND_HANDLER"));
|
||||||
|
spider->result_list.direct_distinct = FALSE;
|
||||||
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
||||||
spider->result_list.direct_aggregate = FALSE;
|
spider->result_list.direct_aggregate = FALSE;
|
||||||
} else if (
|
} else if (
|
||||||
@ -7899,10 +8009,6 @@ bool spider_check_direct_order_limit(
|
|||||||
) {
|
) {
|
||||||
DBUG_PRINT("info",("spider this SQL is not aggregate SQL"));
|
DBUG_PRINT("info",("spider this SQL is not aggregate SQL"));
|
||||||
spider->result_list.direct_aggregate = FALSE;
|
spider->result_list.direct_aggregate = FALSE;
|
||||||
} else if (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER)
|
|
||||||
{
|
|
||||||
DBUG_PRINT("info",("spider sql_kinds with SPIDER_SQL_KIND_HANDLER"));
|
|
||||||
spider->result_list.direct_aggregate = FALSE;
|
|
||||||
} else {
|
} else {
|
||||||
ORDER *group;
|
ORDER *group;
|
||||||
for (group = (ORDER *) select_lex->group_list.first; group;
|
for (group = (ORDER *) select_lex->group_list.first; group;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user