mariadb/storage/spider/spd_db_conn.cc

12070 lines
398 KiB
C++
Raw Normal View History

/* Copyright (C) 2008-2019 Kentoku Shiba
2022-08-22 11:34:42 +02:00
Copyright (C) 2019, 2022, MariaDB Corporation.
2013-06-27 13:18:48 +02:00
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
2019-05-11 21:19:05 +02:00
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
2013-06-27 13:18:48 +02:00
#define MYSQL_SERVER 1
#include <my_global.h>
2013-06-27 13:18:48 +02:00
#include "mysql_version.h"
#include "spd_environ.h"
2013-06-27 13:18:48 +02:00
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
#else
#include "sql_priv.h"
#include "probes_mysql.h"
#include "sql_class.h"
#include "sql_partition.h"
#include "sql_analyse.h"
#include "sql_base.h"
#include "tztime.h"
2014-09-18 02:26:30 +02:00
#include "errmsg.h"
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
#include "sql_select.h"
#endif
2013-06-27 13:18:48 +02:00
#endif
#include "sql_common.h"
#include <errmsg.h>
#include "spd_err.h"
#include "spd_param.h"
#include "spd_db_include.h"
#include "spd_include.h"
#include "spd_sys_table.h"
#include "ha_spider.h"
#include "spd_db_conn.h"
#include "spd_table.h"
#include "spd_trx.h"
#include "spd_conn.h"
#include "spd_direct_sql.h"
#include "spd_ping_table.h"
#include "spd_copy_tables.h"
#include "spd_malloc.h"
extern handlerton *spider_hton_ptr;
extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
#define SPIDER_SQL_COALESCE_STR "coalesce("
#define SPIDER_SQL_COALESCE_LEN (sizeof(SPIDER_SQL_COALESCE_STR) - 1)
#define SPIDER_SQL_HEX_STR "0x"
#define SPIDER_SQL_HEX_LEN (sizeof(SPIDER_SQL_HEX_STR) - 1)
#define SPIDER_SQL_SET_NAMES_STR "set names "
#define SPIDER_SQL_SET_NAMES_LEN sizeof(SPIDER_SQL_SET_NAMES_STR) - 1
#define SPIDER_SQL_PING_TABLE_STR "spider_ping_table("
#define SPIDER_SQL_PING_TABLE_LEN (sizeof(SPIDER_SQL_PING_TABLE_STR) - 1)
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
extern HASH spider_open_connections;
#endif
pthread_mutex_t spider_open_conn_mutex;
const char spider_dig_upper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/* UTC time zone for timestamp columns */
Time_zone *UTC = 0;
2013-06-27 13:18:48 +02:00
int spider_db_connect(
const SPIDER_SHARE *share,
SPIDER_CONN *conn,
int link_idx
) {
int error_num, connect_retry_count;
THD* thd = current_thd;
longlong connect_retry_interval;
DBUG_ENTER("spider_db_connect");
DBUG_ASSERT(conn->conn_kind != SPIDER_CONN_KIND_MYSQL || conn->need_mon);
DBUG_PRINT("info",("spider link_idx=%d", link_idx));
2015-10-28 23:34:53 +01:00
DBUG_PRINT("info",("spider conn=%p", conn));
if (conn->connect_error)
{
time_t tmp_time = (time_t) time((time_t*) 0);
DBUG_PRINT("info",("spider diff=%f",
difftime(tmp_time, conn->connect_error_time)));
if (
(
conn->thd &&
conn->thd == conn->connect_error_thd &&
conn->thd->query_id == conn->connect_error_query_id
) ||
(
difftime(tmp_time, conn->connect_error_time) <
spider_param_connect_error_interval()
)
) {
DBUG_PRINT("info",("spider set same error"));
if (conn->connect_error_with_message)
my_message(conn->connect_error, conn->connect_error_msg, MYF(0));
DBUG_RETURN(conn->connect_error);
}
}
2013-06-27 13:18:48 +02:00
if (thd)
{
conn->connect_timeout = spider_param_connect_timeout(thd,
share->connect_timeouts[link_idx]);
conn->net_read_timeout = spider_param_net_read_timeout(thd,
share->net_read_timeouts[link_idx]);
conn->net_write_timeout = spider_param_net_write_timeout(thd,
share->net_write_timeouts[link_idx]);
connect_retry_interval = spider_param_connect_retry_interval(thd);
if (conn->disable_connect_retry)
connect_retry_count = 0;
else
connect_retry_count = spider_param_connect_retry_count(thd);
2013-06-27 13:18:48 +02:00
} else {
conn->connect_timeout = spider_param_connect_timeout(NULL,
share->connect_timeouts[link_idx]);
conn->net_read_timeout = spider_param_net_read_timeout(NULL,
share->net_read_timeouts[link_idx]);
conn->net_write_timeout = spider_param_net_write_timeout(NULL,
share->net_write_timeouts[link_idx]);
connect_retry_interval = spider_param_connect_retry_interval(NULL);
connect_retry_count = spider_param_connect_retry_count(NULL);
}
DBUG_PRINT("info",("spider connect_timeout=%u", conn->connect_timeout));
DBUG_PRINT("info",("spider net_read_timeout=%u", conn->net_read_timeout));
DBUG_PRINT("info",("spider net_write_timeout=%u", conn->net_write_timeout));
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
#endif
if ((error_num = spider_reset_conn_setted_parameter(conn, thd)))
DBUG_RETURN(error_num);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
if (conn->dbton_id == SPIDER_DBTON_SIZE)
{
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
#endif
my_printf_error(
ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM,
ER_SPIDER_SQL_WRAPPER_IS_INVALID_STR,
MYF(0), conn->tgt_wrapper);
DBUG_RETURN(ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
my_printf_error(
ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM,
ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR,
MYF(0), conn->tgt_wrapper);
DBUG_RETURN(ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM);
}
#endif
}
if ((error_num = conn->db_conn->connect(
share->tgt_hosts[link_idx],
share->tgt_usernames[link_idx],
share->tgt_passwords[link_idx],
share->tgt_ports[link_idx],
share->tgt_sockets[link_idx],
share->server_names[link_idx],
connect_retry_count, connect_retry_interval)))
{
2015-10-28 23:34:53 +01:00
if (conn->thd)
{
conn->connect_error_thd = conn->thd;
conn->connect_error_query_id = conn->thd->query_id;
conn->connect_error_time = (time_t) time((time_t*) 0);
conn->connect_error = error_num;
if ((conn->connect_error_with_message = thd->is_error()))
strmov(conn->connect_error_msg, spider_stmt_da_message(thd));
}
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
2015-10-28 23:34:53 +01:00
conn->connect_error = 0;
2013-06-27 13:18:48 +02:00
conn->opened_handlers = 0;
conn->db_conn->reset_opened_handler();
++conn->connection_id;
/* Set the connection's time zone to UTC */
spider_conn_queue_UTC_time_zone(conn);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(0);
}
int spider_db_ping_internal(
SPIDER_SHARE *share,
2013-06-27 13:18:48 +02:00
SPIDER_CONN *conn,
int all_link_idx,
int *need_mon
2013-06-27 13:18:48 +02:00
) {
int error_num;
DBUG_ENTER("spider_db_ping_internal");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
if (conn->server_lost || conn->queued_connect)
{
if ((error_num = spider_db_connect(share, conn, all_link_idx)))
2013-06-27 13:18:48 +02:00
{
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
conn->server_lost = FALSE;
conn->queued_connect = FALSE;
}
if ((error_num = conn->db_conn->ping()))
{
spider_db_disconnect(conn);
if ((error_num = spider_db_connect(share, conn, all_link_idx)))
2013-06-27 13:18:48 +02:00
{
DBUG_PRINT("info", ("spider conn=%p SERVER_LOST", conn));
conn->server_lost = TRUE;
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
if((error_num = conn->db_conn->ping()))
{
spider_db_disconnect(conn);
DBUG_PRINT("info", ("spider conn=%p SERVER_LOST", conn));
conn->server_lost = TRUE;
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
}
conn->ping_time = (time_t) time((time_t*) 0);
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(0);
}
int spider_db_ping(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx
) {
DBUG_ENTER("spider_db_ping");
#ifndef DBUG_OFF
if (spider->trx->thd)
DBUG_PRINT("info", ("spider thd->query_id is %lld",
spider->trx->thd->query_id));
#endif
DBUG_RETURN(spider_db_ping_internal(spider->share, conn,
spider->conn_link_idx[link_idx], &spider->need_mons[link_idx]));
}
2013-06-27 13:18:48 +02:00
void spider_db_disconnect(
SPIDER_CONN *conn
) {
DBUG_ENTER("spider_db_disconnect");
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider conn->conn_kind=%u", conn->conn_kind));
if (conn->db_conn->is_connected())
{
conn->db_conn->disconnect();
}
DBUG_VOID_RETURN;
}
int spider_db_conn_queue_action(
SPIDER_CONN *conn
) {
int error_num;
char sql_buf[MAX_FIELD_WIDTH * 2];
spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info);
DBUG_ENTER("spider_db_conn_queue_action");
DBUG_PRINT("info", ("spider conn=%p", conn));
sql_str.init_calc_mem(SPD_MID_DB_CONN_QUEUE_ACTION_1);
2013-06-27 13:18:48 +02:00
sql_str.length(0);
if (conn->queued_connect)
{
if ((error_num = spider_db_connect(conn->queued_connect_share, conn,
conn->queued_connect_link_idx)))
{
DBUG_PRINT("info", ("spider conn=%p SERVER_LOST", conn));
conn->server_lost = TRUE;
DBUG_RETURN(error_num);
}
conn->server_lost = FALSE;
conn->queued_connect = FALSE;
}
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
#endif
if (conn->queued_ping)
{
if ((error_num = spider_db_ping(conn->queued_ping_spider, conn,
conn->queued_ping_link_idx)))
DBUG_RETURN(error_num);
conn->queued_ping = FALSE;
}
if (conn->server_lost)
{
DBUG_PRINT("info", ("spider no reconnect queue"));
DBUG_RETURN(CR_SERVER_GONE_ERROR);
}
if (conn->queued_net_timeout)
{
conn->db_conn->set_net_timeout();
conn->queued_net_timeout = FALSE;
}
if (
(
conn->queued_trx_isolation &&
!conn->queued_semi_trx_isolation &&
conn->queued_trx_isolation_val != conn->trx_isolation &&
conn->db_conn->set_trx_isolation_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_trx_isolation(&sql_str, conn->queued_trx_isolation_val))
) ||
(
conn->queued_semi_trx_isolation &&
conn->queued_semi_trx_isolation_val != conn->trx_isolation &&
conn->db_conn->set_trx_isolation_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_trx_isolation(&sql_str, conn->queued_semi_trx_isolation_val))
) ||
(
conn->queued_autocommit &&
(
(conn->queued_autocommit_val && conn->autocommit != 1) ||
(!conn->queued_autocommit_val && conn->autocommit != 0)
) &&
conn->db_conn->set_autocommit_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_autocommit(&sql_str, conn->queued_autocommit_val))
) ||
(
conn->queued_sql_log_off &&
(
(conn->queued_sql_log_off_val && conn->sql_log_off != 1) ||
(!conn->queued_sql_log_off_val && conn->sql_log_off != 0)
) &&
conn->db_conn->set_sql_log_off_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_sql_log_off(&sql_str, conn->queued_sql_log_off_val))
) ||
(
conn->queued_wait_timeout &&
conn->queued_wait_timeout_val != conn->wait_timeout &&
conn->db_conn->set_wait_timeout_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_wait_timeout(&sql_str, conn->queued_wait_timeout_val))
) ||
(
conn->queued_sql_mode &&
conn->queued_sql_mode_val != conn->sql_mode &&
conn->db_conn->set_sql_mode_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_sql_mode(&sql_str, conn->queued_sql_mode_val))
) ||
2013-06-27 13:18:48 +02:00
(
conn->queued_time_zone &&
conn->queued_time_zone_val != conn->time_zone &&
conn->db_conn->set_time_zone_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_time_zone(&sql_str, conn->queued_time_zone_val))
) ||
(
conn->queued_trx_start &&
conn->db_conn->trx_start_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_start_transaction(&sql_str))
) ||
(
conn->queued_xa_start &&
conn->db_conn->xa_start_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_xa_start(&sql_str, conn->queued_xa_start_xid))
)
)
DBUG_RETURN(error_num);
if (sql_str.length())
{
if ((error_num = conn->db_conn->exec_query(sql_str.ptr(),
sql_str.length(), -1)))
DBUG_RETURN(error_num);
spider_db_result *result;
do {
st_spider_db_request_key request_key;
request_key.spider_thread_id = 1;
request_key.query_id = 1;
request_key.handler = NULL;
request_key.request_id = 1;
request_key.next = NULL;
if ((result = conn->db_conn->store_result(NULL, &request_key,
&error_num)))
{
result->free_result();
delete result;
} else if ((error_num = conn->db_conn->get_errno()))
{
break;
}
} while (!(error_num = conn->db_conn->next_result()));
if (error_num > 0)
DBUG_RETURN(error_num);
}
if (
conn->queued_autocommit &&
(
(conn->queued_autocommit_val && conn->autocommit != 1) ||
(!conn->queued_autocommit_val && conn->autocommit != 0)
) &&
!conn->db_conn->set_autocommit_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_autocommit(&sql_str, conn->queued_autocommit_val))
) {
DBUG_RETURN(error_num);
}
if (
conn->queued_sql_log_off &&
(
(conn->queued_sql_log_off_val && conn->sql_log_off != 1) ||
(!conn->queued_sql_log_off_val && conn->sql_log_off != 0)
) &&
!conn->db_conn->set_sql_log_off_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_sql_log_off(&sql_str, conn->queued_sql_log_off_val))
) {
DBUG_RETURN(error_num);
}
if (
conn->queued_wait_timeout &&
conn->queued_wait_timeout_val != conn->wait_timeout &&
!conn->db_conn->set_wait_timeout_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_wait_timeout(&sql_str, conn->queued_wait_timeout_val))
) {
DBUG_RETURN(error_num);
}
if (
conn->queued_sql_mode &&
conn->queued_sql_mode_val != conn->sql_mode &&
!conn->db_conn->set_sql_mode_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_sql_mode(&sql_str, conn->queued_sql_mode_val))
) {
DBUG_RETURN(error_num);
}
2013-06-27 13:18:48 +02:00
if (
conn->queued_time_zone &&
conn->queued_time_zone_val != conn->time_zone &&
!conn->db_conn->set_time_zone_in_bulk_sql() &&
(error_num = spider_dbton[conn->dbton_id].db_util->
append_time_zone(&sql_str, conn->queued_time_zone_val))
) {
DBUG_RETURN(error_num);
}
if (
conn->queued_trx_isolation &&
!conn->queued_semi_trx_isolation &&
conn->queued_trx_isolation_val != conn->trx_isolation &&
!conn->db_conn->set_trx_isolation_in_bulk_sql() &&
(error_num = conn->db_conn->set_trx_isolation(
conn->queued_trx_isolation_val, (int *) conn->need_mon))
) {
DBUG_RETURN(error_num);
}
if (
conn->queued_semi_trx_isolation &&
conn->queued_semi_trx_isolation_val != conn->trx_isolation &&
!conn->db_conn->set_trx_isolation_in_bulk_sql() &&
(error_num = conn->db_conn->set_trx_isolation(
conn->queued_semi_trx_isolation_val, (int *) conn->need_mon))
) {
DBUG_RETURN(error_num);
}
if (
conn->queued_trx_start &&
!conn->db_conn->trx_start_in_bulk_sql() &&
(error_num = conn->db_conn->
start_transaction((int *) conn->need_mon))
) {
DBUG_RETURN(error_num);
}
if (
conn->queued_xa_start &&
!conn->db_conn->xa_start_in_bulk_sql() &&
(error_num = conn->db_conn->
xa_start(conn->queued_xa_start_xid, (int *) conn->need_mon))
) {
DBUG_RETURN(error_num);
}
if (
conn->queued_trx_isolation &&
!conn->queued_semi_trx_isolation &&
conn->queued_trx_isolation_val != conn->trx_isolation
) {
conn->trx_isolation = conn->queued_trx_isolation_val;
DBUG_PRINT("info", ("spider conn->trx_isolation=%d",
conn->trx_isolation));
}
if (
conn->queued_semi_trx_isolation &&
conn->queued_semi_trx_isolation_val != conn->trx_isolation
) {
conn->semi_trx_isolation = conn->queued_semi_trx_isolation_val;
DBUG_PRINT("info", ("spider conn->semi_trx_isolation=%d",
conn->semi_trx_isolation));
conn->trx_isolation = thd_tx_isolation(conn->thd);
DBUG_PRINT("info", ("spider conn->trx_isolation=%d",
conn->trx_isolation));
}
if (
conn->queued_wait_timeout &&
conn->queued_wait_timeout_val != conn->wait_timeout
) {
conn->wait_timeout = conn->queued_wait_timeout_val;
}
if (
conn->queued_sql_mode &&
conn->queued_sql_mode_val != conn->sql_mode
) {
conn->sql_mode = conn->queued_sql_mode_val;
}
2013-06-27 13:18:48 +02:00
if (conn->queued_autocommit)
{
if (conn->queued_autocommit_val && conn->autocommit != 1)
{
conn->autocommit = 1;
} else if (!conn->queued_autocommit_val && conn->autocommit != 0)
{
conn->autocommit = 0;
}
DBUG_PRINT("info", ("spider conn->autocommit=%d",
conn->autocommit));
}
if (conn->queued_sql_log_off)
{
if (conn->queued_sql_log_off_val && conn->sql_log_off != 1)
{
conn->sql_log_off = 1;
} else if (!conn->queued_sql_log_off_val && conn->sql_log_off != 0)
{
conn->sql_log_off = 0;
}
DBUG_PRINT("info", ("spider conn->sql_log_off=%d",
conn->sql_log_off));
}
if (
conn->queued_time_zone &&
conn->queued_time_zone_val != conn->time_zone
) {
conn->time_zone = conn->queued_time_zone_val;
DBUG_PRINT("info", ("spider conn->time_zone=%p",
conn->time_zone));
}
spider_conn_clear_queue(conn);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else if (conn->server_lost)
{
DBUG_PRINT("info", ("spider no connect queue"));
DBUG_RETURN(CR_SERVER_GONE_ERROR);
}
#endif
DBUG_RETURN(0);
}
int spider_db_before_query(
SPIDER_CONN *conn,
int *need_mon
) {
int error_num;
DBUG_ENTER("spider_db_before_query");
DBUG_ASSERT(need_mon);
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (conn->bg_search)
spider_bg_conn_break(conn, NULL);
#endif
conn->in_before_query = TRUE;
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
if ((error_num = spider_db_conn_queue_action(conn)))
{
conn->in_before_query = FALSE;
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
if (conn->server_lost)
{
conn->in_before_query = FALSE;
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(CR_SERVER_GONE_ERROR);
}
DBUG_PRINT("info", ("spider conn[%p]->quick_target=%p",
conn, conn->quick_target));
if (conn->quick_target)
{
bool tmp_mta_conn_mutex_unlock_later;
ha_spider *spider = (ha_spider*) conn->quick_target;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_PRINT("info", ("spider result_list->quick_mode=%d",
result_list->quick_mode));
if (result_list->quick_mode == 2)
{
result_list->quick_phase = 1;
spider->connection_ids[conn->link_idx] = conn->connection_id;
tmp_mta_conn_mutex_unlock_later = conn->mta_conn_mutex_unlock_later;
conn->mta_conn_mutex_unlock_later = TRUE;
while (conn->quick_target)
{
if (
(error_num = spider_db_store_result(spider, conn->link_idx,
result_list->table)) &&
error_num != HA_ERR_END_OF_FILE
) {
conn->mta_conn_mutex_unlock_later = tmp_mta_conn_mutex_unlock_later;
conn->in_before_query = FALSE;
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
}
conn->mta_conn_mutex_unlock_later = tmp_mta_conn_mutex_unlock_later;
result_list->quick_phase = 2;
} else {
result_list->bgs_current->result->free_result();
delete result_list->bgs_current->result;
result_list->bgs_current->result = NULL;
DBUG_PRINT("info", ("spider conn[%p]->quick_target=NULL", conn));
conn->quick_target = NULL;
spider->quick_targets[conn->link_idx] = NULL;
}
}
conn->in_before_query = FALSE;
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(0);
}
int spider_db_query(
SPIDER_CONN *conn,
const char *query,
uint length,
int quick_mode,
int *need_mon
) {
int error_num;
DBUG_ENTER("spider_db_query");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
#endif
DBUG_PRINT("info", ("spider conn->db_conn %p", conn->db_conn));
if (
!conn->in_before_query &&
(error_num = spider_db_before_query(conn, need_mon))
)
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
spider_string tmp_query_str(sizeof(char) * (length + 1));
tmp_query_str.init_calc_mem(SPD_MID_DB_QUERY_1);
2013-06-27 13:18:48 +02:00
char *tmp_query = (char *) tmp_query_str.c_ptr_safe();
memcpy(tmp_query, query, length);
tmp_query[length] = '\0';
query = (const char *) tmp_query;
DBUG_PRINT("info", ("spider query=%s", query));
DBUG_PRINT("info", ("spider length=%u", length));
#endif
if ((error_num = conn->db_conn->exec_query(query, length, quick_mode)))
DBUG_RETURN(error_num);
DBUG_RETURN(0);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
if (conn->queued_net_timeout)
{
if (conn->db_conn->set_net_timeout())
DBUG_RETURN(ER_SPIDER_HS_NUM);
conn->queued_net_timeout = FALSE;
}
DBUG_RETURN(conn->db_conn->exec_query(NULL, 0, quick_mode));
}
#endif
}
int spider_db_errorno(
SPIDER_CONN *conn
) {
int error_num;
DBUG_ENTER("spider_db_errorno");
DBUG_ASSERT(conn->need_mon);
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
#endif
if (conn->server_lost)
{
*conn->need_mon = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM;
2014-09-18 02:26:30 +02:00
if (!current_thd->is_error())
{
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
}
2013-06-27 13:18:48 +02:00
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
}
if ((error_num = conn->db_conn->get_errno()))
{
DBUG_PRINT("info",("spider error_num = %d", error_num));
if (conn->db_conn->is_server_gone_error(error_num))
{
spider_db_disconnect(conn);
DBUG_PRINT("info", ("spider conn=%p SERVER_LOST", conn));
conn->server_lost = TRUE;
if (conn->disable_reconnect)
{
*conn->need_mon = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM;
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)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
} else if (
conn->ignore_dup_key &&
conn->db_conn->is_dup_entry_error(error_num)
) {
conn->error_str = (char*) conn->db_conn->get_error();
conn->error_length = strlen(conn->error_str);
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(HA_ERR_FOUND_DUPP_KEY);
} else if (
conn->db_conn->is_xa_nota_error(error_num) &&
current_thd &&
spider_param_force_commit(current_thd) == 1
) {
2013-08-24 11:37:49 +02:00
push_warning(current_thd, SPIDER_WARN_LEVEL_WARN,
2013-06-27 13:18:48 +02:00
error_num, conn->db_conn->get_error());
if (spider_param_log_result_errors() >= 3)
{
time_t cur_time = (time_t) time((time_t*) 0);
struct tm lt;
struct tm *l_time = localtime_r(&cur_time, &lt);
fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
"to %lld: %d %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
(long long int) current_thd->thread_id, error_num,
conn->db_conn->get_error());
}
2013-06-27 13:18:48 +02:00
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(error_num);
}
*conn->need_mon = error_num;
my_message(error_num, conn->db_conn->get_error(), MYF(0));
if (spider_param_log_result_errors() >= 1)
{
time_t cur_time = (time_t) time((time_t*) 0);
struct tm lt;
struct tm *l_time = localtime_r(&cur_time, &lt);
fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [ERROR SPIDER RESULT] "
"to %lld: %d %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
(long long int) current_thd->thread_id, error_num,
conn->db_conn->get_error());
}
2013-06-27 13:18:48 +02:00
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(error_num);
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
if (conn->db_conn->is_server_gone_error(0))
{
my_printf_error(ER_SPIDER_HS_NUM, ER_SPIDER_HS_STR, MYF(0),
conn->db_conn->get_errno(), conn->db_conn->get_error());
*conn->need_mon = ER_SPIDER_HS_NUM;
DBUG_PRINT("info", ("spider conn=%p SERVER_LOST", conn));
conn->server_lost = TRUE;
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(ER_SPIDER_HS_NUM);
} else if (conn->db_conn->is_dup_entry_error(0))
{
*conn->need_mon = 0;
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(HA_ERR_FOUND_DUPP_KEY);
}
my_printf_error(ER_SPIDER_HS_NUM, ER_SPIDER_HS_STR, MYF(0),
conn->db_conn->get_errno(), conn->db_conn->get_error());
if (spider_param_log_result_errors() >= 1)
{
time_t cur_time = (time_t) time((time_t*) 0);
struct tm lt;
struct tm *l_time = localtime_r(&cur_time, &lt);
fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [ERROR SPIDER RESULT] "
"to %ld: %d %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
(ulong) current_thd->thread_id, conn->db_conn->get_errno(),
conn->db_conn->get_error());
}
2013-06-27 13:18:48 +02:00
*conn->need_mon = ER_SPIDER_HS_NUM;
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(ER_SPIDER_HS_NUM);
}
#endif
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(0);
}
int spider_db_set_trx_isolation(
SPIDER_CONN *conn,
int trx_isolation,
int *need_mon
) {
DBUG_ENTER("spider_db_set_trx_isolation");
DBUG_RETURN(conn->db_conn->set_trx_isolation(trx_isolation, need_mon));
}
int spider_db_set_names_internal(
SPIDER_TRX *trx,
SPIDER_SHARE *share,
SPIDER_CONN *conn,
int all_link_idx,
int *need_mon
) {
DBUG_ENTER("spider_db_set_names_internal");
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
#endif
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
if (
!conn->access_charset ||
share->access_charset->cset != conn->access_charset->cset
) {
if (
spider_db_before_query(conn, need_mon) ||
conn->db_conn->set_character_set(share->access_charset->csname)
) {
DBUG_RETURN(spider_db_errorno(conn));
}
conn->access_charset = share->access_charset;
}
if (
spider_param_use_default_database(trx->thd) &&
(
!conn->default_database.length() ||
conn->default_database.length() !=
share->tgt_dbs_lengths[all_link_idx] ||
memcmp(share->tgt_dbs[all_link_idx], conn->default_database.ptr(),
share->tgt_dbs_lengths[all_link_idx])
)
) {
DBUG_PRINT("info",("spider all_link_idx=%d db=%s", all_link_idx,
share->tgt_dbs[all_link_idx]));
if (
spider_db_before_query(conn, need_mon) ||
conn->db_conn->select_db(share->tgt_dbs[all_link_idx])
) {
DBUG_RETURN(spider_db_errorno(conn));
}
conn->default_database.length(0);
if (conn->default_database.reserve(
share->tgt_dbs_lengths[all_link_idx] + 1))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
conn->default_database.q_append(share->tgt_dbs[all_link_idx],
share->tgt_dbs_lengths[all_link_idx] + 1);
conn->default_database.length(share->tgt_dbs_lengths[all_link_idx]);
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
DBUG_RETURN(0);
}
int spider_db_set_names(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx
) {
DBUG_ENTER("spider_db_set_names");
DBUG_RETURN(spider_db_set_names_internal(spider->trx, spider->share, conn,
spider->conn_link_idx[link_idx], &spider->need_mons[link_idx]));
}
int spider_db_query_with_set_names(
ulong sql_type,
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx
) {
int error_num;
SPIDER_SHARE *share = spider->share;
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
DBUG_ENTER("spider_db_query_with_set_names");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_set_names(spider, conn, link_idx)))
{
if (
share->monitoring_kind[link_idx] &&
spider->need_mons[link_idx]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
link_idx,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
spider->conn_link_idx[link_idx],
NULL,
0,
share->monitoring_kind[link_idx],
share->monitoring_limit[link_idx],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[link_idx],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
share);
if (dbton_hdl->execute_sql(
sql_type,
conn,
-1,
&spider->need_mons[link_idx])
) {
error_num = spider_db_errorno(conn);
if (
share->monitoring_kind[link_idx] &&
spider->need_mons[link_idx]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
link_idx,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
spider->conn_link_idx[link_idx],
NULL,
0,
share->monitoring_kind[link_idx],
share->monitoring_limit[link_idx],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[link_idx],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
int spider_db_query_for_bulk_update(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx,
ha_rows *dup_key_found
2013-06-27 13:18:48 +02:00
) {
int error_num;
SPIDER_SHARE *share = spider->share;
DBUG_ENTER("spider_db_query_for_bulk_update");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
conn->need_mon = &spider->need_mons[link_idx];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, link_idx)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[link_idx] &&
spider->need_mons[link_idx]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
link_idx,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
spider->conn_link_idx[link_idx],
NULL,
0,
share->monitoring_kind[link_idx],
share->monitoring_limit[link_idx],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[link_idx],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
share);
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
if (dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_BULK_UPDATE_SQL,
conn,
-1,
&spider->need_mons[link_idx])
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
error_num != ER_DUP_ENTRY &&
error_num != ER_DUP_KEY &&
error_num != HA_ERR_FOUND_DUPP_KEY &&
share->monitoring_kind[link_idx] &&
spider->need_mons[link_idx]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
link_idx,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
spider->conn_link_idx[link_idx],
NULL,
0,
share->monitoring_kind[link_idx],
share->monitoring_limit[link_idx],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[link_idx],
2013-06-27 13:18:48 +02:00
TRUE
);
}
if (
spider->ignore_dup_key &&
(
error_num == ER_DUP_ENTRY ||
error_num == ER_DUP_KEY ||
error_num == HA_ERR_FOUND_DUPP_KEY
)
2013-06-27 13:18:48 +02:00
) {
++(*dup_key_found);
spider->trx->thd->clear_error();
2013-06-27 13:18:48 +02:00
DBUG_RETURN(0);
}
DBUG_RETURN(error_num);
}
while (!(error_num = conn->db_conn->next_result()))
{
;
}
if (error_num > 0 && !conn->db_conn->is_dup_entry_error(error_num))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[link_idx] &&
spider->need_mons[link_idx]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
link_idx,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
spider->conn_link_idx[link_idx],
NULL,
0,
share->monitoring_kind[link_idx],
share->monitoring_limit[link_idx],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[link_idx],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
DBUG_RETURN(0);
}
size_t spider_db_real_escape_string(
SPIDER_CONN *conn,
char *to,
const char *from,
size_t from_length
) {
DBUG_ENTER("spider_db_real_escape_string");
DBUG_RETURN(conn->db_conn->escape_string(to, from, from_length));
}
int spider_db_consistent_snapshot(
SPIDER_CONN *conn,
int *need_mon
) {
int error_num;
DBUG_ENTER("spider_db_consistent_snapshot");
if ((error_num = conn->db_conn->consistent_snapshot(need_mon)))
{
DBUG_RETURN(error_num);
}
conn->trx_start = TRUE;
DBUG_RETURN(0);
}
int spider_db_start_transaction(
SPIDER_CONN *conn,
int *need_mon
) {
int error_num;
DBUG_ENTER("spider_db_start_transaction");
if ((error_num = conn->db_conn->start_transaction(need_mon)))
{
DBUG_RETURN(error_num);
}
conn->trx_start = TRUE;
DBUG_RETURN(0);
}
int spider_db_commit(
SPIDER_CONN *conn
) {
int need_mon = 0, error_num;
DBUG_ENTER("spider_db_commit");
if (!conn->queued_connect && !conn->queued_trx_start)
{
if (conn->use_for_active_standby && conn->server_lost)
{
my_message(ER_SPIDER_LINK_IS_FAILOVER_NUM,
ER_SPIDER_LINK_IS_FAILOVER_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_LINK_IS_FAILOVER_NUM);
}
if ((error_num = conn->db_conn->commit(&need_mon)))
{
DBUG_RETURN(error_num);
}
conn->trx_start = FALSE;
} else
conn->trx_start = FALSE;
DBUG_RETURN(0);
}
int spider_db_rollback(
SPIDER_CONN *conn
) {
int error_num, need_mon = 0;
DBUG_ENTER("spider_db_rollback");
if (!conn->queued_connect && !conn->queued_trx_start)
{
if ((error_num = conn->db_conn->rollback(&need_mon)))
{
DBUG_RETURN(error_num);
}
conn->trx_start = FALSE;
} else
conn->trx_start = FALSE;
DBUG_RETURN(0);
}
int spider_db_append_hex_string(
spider_string *str,
uchar *hex_ptr,
int hex_ptr_length
) {
uchar *end_ptr;
char *str_ptr;
DBUG_ENTER("spider_db_append_hex_string");
if (hex_ptr_length)
{
if (str->reserve(SPIDER_SQL_HEX_LEN + hex_ptr_length * 2))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN);
str_ptr = (char *) str->ptr() + str->length();
for (end_ptr = hex_ptr + hex_ptr_length; hex_ptr < end_ptr; hex_ptr++)
{
*str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4];
*str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F];
}
str->length(str->length() + hex_ptr_length * 2);
} else {
if (str->reserve((SPIDER_SQL_VALUE_QUOTE_LEN) * 2))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
}
DBUG_RETURN(0);
}
void spider_db_append_xid_str(
spider_string *tmp_str,
XID *xid
) {
char format_id[sizeof(long) + 3];
uint format_id_length;
DBUG_ENTER("spider_db_append_xid_str");
format_id_length =
2014-03-24 20:45:34 +01:00
my_sprintf(format_id, (format_id, "%lu", xid->formatID));
2013-06-27 13:18:48 +02:00
spider_db_append_hex_string(tmp_str, (uchar *) xid->data, xid->gtrid_length);
/*
tmp_str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
tmp_str->q_append(xid->data, xid->gtrid_length);
tmp_str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
*/
tmp_str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
spider_db_append_hex_string(tmp_str,
(uchar *) xid->data + xid->gtrid_length, xid->bqual_length);
/*
tmp_str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
tmp_str->q_append(xid->data + xid->gtrid_length, xid->bqual_length);
tmp_str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
*/
tmp_str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
tmp_str->q_append(format_id, format_id_length);
#ifndef DBUG_OFF
((char *) tmp_str->ptr())[tmp_str->length()] = '\0';
#endif
DBUG_VOID_RETURN;
}
int spider_db_xa_end(
SPIDER_CONN *conn,
XID *xid
) {
int need_mon = 0;
DBUG_ENTER("spider_db_xa_end");
if (!conn->queued_connect && !conn->queued_xa_start)
{
DBUG_RETURN(conn->db_conn->xa_end(xid, &need_mon));
}
DBUG_RETURN(0);
}
int spider_db_xa_prepare(
SPIDER_CONN *conn,
XID *xid
) {
int need_mon = 0;
DBUG_ENTER("spider_db_xa_prepare");
if (!conn->queued_connect && !conn->queued_xa_start)
{
if (conn->use_for_active_standby && conn->server_lost)
{
my_message(ER_SPIDER_LINK_IS_FAILOVER_NUM,
ER_SPIDER_LINK_IS_FAILOVER_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_LINK_IS_FAILOVER_NUM);
}
DBUG_RETURN(conn->db_conn->xa_prepare(xid, &need_mon));
}
DBUG_RETURN(0);
}
int spider_db_xa_commit(
SPIDER_CONN *conn,
XID *xid
) {
int need_mon = 0;
DBUG_ENTER("spider_db_xa_commit");
if (!conn->queued_connect && !conn->queued_xa_start)
{
DBUG_RETURN(conn->db_conn->xa_commit(xid, &need_mon));
}
DBUG_RETURN(0);
}
int spider_db_xa_rollback(
SPIDER_CONN *conn,
XID *xid
) {
int need_mon = 0;
DBUG_ENTER("spider_db_xa_rollback");
if (!conn->queued_connect && !conn->queued_xa_start)
{
DBUG_RETURN(conn->db_conn->xa_rollback(xid, &need_mon));
}
DBUG_RETURN(0);
}
int spider_db_lock_tables(
ha_spider *spider,
int link_idx
) {
int error_num;
SPIDER_CONN *conn = spider->conns[link_idx];
DBUG_ENTER("spider_db_lock_tables");
error_num = spider->dbton_handler[conn->dbton_id]->lock_tables(link_idx);
DBUG_RETURN(error_num);
}
int spider_db_unlock_tables(
ha_spider *spider,
int link_idx
) {
int error_num;
SPIDER_CONN *conn = spider->conns[link_idx];
DBUG_ENTER("spider_db_unlock_tables");
error_num = spider->dbton_handler[conn->dbton_id]->unlock_tables(link_idx);
DBUG_RETURN(error_num);
}
int spider_db_append_name_with_quote_str(
spider_string *str,
const char *name,
2013-06-27 13:18:48 +02:00
uint dbton_id
) {
DBUG_ENTER("spider_db_append_name_with_quote_str");
DBUG_RETURN(spider_db_append_name_with_quote_str_internal(
str, name, strlen(name), system_charset_info, dbton_id));
}
int spider_db_append_name_with_quote_str(
spider_string *str,
LEX_CSTRING &name,
uint dbton_id
) {
DBUG_ENTER("spider_db_append_name_with_quote_str");
DBUG_RETURN(spider_db_append_name_with_quote_str_internal(
str, name.str, name.length, system_charset_info, dbton_id));
}
int spider_db_append_name_with_quote_str_internal(
spider_string *str,
const char *name,
int length,
uint dbton_id
) {
DBUG_ENTER("spider_db_append_name_with_quote_str_internal");
DBUG_RETURN(spider_db_append_name_with_quote_str_internal(
str, name, length, system_charset_info, dbton_id));
}
int spider_db_append_name_with_quote_str_internal(
spider_string *str,
const char *name,
int length,
CHARSET_INFO *cs,
uint dbton_id
) {
int error_num;
const char *name_end;
char head_code;
DBUG_ENTER("spider_db_append_name_with_quote_str_internal");
2013-06-27 13:18:48 +02:00
for (name_end = name + length; name < name_end; name += length)
{
head_code = *name;
#ifdef SPIDER_HAS_MY_CHARLEN
if ((length = my_charlen(cs, name, name_end)) < 1)
#else
if (!(length = my_mbcharlen(cs, (uchar) head_code)))
#endif
2013-06-27 13:18:48 +02:00
{
my_message(ER_SPIDER_WRONG_CHARACTER_IN_NAME_NUM,
ER_SPIDER_WRONG_CHARACTER_IN_NAME_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_WRONG_CHARACTER_IN_NAME_NUM);
}
if (
length == 1 &&
spider_dbton[dbton_id].db_util->is_name_quote(head_code)
) {
if ((error_num = spider_dbton[dbton_id].db_util->
append_escaped_name_quote(str)))
{
DBUG_RETURN(error_num);
}
} else {
if (str->append(name, length, cs))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
}
DBUG_RETURN(0);
}
int spider_db_append_select(
ha_spider *spider
) {
int error_num;
DBUG_ENTER("spider_db_append_select");
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
if ((error_num = spider->append_select_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
}
if (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER)
{
if ((error_num = spider->append_select_sql_part(
SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
int spider_db_append_select_columns(
ha_spider *spider
) {
int error_num;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_append_select_columns");
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
if (
result_list->direct_aggregate &&
(error_num = spider->append_sum_select_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL, NULL, 0))
)
DBUG_RETURN(error_num);
#endif
2013-06-27 13:18:48 +02:00
if ((error_num = spider->append_match_select_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL, NULL, 0)))
DBUG_RETURN(error_num);
if (!spider->select_column_mode)
{
if (result_list->keyread)
{
if ((error_num = spider->append_key_select_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL, spider->active_index)))
DBUG_RETURN(error_num);
} else {
if ((error_num = spider->append_table_select_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
}
} else {
if ((error_num = spider->append_minimum_select_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
}
}
if (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER)
{
if ((error_num = spider->append_from_sql_part(SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
int spider_db_append_null_value(
spider_string *str,
KEY_PART_INFO *key_part,
const uchar **ptr
) {
DBUG_ENTER("spider_db_append_null_value");
if (key_part->null_bit)
{
if (*(*ptr)++)
{
if (str->reserve(SPIDER_SQL_NULL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
DBUG_RETURN(-1);
}
}
DBUG_RETURN(0);
}
int spider_db_append_key_columns(
const key_range *start_key,
ha_spider *spider,
spider_string *str
) {
SPIDER_RESULT_LIST *result_list = &spider->result_list;
KEY *key_info = result_list->key_info;
uint key_name_length, key_count;
2013-08-24 11:37:49 +02:00
key_part_map full_key_part_map =
make_prev_keypart_map(spider_user_defined_key_parts(key_info));
2013-06-27 13:18:48 +02:00
key_part_map start_key_part_map;
char tmp_buf[MAX_FIELD_WIDTH];
DBUG_ENTER("spider_db_append_key_columns");
start_key_part_map = start_key->keypart_map & full_key_part_map;
2013-08-24 11:37:49 +02:00
DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
spider_user_defined_key_parts(key_info)));
2013-06-27 13:18:48 +02:00
DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
if (!start_key_part_map)
DBUG_RETURN(0);
for (
key_count = 0;
start_key_part_map;
start_key_part_map >>= 1,
key_count++
) {
key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
if (str->reserve(key_name_length + SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(tmp_buf, key_name_length);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
str->length(str->length() - SPIDER_SQL_COMMA_LEN);
DBUG_RETURN(0);
}
int spider_db_append_key_hint(
spider_string *str,
char *hint_str
) {
int hint_str_len = strlen(hint_str);
DBUG_ENTER("spider_db_append_key_hint");
if (hint_str_len >= 2 &&
(hint_str[0] == 'f' || hint_str[0] == 'F') && hint_str[1] == ' '
) {
if (str->reserve(
hint_str_len - 2 + SPIDER_SQL_INDEX_FORCE_LEN +
SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
hint_str += 2;
str->q_append(SPIDER_SQL_INDEX_FORCE_STR, SPIDER_SQL_INDEX_FORCE_LEN);
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
2013-06-27 13:18:48 +02:00
str->q_append(hint_str, hint_str_len - 2);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
} else if (hint_str_len >= 2 &&
(hint_str[0] == 'u' || hint_str[0] == 'U') && hint_str[1] == ' '
) {
if (str->reserve(
hint_str_len - 2 + SPIDER_SQL_INDEX_USE_LEN +
SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
2013-06-27 13:18:48 +02:00
hint_str += 2;
str->q_append(SPIDER_SQL_INDEX_USE_STR, SPIDER_SQL_INDEX_USE_LEN);
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
2013-06-27 13:18:48 +02:00
str->q_append(hint_str, hint_str_len - 2);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
} else if (hint_str_len >= 3 &&
(hint_str[0] == 'i' || hint_str[0] == 'I') &&
(hint_str[1] == 'g' || hint_str[1] == 'G') && hint_str[2] == ' '
) {
if (str->reserve(
hint_str_len - 3 + SPIDER_SQL_INDEX_IGNORE_LEN +
SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
2013-06-27 13:18:48 +02:00
hint_str += 3;
str->q_append(SPIDER_SQL_INDEX_IGNORE_STR, SPIDER_SQL_INDEX_IGNORE_LEN);
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
str->q_append(hint_str, hint_str_len - 2);
2013-06-27 13:18:48 +02:00
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
} else if (str->reserve(hint_str_len + SPIDER_SQL_SPACE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
else
{
str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
str->q_append(hint_str, hint_str_len);
}
DBUG_RETURN(0);
}
int spider_db_append_hint_after_table(
ha_spider *spider,
spider_string *str,
spider_string *hint
) {
DBUG_ENTER("spider_db_append_hint_after_table");
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
if (str->append(*hint))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
DBUG_RETURN(0);
}
int spider_db_append_key_where_internal(
spider_string *str,
spider_string *str_part,
spider_string *str_part2,
const key_range *start_key,
const key_range *end_key,
ha_spider *spider,
bool set_order,
ulong sql_type,
uint dbton_id
) {
SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_SHARE *share = spider->share;
#ifndef DBUG_OFF
TABLE *table = spider->get_table();
#endif
KEY *key_info = result_list->key_info;
int error_num;
uint key_name_length;
key_part_map full_key_part_map;
key_part_map start_key_part_map;
key_part_map end_key_part_map;
key_part_map tgt_key_part_map;
int key_count;
uint length;
uint store_length;
uint current_pos = str->length();
2013-06-27 13:18:48 +02:00
const uchar *ptr, *another_ptr;
const key_range *use_key, *another_key;
KEY_PART_INFO *key_part;
Field *field;
bool use_both = TRUE, key_eq;
uint sql_kind;
spider_db_handler *dbton_hdl = spider->dbton_handler[dbton_id];
spider_db_share *dbton_share = share->dbton_share[dbton_id];
DBUG_ENTER("spider_db_append_key_where_internal");
switch (sql_type)
{
case SPIDER_SQL_TYPE_HANDLER:
sql_kind = SPIDER_SQL_KIND_HANDLER;
break;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
case SPIDER_SQL_TYPE_SELECT_HS:
case SPIDER_SQL_TYPE_INSERT_HS:
case SPIDER_SQL_TYPE_UPDATE_HS:
case SPIDER_SQL_TYPE_DELETE_HS:
sql_kind = SPIDER_SQL_KIND_HS;
break;
#endif
default:
sql_kind = SPIDER_SQL_KIND_SQL;
break;
}
if (key_info)
2013-08-24 11:37:49 +02:00
full_key_part_map =
make_prev_keypart_map(spider_user_defined_key_parts(key_info));
2013-06-27 13:18:48 +02:00
else
full_key_part_map = 0;
if (start_key)
2015-10-28 23:34:53 +01:00
{
2013-06-27 13:18:48 +02:00
start_key_part_map = start_key->keypart_map & full_key_part_map;
2015-10-28 23:34:53 +01:00
} else {
2013-06-27 13:18:48 +02:00
start_key_part_map = 0;
use_both = FALSE;
}
2014-03-24 21:24:16 +01:00
if (end_key) {
2013-06-27 13:18:48 +02:00
end_key_part_map = end_key->keypart_map & full_key_part_map;
2014-03-24 21:24:16 +01:00
result_list->end_key = end_key;
} else {
2013-06-27 13:18:48 +02:00
end_key_part_map = 0;
use_both = FALSE;
}
2013-08-24 11:37:49 +02:00
DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u", key_info ?
spider_user_defined_key_parts(key_info) : 0));
2013-06-27 13:18:48 +02:00
DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
DBUG_PRINT("info", ("spider end_key_part_map=%lu", end_key_part_map));
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *tmp_map = dbug_tmp_use_all_columns(table, &table->read_set);
2013-06-27 13:18:48 +02:00
#endif
if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
2017-06-18 11:28:40 +02:00
const char *key_name = key_info->name.str;
key_name_length = key_info->name.length;
#else
const char *key_name = key_info->name;
key_name_length = strlen(key_name);
#endif
2013-06-27 13:18:48 +02:00
if (str->reserve(SPIDER_SQL_READ_LEN +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + key_name_length))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_READ_STR, SPIDER_SQL_READ_LEN);
if ((error_num = spider_dbton[dbton_id].db_util->
append_name(str, key_name, key_name_length)))
{
DBUG_RETURN(error_num);
}
dbton_hdl->set_order_pos(SPIDER_SQL_TYPE_HANDLER);
2015-10-28 23:34:53 +01:00
if (
(start_key_part_map || end_key_part_map) &&
!(use_both && (!start_key_part_map || !end_key_part_map))
) {
2013-06-27 13:18:48 +02:00
if (str_part->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str_part->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
result_list->ha_read_kind = 0;
} else if (!result_list->desc_flg)
{
if (str->reserve(SPIDER_SQL_FIRST_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
result_list->ha_read_kind = 1;
} else {
if (str->reserve(SPIDER_SQL_LAST_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LAST_STR, SPIDER_SQL_LAST_LEN);
result_list->ha_read_kind = 2;
}
}
if (!start_key_part_map && !end_key_part_map)
2015-10-28 23:34:53 +01:00
{
result_list->key_order = 0;
goto end;
} else if (use_both && (!start_key_part_map || !end_key_part_map))
{
result_list->key_order = 0;
2013-06-27 13:18:48 +02:00
goto end;
2015-10-28 23:34:53 +01:00
} else if (start_key_part_map >= end_key_part_map)
2013-06-27 13:18:48 +02:00
{
use_key = start_key;
another_key = end_key;
tgt_key_part_map = start_key_part_map;
} else {
use_key = end_key;
another_key = start_key;
tgt_key_part_map = end_key_part_map;
}
DBUG_PRINT("info", ("spider tgt_key_part_map=%lu", tgt_key_part_map));
2014-03-24 21:24:16 +01:00
if (start_key_part_map == end_key_part_map)
result_list->use_both_key = TRUE;
2013-06-27 13:18:48 +02:00
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
if (str->reserve(SPIDER_SQL_WHERE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
} else if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
if (str_part2->reserve(SPIDER_SQL_WHERE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str_part2->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
}
for (
key_part = key_info->key_part,
length = 0,
key_count = 0;
tgt_key_part_map;
length += store_length,
tgt_key_part_map >>= 1,
start_key_part_map >>= 1,
end_key_part_map >>= 1,
key_part++,
key_count++
) {
DBUG_PRINT("info", ("spider tgt_key_part_map=%lu", tgt_key_part_map));
2013-06-27 13:18:48 +02:00
store_length = key_part->store_length;
field = key_part->field;
key_name_length = dbton_share->get_column_name_length(field->field_index);
ptr = use_key->key + length;
if (use_both)
{
another_ptr = another_key->key + length;
if (
start_key_part_map &&
end_key_part_map &&
!memcmp(ptr, another_ptr, store_length)
)
key_eq = TRUE;
else {
key_eq = FALSE;
#ifndef DBUG_OFF
if (
start_key_part_map &&
end_key_part_map
)
DBUG_PRINT("info", ("spider memcmp=%d",
memcmp(ptr, another_ptr, store_length)));
#endif
}
} else {
if (tgt_key_part_map > 1)
key_eq = TRUE;
else
key_eq = FALSE;
}
if (
(key_eq && use_key == start_key) ||
(!key_eq && start_key_part_map)
) {
bool tgt_final = (use_key == start_key &&
(tgt_key_part_map == 1 || !end_key_part_map));
2013-06-27 13:18:48 +02:00
ptr = start_key->key + length;
if (
(error_num = dbton_hdl->append_is_null_part(sql_type, key_part,
2014-03-24 21:00:34 +01:00
start_key, &ptr, key_eq, tgt_final))
2013-06-27 13:18:48 +02:00
) {
if (error_num > 0)
DBUG_RETURN(error_num);
if (
!set_order &&
start_key->flag != HA_READ_KEY_EXACT &&
sql_kind == SPIDER_SQL_KIND_SQL
) {
result_list->key_order = key_count;
set_order = TRUE;
}
} else if (key_eq)
{
DBUG_PRINT("info", ("spider key_eq"));
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
} else if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
if (str_part2->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str_part2, field, ptr, FALSE, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
if (use_key == start_key)
{
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
2014-03-24 21:00:34 +01:00
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
2014-03-24 21:00:34 +01:00
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
#else
if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
{
if (str->reserve(SPIDER_SQL_EQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#endif
2014-03-24 21:00:34 +01:00
}
2013-06-27 13:18:48 +02:00
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
append_column_value(spider, NULL, field, ptr,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#endif
} else {
DBUG_PRINT("info", ("spider start_key->flag=%d", start_key->flag));
switch (start_key->flag)
{
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
case HA_READ_PREFIX_LAST:
result_list->desc_flg = TRUE;
#endif
2017-12-04 10:28:10 +01:00
/* fall through */
2013-06-27 13:18:48 +02:00
case HA_READ_KEY_EXACT:
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2013-06-27 13:18:48 +02:00
dbton_share->append_column_name(str, field->field_index);
bool is_like= MY_TEST(key_part->key_part_flag & HA_PART_KEY_SEG);
if (is_like)
{
if (str->append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
else
{
if (str->append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, is_like, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
} else if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
if (str_part2->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_EQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str_part2, field, ptr, FALSE,
share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
if (use_key == start_key)
{
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
if (tgt_key_part_map == 1 || !end_key_part_map)
2014-03-24 21:00:34 +01:00
{
if (str->reserve(SPIDER_SQL_EQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
2014-03-24 21:00:34 +01:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
#else
if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
{
if (str->reserve(SPIDER_SQL_EQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#endif
2014-03-24 21:00:34 +01:00
}
2013-06-27 13:18:48 +02:00
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
append_column_value(spider, NULL, field, ptr,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (str->reserve(SPIDER_SQL_HS_EQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_HS_EQUAL_STR, SPIDER_SQL_HS_EQUAL_LEN);
}
#endif
break;
case HA_READ_AFTER_KEY:
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
const char* op_str;
uint32 op_len;
if (start_key_part_map == 1) {
op_str = SPIDER_SQL_GT_STR;
op_len = SPIDER_SQL_GT_LEN;
} else {
op_str = SPIDER_SQL_GTEQUAL_STR;
op_len = SPIDER_SQL_GTEQUAL_LEN;
}
2013-06-27 13:18:48 +02:00
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(op_str, op_len);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (use_both)
start_key_part_map = 0;
if (!set_order)
{
result_list->key_order = key_count;
set_order = TRUE;
}
} else if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
if (str_part2->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_GT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str_part2, field, ptr, FALSE,
share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
if (use_key == start_key)
{
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
if (tgt_key_part_map == 1 || !end_key_part_map)
2014-03-24 21:00:34 +01:00
{
if (str->reserve(SPIDER_SQL_GT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
}
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
2014-03-24 21:00:34 +01:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
#else
if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
{
if (str->reserve(SPIDER_SQL_GT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#endif
2014-03-24 21:00:34 +01:00
}
2013-06-27 13:18:48 +02:00
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
append_column_value(spider, NULL, field, ptr,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (str->reserve(SPIDER_SQL_HS_GT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_HS_GT_STR, SPIDER_SQL_HS_GT_LEN);
}
#endif
break;
case HA_READ_BEFORE_KEY:
result_list->desc_flg = TRUE;
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
const char* op_str;
uint32 op_len;
if (start_key_part_map == 1) {
op_str = SPIDER_SQL_LT_STR;
op_len = SPIDER_SQL_LT_LEN;
} else {
op_str = SPIDER_SQL_LTEQUAL_STR;
op_len = SPIDER_SQL_LTEQUAL_LEN;
}
2013-06-27 13:18:48 +02:00
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(op_str, op_len);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (use_both)
start_key_part_map = 0;
if (!set_order)
{
result_list->key_order = key_count;
set_order = TRUE;
}
} else if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
if (str_part2->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str_part2, field, ptr, FALSE,
share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
if (use_key == start_key)
{
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
if (tgt_key_part_map == 1 || !end_key_part_map)
2014-03-24 21:00:34 +01:00
{
if (str->reserve(SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
}
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
2014-03-24 21:00:34 +01:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
#else
if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
{
if (str->reserve(SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#endif
2014-03-24 21:00:34 +01:00
}
2013-06-27 13:18:48 +02:00
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
append_column_value(spider, NULL, field, ptr,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (str->reserve(SPIDER_SQL_HS_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_HS_LT_STR, SPIDER_SQL_HS_LT_LEN);
}
#endif
break;
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
#else
case HA_READ_PREFIX_LAST:
result_list->limit_num = 1;
/* fall through */
#endif
case HA_READ_KEY_OR_PREV:
case HA_READ_PREFIX_LAST_OR_PREV:
result_list->desc_flg = TRUE;
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (!set_order)
{
result_list->key_order = key_count;
set_order = TRUE;
}
} else if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
if (str_part2->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str_part2, field, ptr, false,
share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
if (use_key == start_key)
{
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
if (tgt_key_part_map == 1 || !end_key_part_map)
2014-03-24 21:00:34 +01:00
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
2014-03-24 21:00:34 +01:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
#else
if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#endif
2014-03-24 21:00:34 +01:00
}
2013-06-27 13:18:48 +02:00
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
append_column_value(spider, NULL, field, ptr,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (str->reserve(SPIDER_SQL_HS_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_HS_LTEQUAL_STR,
SPIDER_SQL_HS_LTEQUAL_LEN);
}
#endif
break;
case HA_READ_MBR_CONTAIN:
if (str->reserve(SPIDER_SQL_MBR_CONTAIN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_MBR_CONTAIN_STR,
SPIDER_SQL_MBR_CONTAIN_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset) ||
str->reserve(SPIDER_SQL_COMMA_LEN + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_CLOSE_PAREN_LEN))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
SPIDER_SQL_CLOSE_PAREN_LEN);
break;
case HA_READ_MBR_INTERSECT:
if (str->reserve(SPIDER_SQL_MBR_INTERSECT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_MBR_INTERSECT_STR,
SPIDER_SQL_MBR_INTERSECT_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset) ||
str->reserve(SPIDER_SQL_COMMA_LEN + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_CLOSE_PAREN_LEN))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
SPIDER_SQL_CLOSE_PAREN_LEN);
break;
case HA_READ_MBR_WITHIN:
if (str->reserve(SPIDER_SQL_MBR_WITHIN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_MBR_WITHIN_STR,
SPIDER_SQL_MBR_WITHIN_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset) ||
str->reserve(SPIDER_SQL_COMMA_LEN + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_CLOSE_PAREN_LEN))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
SPIDER_SQL_CLOSE_PAREN_LEN);
break;
case HA_READ_MBR_DISJOINT:
if (str->reserve(SPIDER_SQL_MBR_DISJOINT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_MBR_DISJOINT_STR,
SPIDER_SQL_MBR_DISJOINT_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset) ||
str->reserve(SPIDER_SQL_COMMA_LEN + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_CLOSE_PAREN_LEN))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
SPIDER_SQL_CLOSE_PAREN_LEN);
break;
case HA_READ_MBR_EQUAL:
if (str->reserve(SPIDER_SQL_MBR_EQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_MBR_EQUAL_STR, SPIDER_SQL_MBR_EQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset) ||
str->reserve(SPIDER_SQL_COMMA_LEN + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_CLOSE_PAREN_LEN))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
SPIDER_SQL_CLOSE_PAREN_LEN);
break;
default:
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (!set_order)
{
result_list->key_order = key_count;
set_order = TRUE;
}
} else if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
if (str_part2->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_GTEQUAL_STR,
SPIDER_SQL_GTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str_part2, field, ptr, false,
share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
if (use_key == start_key)
{
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
if (tgt_key_part_map == 1 || !end_key_part_map)
2014-03-24 21:00:34 +01:00
{
if (str->reserve(SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_GTEQUAL_STR,
SPIDER_SQL_GTEQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
2014-03-24 21:00:34 +01:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
#else
if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
{
if (str->reserve(SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_GTEQUAL_STR,
SPIDER_SQL_GTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#endif
2014-03-24 21:00:34 +01:00
}
2013-06-27 13:18:48 +02:00
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
append_column_value(spider, NULL, field, ptr,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (str->reserve(SPIDER_SQL_HS_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_HS_GTEQUAL_STR,
SPIDER_SQL_HS_GTEQUAL_LEN);
}
#endif
break;
}
}
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
if (str->reserve(SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_AND_STR,
SPIDER_SQL_AND_LEN);
} else if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
if (str_part2->reserve(SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str_part2->q_append(SPIDER_SQL_AND_STR,
SPIDER_SQL_AND_LEN);
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
2014-03-24 21:00:34 +01:00
if (use_key == start_key)
{
if (str_part->reserve(SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str_part->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
#endif
2013-06-27 13:18:48 +02:00
}
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (sql_kind != SPIDER_SQL_KIND_HS)
{
#endif
if (
(key_eq && use_key == end_key) ||
(!key_eq && end_key_part_map)
) {
2014-03-24 21:00:34 +01:00
bool tgt_final = (use_key == end_key && tgt_key_part_map == 1);
2013-06-27 13:18:48 +02:00
ptr = end_key->key + length;
if ((error_num = dbton_hdl->append_is_null_part(sql_type, key_part,
2014-03-24 21:00:34 +01:00
end_key, &ptr, key_eq, tgt_final)))
2013-06-27 13:18:48 +02:00
{
if (error_num > 0)
DBUG_RETURN(error_num);
if (
!set_order &&
end_key->flag != HA_READ_KEY_EXACT &&
sql_kind == SPIDER_SQL_KIND_SQL
) {
result_list->key_order = key_count;
set_order = TRUE;
}
} else if (key_eq)
{
DBUG_PRINT("info", ("spider key_eq"));
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
} else {
if (str_part2->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str_part2, field, ptr, false,
share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
if (use_key == end_key)
{
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
#else
if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
2014-03-24 21:00:34 +01:00
{
if (str->reserve(SPIDER_SQL_EQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
}
#endif
2014-03-24 21:00:34 +01:00
}
2013-06-27 13:18:48 +02:00
}
} else {
DBUG_PRINT("info", ("spider end_key->flag=%d", end_key->flag));
switch (end_key->flag)
{
case HA_READ_BEFORE_KEY:
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
const char* op_str;
uint32 op_len;
if (end_key_part_map == 1) {
op_str = SPIDER_SQL_LT_STR;
op_len = SPIDER_SQL_LT_LEN;
} else {
op_str = SPIDER_SQL_LTEQUAL_STR;
op_len = SPIDER_SQL_LTEQUAL_LEN;
}
2013-06-27 13:18:48 +02:00
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(op_str, op_len);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (use_both)
end_key_part_map = 0;
if (!set_order)
{
result_list->key_order = key_count;
set_order = TRUE;
}
} else {
if (str_part2->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str_part2, field, ptr, false,
share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
if (use_key == end_key)
{
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
if (tgt_key_part_map == 1 || !start_key_part_map)
2014-03-24 21:00:34 +01:00
{
if (str->reserve(SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
}
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
2014-03-24 21:00:34 +01:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
#else
if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
{
if (str->reserve(SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr,
false, share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#endif
2014-03-24 21:00:34 +01:00
}
2013-06-27 13:18:48 +02:00
}
break;
default:
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str, field, ptr, FALSE, share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (!set_order)
{
result_list->key_order = key_count;
set_order = TRUE;
}
} else {
if (str_part2->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
str_part2->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->append_column_value(
spider, str_part2, field, ptr, false,
share->access_charset))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-03-24 21:00:34 +01:00
if (use_key == end_key)
{
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
if (tgt_key_part_map == 1 || !start_key_part_map)
2014-03-24 21:00:34 +01:00
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
2014-03-24 21:00:34 +01:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
#else
if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LTEQUAL_STR,
SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
2022-09-07 07:08:59 +02:00
append_column_value(spider, str_part, field, ptr,
false, share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#endif
2014-03-24 21:00:34 +01:00
}
2013-06-27 13:18:48 +02:00
}
break;
}
}
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
if (str->reserve(SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_AND_STR,
SPIDER_SQL_AND_LEN);
} else {
if (str_part2->reserve(SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str_part2->q_append(SPIDER_SQL_AND_STR,
SPIDER_SQL_AND_LEN);
#ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
2014-03-24 21:00:34 +01:00
if (use_key == end_key)
{
if (str_part->reserve(SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str_part->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
#endif
2013-06-27 13:18:48 +02:00
}
}
if (use_both && (!start_key_part_map || !end_key_part_map))
break;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
}
if ((error_num = dbton_hdl->append_where_terminator_part(sql_type,
set_order, key_count)))
DBUG_RETURN(error_num);
end:
if (spider->multi_range_num && current_pos == str->length())
{
DBUG_PRINT("info", ("spider no key where condition"));
dbton_hdl->no_where_cond = TRUE;
}
2013-06-27 13:18:48 +02:00
/* use condition */
if (dbton_hdl->append_condition_part(NULL, 0, sql_type, FALSE))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (sql_kind == SPIDER_SQL_KIND_SQL)
dbton_hdl->set_order_pos(sql_type);
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->read_set, tmp_map);
2013-06-27 13:18:48 +02:00
#endif
DBUG_RETURN(0);
}
int spider_db_append_key_where(
const key_range *start_key,
const key_range *end_key,
ha_spider *spider
) {
int error_num;
DBUG_ENTER("spider_db_append_key_where");
if ((spider->sql_kinds & SPIDER_SQL_KIND_SQL))
{
DBUG_PRINT("info",("spider call internal by SPIDER_SQL_KIND_SQL"));
if ((error_num = spider->append_key_where_sql_part(start_key, end_key,
SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
}
if (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER)
{
DBUG_PRINT("info",("spider call internal by SPIDER_SQL_KIND_HANDLER"));
if ((error_num = spider->append_key_where_sql_part(start_key, end_key,
SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if ((spider->sql_kinds & SPIDER_SQL_KIND_HS))
{
DBUG_PRINT("info",("spider call internal by SPIDER_SQL_KIND_HS"));
if ((error_num = spider->append_key_where_hs_part(start_key, end_key,
SPIDER_SQL_TYPE_SELECT_HS)))
DBUG_RETURN(error_num);
}
#endif
DBUG_RETURN(0);
}
int spider_db_append_charset_name_before_string(
spider_string *str,
CHARSET_INFO *cs
) {
const char *csname = cs->csname;
uint csname_length = strlen(csname);
DBUG_ENTER("spider_db_append_charset_name_before_string");
if (str->reserve(SPIDER_SQL_UNDERSCORE_LEN + csname_length))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
str->q_append(SPIDER_SQL_UNDERSCORE_STR, SPIDER_SQL_UNDERSCORE_LEN);
str->q_append(csname, csname_length);
DBUG_RETURN(0);
}
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
int spider_db_refetch_for_item_sum_funcs(
ha_spider *spider
) {
int error_num;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_refetch_for_item_sum_funcs");
if (result_list->snap_direct_aggregate)
{
SPIDER_DB_ROW *row = result_list->snap_row;
row->first();
if (result_list->snap_mrr_with_cnt)
{
row->next();
}
if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
int spider_db_fetch_for_item_sum_funcs(
SPIDER_DB_ROW *row,
ha_spider *spider
) {
int error_num;
st_select_lex *select_lex;
DBUG_ENTER("spider_db_fetch_for_item_sum_funcs");
select_lex = spider_get_select_lex(spider);
JOIN *join = select_lex->join;
Item_sum **item_sum_ptr;
spider->direct_aggregate_item_current = NULL;
for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
{
if ((error_num = spider_db_fetch_for_item_sum_func(row, *item_sum_ptr,
spider)))
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
int spider_db_fetch_for_item_sum_func(
SPIDER_DB_ROW *row,
Item_sum *item_sum,
ha_spider *spider
) {
int error_num;
SPIDER_SHARE *share = spider->share;
2014-06-08 12:52:11 +02:00
THD *thd = spider->trx->thd;
2013-09-16 20:22:54 +02:00
DBUG_ENTER("spider_db_fetch_for_item_sum_func");
DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
switch (item_sum->sum_func())
{
case Item_sum::COUNT_FUNC:
{
Item_sum_count *item_sum_count = (Item_sum_count *) item_sum;
if (!row->is_null())
item_sum_count->direct_add(row->val_int());
else
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
}
break;
case Item_sum::SUM_FUNC:
{
Item_sum_sum *item_sum_sum = (Item_sum_sum *) item_sum;
if (item_sum_sum->result_type() == DECIMAL_RESULT)
{
my_decimal decimal_value;
item_sum_sum->direct_add(row->val_decimal(&decimal_value,
share->access_charset));
} else {
item_sum_sum->direct_add(row->val_real(), row->is_null());
}
row->next();
}
break;
case Item_sum::MIN_FUNC:
case Item_sum::MAX_FUNC:
{
if (!spider->direct_aggregate_item_current)
{
if (!spider->direct_aggregate_item_first)
{
if (!spider_bulk_malloc(spider_current_trx, SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_1, MYF(MY_WME),
2013-09-16 20:22:54 +02:00
&spider->direct_aggregate_item_first, sizeof(SPIDER_ITEM_HLD),
NullS)
) {
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
spider->direct_aggregate_item_first->next = NULL;
spider->direct_aggregate_item_first->item = NULL;
spider->direct_aggregate_item_first->tgt_num = 0;
2015-10-28 23:34:53 +01:00
#ifdef SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY_AND_THDPTR
spider->direct_aggregate_item_first->init_mem_root = FALSE;
#endif
2013-09-16 20:22:54 +02:00
}
spider->direct_aggregate_item_current =
spider->direct_aggregate_item_first;
} else {
if (!spider->direct_aggregate_item_current->next)
{
if (!spider_bulk_malloc(spider_current_trx, SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_2, MYF(MY_WME),
2013-09-16 20:22:54 +02:00
&spider->direct_aggregate_item_current->next,
sizeof(SPIDER_ITEM_HLD), NullS)
) {
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
spider->direct_aggregate_item_current->next->next = NULL;
spider->direct_aggregate_item_current->next->item = NULL;
spider->direct_aggregate_item_current->next->tgt_num =
spider->direct_aggregate_item_current->tgt_num + 1;
2015-10-28 23:34:53 +01:00
#ifdef SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY_AND_THDPTR
spider->direct_aggregate_item_current->next->init_mem_root = FALSE;
#endif
2013-09-16 20:22:54 +02:00
}
spider->direct_aggregate_item_current =
spider->direct_aggregate_item_current->next;
}
if (!spider->direct_aggregate_item_current->item)
{
2015-10-28 23:34:53 +01:00
#ifdef SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY_AND_THDPTR
if (!spider->direct_aggregate_item_current->init_mem_root)
{
SPD_INIT_ALLOC_ROOT(
&spider->direct_aggregate_item_current->mem_root,
4096, 0, MYF(MY_WME));
spider->direct_aggregate_item_current->init_mem_root = TRUE;
}
#endif
2014-06-08 12:52:11 +02:00
Item *free_list = thd->free_list;
2013-09-16 20:22:54 +02:00
spider->direct_aggregate_item_current->item =
2015-02-19 16:41:26 +01:00
#ifdef SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY
2015-10-28 23:34:53 +01:00
#ifdef SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY_AND_THDPTR
new (&spider->direct_aggregate_item_current->mem_root)
Item_string(thd, "", 0, share->access_charset);
#else
2015-02-19 16:41:26 +01:00
new Item_string("", 0, share->access_charset);
2015-10-28 23:34:53 +01:00
#endif
2015-02-19 16:41:26 +01:00
#else
2013-09-16 20:22:54 +02:00
new Item_string(share->access_charset);
2015-02-19 16:41:26 +01:00
#endif
2013-09-16 20:22:54 +02:00
if (!spider->direct_aggregate_item_current->item)
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2014-06-08 12:52:11 +02:00
thd->free_list = free_list;
2013-09-16 20:22:54 +02:00
}
2019-08-07 12:13:44 +02:00
Item_sum_min_max *item_sum_min_max = (Item_sum_min_max *) item_sum;
2013-09-16 20:22:54 +02:00
Item_string *item =
(Item_string *) spider->direct_aggregate_item_current->item;
if (row->is_null())
{
2015-02-19 16:41:26 +01:00
#ifdef SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY
item->val_str(NULL)->length(0);
item->append(NULL, 0);
#else
2013-09-16 20:22:54 +02:00
item->set_str_with_copy(NULL, 0);
2015-02-19 16:41:26 +01:00
#endif
2013-09-16 20:22:54 +02:00
item->null_value = TRUE;
} else {
char buf[MAX_FIELD_WIDTH];
spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
tmp_str.init_calc_mem(SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_3);
2013-09-16 20:22:54 +02:00
tmp_str.length(0);
if ((error_num = row->append_to_str(&tmp_str)))
DBUG_RETURN(error_num);
2015-02-19 16:41:26 +01:00
#ifdef SPIDER_ITEM_STRING_WITHOUT_SET_STR_WITH_COPY
item->val_str(NULL)->length(0);
item->append((char *) tmp_str.ptr(), tmp_str.length());
#else
2013-09-16 20:22:54 +02:00
item->set_str_with_copy(tmp_str.ptr(), tmp_str.length());
2015-02-19 16:41:26 +01:00
#endif
2013-09-16 20:22:54 +02:00
item->null_value = FALSE;
}
2019-08-07 12:13:44 +02:00
item_sum_min_max->direct_add(item);
2013-09-16 20:22:54 +02:00
row->next();
}
break;
case Item_sum::COUNT_DISTINCT_FUNC:
case Item_sum::SUM_DISTINCT_FUNC:
case Item_sum::AVG_FUNC:
case Item_sum::AVG_DISTINCT_FUNC:
case Item_sum::STD_FUNC:
case Item_sum::VARIANCE_FUNC:
case Item_sum::SUM_BIT_FUNC:
case Item_sum::UDF_SUM_FUNC:
case Item_sum::GROUP_CONCAT_FUNC:
default:
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
}
DBUG_RETURN(0);
}
#endif
2013-06-27 13:18:48 +02:00
int spider_db_append_match_fetch(
ha_spider *spider,
st_spider_ft_info *ft_first,
st_spider_ft_info *ft_current,
SPIDER_DB_ROW *row
) {
DBUG_ENTER("spider_db_append_match_fetch");
if (ft_current)
{
st_spider_ft_info *ft_info = ft_first;
while (TRUE)
{
DBUG_PRINT("info",("spider ft_info=%p", ft_info));
if (!row->is_null())
ft_info->score = (float) row->val_real();
else
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
if (ft_info == ft_current)
break;
ft_info = ft_info->next;
}
}
DBUG_RETURN(0);
}
int spider_db_append_match_where(
ha_spider *spider
) {
int error_num;
DBUG_ENTER("spider_db_append_match_where");
if ((error_num = spider->append_match_where_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
/* use condition */
if ((error_num = spider->append_condition_sql_part(
NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL, FALSE)))
DBUG_RETURN(error_num);
spider->set_order_pos_sql(SPIDER_SQL_TYPE_SELECT_SQL);
DBUG_RETURN(0);
}
void spider_db_append_handler_next(
ha_spider *spider
) {
const char *alias;
uint alias_length;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_append_handler_next");
if (result_list->sorted && result_list->desc_flg)
{
alias = SPIDER_SQL_PREV_STR;
alias_length = SPIDER_SQL_PREV_LEN;
} else {
alias = SPIDER_SQL_NEXT_STR;
alias_length = SPIDER_SQL_NEXT_LEN;
}
spider->set_order_to_pos_sql(SPIDER_SQL_TYPE_HANDLER);
spider->append_key_order_with_alias_sql_part(alias, alias_length,
SPIDER_SQL_TYPE_HANDLER);
DBUG_VOID_RETURN;
}
void spider_db_get_row_from_tmp_tbl_rec(
SPIDER_RESULT *current,
SPIDER_DB_ROW **row
) {
DBUG_ENTER("spider_db_get_row_from_tmp_tbl_rec");
*row = current->result->fetch_row_from_tmp_table(current->result_tmp_tbl);
DBUG_VOID_RETURN;
}
int spider_db_get_row_from_tmp_tbl(
SPIDER_RESULT *current,
SPIDER_DB_ROW **row
) {
int error_num;
DBUG_ENTER("spider_db_get_row_from_tmp_tbl");
if (current->result_tmp_tbl_inited == 2)
{
current->result_tmp_tbl->file->ha_rnd_end();
current->result_tmp_tbl_inited = 0;
}
if (current->result_tmp_tbl_inited == 0)
{
current->result_tmp_tbl->file->extra(HA_EXTRA_CACHE);
if ((error_num = current->result_tmp_tbl->file->ha_rnd_init(TRUE)))
DBUG_RETURN(error_num);
current->result_tmp_tbl_inited = 1;
}
if (
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
(error_num = current->result_tmp_tbl->file->ha_rnd_next(
current->result_tmp_tbl->record[0]))
#else
(error_num = current->result_tmp_tbl->file->rnd_next(
current->result_tmp_tbl->record[0]))
#endif
) {
DBUG_RETURN(error_num);
}
spider_db_get_row_from_tmp_tbl_rec(current, row);
DBUG_RETURN(0);
}
int spider_db_get_row_from_tmp_tbl_pos(
SPIDER_POSITION *pos,
SPIDER_DB_ROW **row
) {
int error_num;
SPIDER_RESULT *result = pos->result;
TABLE *tmp_tbl = result->result_tmp_tbl;
DBUG_ENTER("spider_db_get_row_from_tmp_tbl_pos");
if (result->result_tmp_tbl_inited == 1)
{
tmp_tbl->file->ha_rnd_end();
result->result_tmp_tbl_inited = 0;
}
if (result->result_tmp_tbl_inited == 0)
{
if ((error_num = tmp_tbl->file->ha_rnd_init(FALSE)))
DBUG_RETURN(error_num);
result->result_tmp_tbl_inited = 2;
}
if (
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
(error_num = tmp_tbl->file->ha_rnd_pos(tmp_tbl->record[0],
(uchar *) &pos->tmp_tbl_pos))
#else
(error_num = tmp_tbl->file->rnd_pos(tmp_tbl->record[0],
(uchar *) &pos->tmp_tbl_pos))
#endif
) {
DBUG_RETURN(error_num);
}
spider_db_get_row_from_tmp_tbl_rec(result, row);
DBUG_RETURN(0);
}
int spider_db_fetch_row(
SPIDER_SHARE *share,
Field *field,
SPIDER_DB_ROW *row,
my_ptrdiff_t ptr_diff
) {
int error_num;
THD *thd = field->table->in_use;
Time_zone *saved_time_zone = thd->variables.time_zone;
2013-06-27 13:18:48 +02:00
DBUG_ENTER("spider_db_fetch_row");
DBUG_PRINT("info", ("spider field_name %s", SPIDER_field_name_str(field)));
2013-06-27 13:18:48 +02:00
DBUG_PRINT("info", ("spider fieldcharset %s", field->charset()->csname));
thd->variables.time_zone = UTC;
2013-06-27 13:18:48 +02:00
field->move_field_offset(ptr_diff);
error_num = row->store_to_field(field, share->access_charset);
field->move_field_offset(-ptr_diff);
thd->variables.time_zone = saved_time_zone;
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
int spider_db_fetch_table(
ha_spider *spider,
uchar *buf,
TABLE *table,
SPIDER_RESULT_LIST *result_list
) {
int error_num;
SPIDER_SHARE *share = spider->share;
my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(buf, table->record[0]);
SPIDER_RESULT *current = (SPIDER_RESULT*) result_list->current;
SPIDER_DB_ROW *row;
Field **field;
DBUG_ENTER("spider_db_fetch_table");
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->conn_kind[spider->result_link_idx] == SPIDER_CONN_KIND_MYSQL)
{
#endif
if (result_list->quick_mode == 0)
{
SPIDER_DB_RESULT *result = current->result;
if (!(row = result->fetch_row()))
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
} else {
if (result_list->current_row_num < result_list->quick_page_size)
{
if (!current->first_position)
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
2013-06-27 13:18:48 +02:00
row = current->first_position[result_list->current_row_num].row;
} else {
if ((error_num = spider_db_get_row_from_tmp_tbl(
current, &row)))
{
if (error_num == HA_ERR_END_OF_FILE)
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(error_num);
}
}
}
2013-09-16 20:31:13 +02:00
DBUG_PRINT("info", ("spider row=%p", row));
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
2013-09-17 15:08:07 +02:00
DBUG_PRINT("info", ("spider direct_aggregate=%s",
result_list->direct_aggregate ? "TRUE" : "FALSE"));
2013-09-16 20:22:54 +02:00
result_list->snap_mrr_with_cnt = spider->mrr_with_cnt;
result_list->snap_direct_aggregate = result_list->direct_aggregate;
result_list->snap_row = row;
#endif
2013-06-27 13:18:48 +02:00
/* for mrr */
if (spider->mrr_with_cnt)
{
DBUG_PRINT("info", ("spider mrr_with_cnt"));
if (spider->sql_kind[spider->result_link_idx] == SPIDER_SQL_KIND_SQL)
{
if (!row->is_null())
spider->multi_range_hit_point = row->val_int();
2014-03-24 20:31:11 +01:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
else if (result_list->direct_aggregate)
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
#endif
2013-06-27 13:18:48 +02:00
else
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
2013-09-16 20:22:54 +02:00
} else {
2013-06-27 13:18:48 +02:00
spider->multi_range_hit_point = 0;
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
result_list->snap_mrr_with_cnt = FALSE;
#endif
}
2013-06-27 13:18:48 +02:00
}
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
/* for direct_aggregate */
if (result_list->direct_aggregate)
{
if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
DBUG_RETURN(error_num);
}
#endif
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
if (!spider->use_fields)
{
#endif
if ((error_num = spider_db_append_match_fetch(spider,
spider->ft_first, spider->ft_current, row)))
DBUG_RETURN(error_num);
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
}
#endif
2013-06-27 13:18:48 +02:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
if (!(row = result_list->hs_result->fetch_row_from_result_buffer(
result_list->hs_result_buf)))
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
}
#endif
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->conn_kind[spider->result_link_idx] == SPIDER_CONN_KIND_MYSQL)
{
#endif
for (
field = table->field;
*field;
field++
) {
if ((
bitmap_is_set(table->read_set, (*field)->field_index) |
bitmap_is_set(table->write_set, (*field)->field_index)
)) {
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
2013-06-27 13:18:48 +02:00
#endif
Changing field::field_name and Item::name to LEX_CSTRING Benefits of this patch: - Removed a lot of calls to strlen(), especially for field_string - Strings generated by parser are now const strings, less chance of accidently changing a string - Removed a lot of calls with LEX_STRING as parameter (changed to pointer) - More uniform code - Item::name_length was not kept up to date. Now fixed - Several bugs found and fixed (Access to null pointers, access of freed memory, wrong arguments to printf like functions) - Removed a lot of casts from (const char*) to (char*) Changes: - This caused some ABI changes - lex_string_set now uses LEX_CSTRING - Some fucntions are now taking const char* instead of char* - Create_field::change and after changed to LEX_CSTRING - handler::connect_string, comment and engine_name() changed to LEX_CSTRING - Checked printf() related calls to find bugs. Found and fixed several errors in old code. - A lot of changes from LEX_STRING to LEX_CSTRING, especially related to parsing and events. - Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING* - Some changes for char* to const char* - Added printf argument checking for my_snprintf() - Introduced null_clex_str, star_clex_string, temp_lex_str to simplify code - Added item_empty_name and item_used_name to be able to distingush between items that was given an empty name and items that was not given a name This is used in sql_yacc.yy to know when to give an item a name. - select table_name."*' is not anymore same as table_name.* - removed not used function Item::rename() - Added comparision of item->name_length before some calls to my_strcasecmp() to speed up comparison - Moved Item_sp_variable::make_field() from item.h to item.cc - Some minimal code changes to avoid copying to const char * - Fixed wrong error message in wsrep_mysql_parse() - Fixed wrong code in find_field_in_natural_join() where real_item() was set when it shouldn't - ER_ERROR_ON_RENAME was used with extra arguments. - Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already give the error. TODO: - Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c - Change code to not modify LEX_CSTRING for database name (as part of lower_case_table_names)
2017-04-23 18:39:57 +02:00
DBUG_PRINT("info", ("spider bitmap is set %s",
SPIDER_field_name_str(*field)));
2013-06-27 13:18:48 +02:00
if ((error_num =
spider_db_fetch_row(share, *field, row, ptr_diff)))
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, tmp_map);
2013-06-27 13:18:48 +02:00
#endif
} else {
DBUG_PRINT("info", ("spider bitmap is not set %s",
SPIDER_field_name_str(*field)));
2013-06-27 13:18:48 +02:00
}
row->next();
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
if (spider->hs_pushed_ret_fields_num == MAX_FIELDS)
{
#endif
spider_db_handler *dbton_hdl = spider->dbton_handler[row->dbton_id];
2013-06-27 13:18:48 +02:00
for (
field = table->field;
*field;
field++
) {
if (dbton_hdl->minimum_select_bit_is_set((*field)->field_index))
{
2013-06-27 13:18:48 +02:00
#ifndef DBUG_OFF
my_bitmap_map *tmp_map =
dbug_tmp_use_all_columns(table, table->write_set);
#endif
if ((error_num = spider_db_fetch_row(share, *field, row, ptr_diff)))
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
dbug_tmp_restore_column_map(table->write_set, tmp_map);
#endif
row->next();
}
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
} else {
uint32 *field_idxs = spider->hs_pushed_ret_fields;
size_t field_idxs_num = spider->hs_pushed_ret_fields_num;
Field *tf;
int roop_count;
if (spider->hs_pushed_lcl_fields_num !=
result_list->hs_result->num_fields())
{
DBUG_PRINT("info", ("spider different field_num %zu %u",
spider->hs_pushed_lcl_fields_num,
result_list->hs_result->num_fields()));
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
}
for (roop_count = 0; roop_count < (int) field_idxs_num;
roop_count++)
{
tf = spider->get_top_table_field(field_idxs[roop_count]);
if ((tf = spider->field_exchange(tf)))
{
#ifndef DBUG_OFF
my_bitmap_map *tmp_map =
dbug_tmp_use_all_columns(table, table->write_set);
#endif
if ((error_num = spider_db_fetch_row(share, tf, row, ptr_diff)))
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
dbug_tmp_restore_column_map(table->write_set, tmp_map);
#endif
row->next();
}
}
}
#endif
}
#endif
table->status = 0;
DBUG_RETURN(0);
}
int spider_db_fetch_key(
ha_spider *spider,
uchar *buf,
TABLE *table,
const KEY *key_info,
SPIDER_RESULT_LIST *result_list
) {
int error_num;
SPIDER_SHARE *share = spider->share;
my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(buf, table->record[0]);
SPIDER_RESULT *current = (SPIDER_RESULT*) result_list->current;
KEY_PART_INFO *key_part;
uint part_num;
SPIDER_DB_ROW *row;
Field *field;
DBUG_ENTER("spider_db_fetch_key");
if (result_list->quick_mode == 0)
{
SPIDER_DB_RESULT *result = current->result;
if (!(row = result->fetch_row()))
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
} else {
if (result_list->current_row_num < result_list->quick_page_size)
{
if (!current->first_position)
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
2013-06-27 13:18:48 +02:00
row = current->first_position[result_list->current_row_num].row;
} else {
if ((error_num = spider_db_get_row_from_tmp_tbl(
current, &row)))
{
if (error_num == HA_ERR_END_OF_FILE)
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(error_num);
}
}
}
2013-09-16 20:31:13 +02:00
DBUG_PRINT("info", ("spider row=%p", row));
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
2013-09-17 15:08:07 +02:00
DBUG_PRINT("info", ("spider direct_aggregate=%s",
result_list->direct_aggregate ? "TRUE" : "FALSE"));
2013-09-16 20:22:54 +02:00
result_list->snap_mrr_with_cnt = spider->mrr_with_cnt;
result_list->snap_direct_aggregate = result_list->direct_aggregate;
result_list->snap_row = row;
#endif
2013-06-27 13:18:48 +02:00
/* for mrr */
if (spider->mrr_with_cnt)
{
DBUG_PRINT("info", ("spider mrr_with_cnt"));
if (!row->is_null())
spider->multi_range_hit_point = row->val_int();
2014-03-24 20:31:11 +01:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
else if (result_list->direct_aggregate)
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
#endif
2013-06-27 13:18:48 +02:00
else
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
}
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
/* for direct_aggregate */
if (result_list->direct_aggregate)
{
if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
DBUG_RETURN(error_num);
}
#endif
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_append_match_fetch(spider,
spider->ft_first, spider->ft_current, row)))
DBUG_RETURN(error_num);
for (
key_part = key_info->key_part,
part_num = 0;
2013-08-24 11:37:49 +02:00
part_num < spider_user_defined_key_parts(key_info);
2013-06-27 13:18:48 +02:00
key_part++,
part_num++
) {
field = key_part->field;
if ((
bitmap_is_set(table->read_set, field->field_index) |
bitmap_is_set(table->write_set, field->field_index)
)) {
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
2013-06-27 13:18:48 +02:00
#endif
DBUG_PRINT("info", ("spider bitmap is set %s",
SPIDER_field_name_str(field)));
2013-06-27 13:18:48 +02:00
if ((error_num =
spider_db_fetch_row(share, field, row, ptr_diff)))
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, tmp_map);
2013-06-27 13:18:48 +02:00
#endif
}
row->next();
}
table->status = 0;
DBUG_RETURN(0);
}
int spider_db_fetch_minimum_columns(
ha_spider *spider,
uchar *buf,
TABLE *table,
SPIDER_RESULT_LIST *result_list
) {
int error_num;
my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(buf, table->record[0]);
SPIDER_SHARE *share = spider->share;
SPIDER_RESULT *current = (SPIDER_RESULT*) result_list->current;
SPIDER_DB_ROW *row;
Field **field;
spider_db_handler *dbton_hdl;
2013-06-27 13:18:48 +02:00
DBUG_ENTER("spider_db_fetch_minimum_columns");
if (result_list->quick_mode == 0)
{
SPIDER_DB_RESULT *result = current->result;
if (!(row = result->fetch_row()))
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
} else {
if (result_list->current_row_num < result_list->quick_page_size)
{
DBUG_PRINT("info", ("spider current=%p", current));
DBUG_PRINT("info", ("spider first_position=%p", current->first_position));
if (!current->first_position)
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
DBUG_PRINT("info", ("spider current_row_num=%lld", result_list->current_row_num));
DBUG_PRINT("info", ("spider first_position[]=%p", &current->first_position[result_list->current_row_num]));
2013-06-27 13:18:48 +02:00
row = current->first_position[result_list->current_row_num].row;
} else {
if ((error_num = spider_db_get_row_from_tmp_tbl(
current, &row)))
{
if (error_num == HA_ERR_END_OF_FILE)
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(error_num);
}
}
}
2013-09-16 20:31:13 +02:00
DBUG_PRINT("info", ("spider row=%p", row));
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
2013-09-17 15:08:07 +02:00
DBUG_PRINT("info", ("spider direct_aggregate=%s",
result_list->direct_aggregate ? "TRUE" : "FALSE"));
2013-09-16 20:22:54 +02:00
result_list->snap_mrr_with_cnt = spider->mrr_with_cnt;
result_list->snap_direct_aggregate = result_list->direct_aggregate;
result_list->snap_row = row;
#endif
2013-06-27 13:18:48 +02:00
/* for mrr */
if (spider->mrr_with_cnt)
{
DBUG_PRINT("info", ("spider mrr_with_cnt"));
if (!row->is_null())
spider->multi_range_hit_point = row->val_int();
2014-03-24 20:31:11 +01:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
else if (result_list->direct_aggregate)
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
#endif
2013-06-27 13:18:48 +02:00
else
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
}
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
/* for direct_aggregate */
if (result_list->direct_aggregate)
{
if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
DBUG_RETURN(error_num);
}
#endif
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_append_match_fetch(spider,
spider->ft_first, spider->ft_current, row)))
DBUG_RETURN(error_num);
dbton_hdl = spider->dbton_handler[row->dbton_id];
2013-06-27 13:18:48 +02:00
for (
field = table->field;
*field;
field++
) {
DBUG_PRINT("info", ("spider field_index %u", (*field)->field_index));
DBUG_PRINT("info", ("spider searched_bitmap %u",
spider_bit_is_set(spider->searched_bitmap, (*field)->field_index)));
DBUG_PRINT("info", ("spider read_set %u",
bitmap_is_set(table->read_set, (*field)->field_index)));
DBUG_PRINT("info", ("spider write_set %u",
bitmap_is_set(table->write_set, (*field)->field_index)));
if (dbton_hdl->minimum_select_bit_is_set((*field)->field_index))
{
2013-06-27 13:18:48 +02:00
if ((
bitmap_is_set(table->read_set, (*field)->field_index) |
bitmap_is_set(table->write_set, (*field)->field_index)
)) {
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
2013-06-27 13:18:48 +02:00
#endif
Changing field::field_name and Item::name to LEX_CSTRING Benefits of this patch: - Removed a lot of calls to strlen(), especially for field_string - Strings generated by parser are now const strings, less chance of accidently changing a string - Removed a lot of calls with LEX_STRING as parameter (changed to pointer) - More uniform code - Item::name_length was not kept up to date. Now fixed - Several bugs found and fixed (Access to null pointers, access of freed memory, wrong arguments to printf like functions) - Removed a lot of casts from (const char*) to (char*) Changes: - This caused some ABI changes - lex_string_set now uses LEX_CSTRING - Some fucntions are now taking const char* instead of char* - Create_field::change and after changed to LEX_CSTRING - handler::connect_string, comment and engine_name() changed to LEX_CSTRING - Checked printf() related calls to find bugs. Found and fixed several errors in old code. - A lot of changes from LEX_STRING to LEX_CSTRING, especially related to parsing and events. - Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING* - Some changes for char* to const char* - Added printf argument checking for my_snprintf() - Introduced null_clex_str, star_clex_string, temp_lex_str to simplify code - Added item_empty_name and item_used_name to be able to distingush between items that was given an empty name and items that was not given a name This is used in sql_yacc.yy to know when to give an item a name. - select table_name."*' is not anymore same as table_name.* - removed not used function Item::rename() - Added comparision of item->name_length before some calls to my_strcasecmp() to speed up comparison - Moved Item_sp_variable::make_field() from item.h to item.cc - Some minimal code changes to avoid copying to const char * - Fixed wrong error message in wsrep_mysql_parse() - Fixed wrong code in find_field_in_natural_join() where real_item() was set when it shouldn't - ER_ERROR_ON_RENAME was used with extra arguments. - Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already give the error. TODO: - Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c - Change code to not modify LEX_CSTRING for database name (as part of lower_case_table_names)
2017-04-23 18:39:57 +02:00
DBUG_PRINT("info", ("spider bitmap is set %s",
SPIDER_field_name_str(*field)));
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_fetch_row(share, *field, row, ptr_diff)))
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, tmp_map);
2013-06-27 13:18:48 +02:00
#endif
}
row->next();
}
}
table->status = 0;
DBUG_RETURN(0);
}
void spider_db_free_one_result_for_start_next(
ha_spider *spider
) {
SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_RESULT *result = (SPIDER_RESULT *) result_list->current;
DBUG_ENTER("spider_db_free_one_result_for_start_next");
spider_bg_all_conn_break(spider);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->conn_kind[spider->result_link_idx] == SPIDER_CONN_KIND_MYSQL)
{
#endif
if (result_list->low_mem_read)
{
if (result)
{
do {
spider_db_free_one_result(result_list, result);
DBUG_PRINT("info",("spider result=%p", result));
DBUG_PRINT("info",("spider result->finish_flg = FALSE"));
result->finish_flg = FALSE;
result = (SPIDER_RESULT *) result->next;
} while (result && (result->result || result->first_position));
result = (SPIDER_RESULT *) result_list->current;
if (
!result->result &&
2014-09-18 02:26:30 +02:00
!result->first_position &&
!result->tmp_tbl_use_position
2013-06-27 13:18:48 +02:00
)
result_list->current = result->prev;
}
} else {
while (
result && result->next &&
(result->next->result || result->next->first_position)
) {
result_list->current = result->next;
result = (SPIDER_RESULT *) result->next;
}
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
if (result_list->hs_has_result)
{
if (result_list->hs_result)
{
result_list->hs_result->free_result();
delete result_list->hs_result;
result_list->hs_result = NULL;
}
if (result_list->hs_result_buf)
{
result_list->hs_result_buf->clear();
}
result_list->hs_has_result = FALSE;
}
}
#endif
DBUG_VOID_RETURN;
}
void spider_db_free_one_result(
SPIDER_RESULT_LIST *result_list,
SPIDER_RESULT *result
) {
DBUG_ENTER("spider_db_free_one_result");
if (result_list->quick_mode == 0)
{
if (
!result->use_position &&
result->result
) {
result->result->free_result();
delete result->result;
result->result = NULL;
}
} else {
int roop_count;
SPIDER_POSITION *position = result->first_position;
if (position)
{
for (roop_count = 0; roop_count < result->pos_page_size; roop_count++)
{
if (
position[roop_count].row &&
!position[roop_count].use_position
) {
delete position[roop_count].row;
position[roop_count].row = NULL;
}
}
2014-09-18 02:26:30 +02:00
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();
2015-02-19 16:41:26 +01:00
if (!result->tmp_tbl_use_position)
{
delete result->result;
result->result = NULL;
}
2014-09-18 02:26:30 +02:00
}
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;
}
}
}
2013-06-27 13:18:48 +02:00
}
}
DBUG_VOID_RETURN;
}
void spider_db_free_one_quick_result(
SPIDER_RESULT *result
) {
DBUG_ENTER("spider_db_free_one_quick_result");
if (result && result->result)
{
result->result->free_result();
if (!result->result_tmp_tbl)
{
delete result->result;
result->result = NULL;
}
}
DBUG_VOID_RETURN;
}
2013-06-27 13:18:48 +02:00
int spider_db_free_result(
ha_spider *spider,
bool final
) {
SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_RESULT *result;
SPIDER_RESULT *prev;
SPIDER_SHARE *share = spider->share;
SPIDER_TRX *trx = spider->trx;
SPIDER_POSITION *position;
int roop_count, error_num;
DBUG_ENTER("spider_db_free_result");
spider_bg_all_conn_break(spider);
result = (SPIDER_RESULT*) result_list->first;
while (result_list->tmp_pos_row_first)
{
SPIDER_DB_ROW *tmp_pos_row = result_list->tmp_pos_row_first;
result_list->tmp_pos_row_first = tmp_pos_row->next_pos;
delete tmp_pos_row;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (result_list->hs_has_result)
{
if (result_list->hs_result)
{
result_list->hs_result->free_result();
delete result_list->hs_result;
result_list->hs_result = NULL;
}
if (result_list->hs_result_buf)
{
if (result_list->hs_result_buf->check_size(
spider_param_hs_result_free_size(trx->thd, share->hs_result_free_size))
) {
trx->hs_result_free_count++;
}
result_list->hs_result_buf->clear();
}
result_list->hs_has_result = FALSE;
}
#endif
if (
final ||
spider_param_reset_sql_alloc(trx->thd, share->reset_sql_alloc) == 1
) {
int alloc_size = final ? 0 :
(spider_param_init_sql_alloc_size(trx->thd, share->init_sql_alloc_size));
while (result)
{
position = result->first_position;
if (position)
{
for (roop_count = 0; roop_count < result->pos_page_size; roop_count++)
{
if (position[roop_count].row)
{
delete position[roop_count].row;
}
}
spider_free(spider_current_trx, position, MYF(0));
}
if (result->result)
{
result->result->free_result();
delete result->result;
result->result = NULL;
}
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;
}
prev = result;
result = (SPIDER_RESULT*) result->next;
spider_free(spider_current_trx, prev, MYF(0));
}
result_list->first = NULL;
result_list->last = NULL;
if (!final)
{
ulong realloced = 0;
int init_sql_alloc_size =
spider_param_init_sql_alloc_size(trx->thd, share->init_sql_alloc_size);
for (roop_count = 0; roop_count < (int) share->use_dbton_count;
roop_count++)
{
uint dbton_id = share->use_dbton_ids[roop_count];
if ((error_num = spider->dbton_handler[dbton_id]->
realloc_sql(&realloced)))
{
DBUG_RETURN(error_num);
}
}
if (realloced & (SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER))
{
for (roop_count = 0; roop_count < (int) share->link_count;
roop_count++)
{
if ((int) result_list->sqls[roop_count].alloced_length() >
alloc_size * 2)
{
result_list->sqls[roop_count].free();
if (result_list->sqls[roop_count].real_alloc(
init_sql_alloc_size))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
}
}
if (realloced & SPIDER_SQL_TYPE_INSERT_SQL)
{
for (roop_count = 0; roop_count < (int) share->link_count;
roop_count++)
{
if ((int) result_list->insert_sqls[roop_count].alloced_length() >
alloc_size * 2)
{
result_list->insert_sqls[roop_count].free();
if (result_list->insert_sqls[roop_count].real_alloc(
init_sql_alloc_size))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
}
}
if (realloced & SPIDER_SQL_TYPE_UPDATE_SQL)
{
for (roop_count = 0; roop_count < (int) share->link_count;
roop_count++)
{
if ((int) result_list->update_sqls[roop_count].alloced_length() >
alloc_size * 2)
{
result_list->update_sqls[roop_count].free();
if (result_list->update_sqls[roop_count].real_alloc(
init_sql_alloc_size))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
}
}
if ((error_num = spider->reset_sql_sql(SPIDER_SQL_TYPE_BULK_UPDATE_SQL)))
DBUG_RETURN(error_num);
if (realloced & SPIDER_SQL_TYPE_TMP_SQL)
{
for (roop_count = 0; roop_count < (int) share->link_count;
roop_count++)
{
if ((int) result_list->tmp_sqls[roop_count].alloced_length() >
alloc_size * 2)
{
result_list->tmp_sqls[roop_count].free();
if (result_list->tmp_sqls[roop_count].real_alloc(
init_sql_alloc_size))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
}
}
}
} else {
while (result)
{
position = result->first_position;
if (position)
{
for (roop_count = 0; roop_count < result->pos_page_size; roop_count++)
{
if (position[roop_count].row)
{
delete position[roop_count].row;
}
}
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->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;
}
result->record_num = 0;
DBUG_PRINT("info",("spider result->finish_flg = FALSE"));
result->finish_flg = FALSE;
2014-09-18 02:26:30 +02:00
result->first_pos_use_position = FALSE;
result->tmp_tbl_use_position = FALSE;
2013-06-27 13:18:48 +02:00
result->use_position = FALSE;
result = (SPIDER_RESULT*) result->next;
}
}
result_list->current = NULL;
result_list->record_num = 0;
DBUG_PRINT("info",("spider result_list->finish_flg = FALSE"));
result_list->finish_flg = FALSE;
result_list->quick_phase = 0;
#ifndef WITHOUT_SPIDER_BG_SEARCH
result_list->bgs_phase = 0;
#endif
DBUG_RETURN(0);
}
int spider_db_store_result(
ha_spider *spider,
int link_idx,
TABLE *table
) {
int error_num;
SPIDER_CONN *conn;
SPIDER_DB_CONN *db_conn;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_RESULT *current;
DBUG_ENTER("spider_db_store_result");
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
{
#endif
conn = spider->conns[link_idx];
DBUG_PRINT("info",("spider conn->connection_id=%llu",
conn->connection_id));
DBUG_PRINT("info",("spider spider->connection_ids[%d]=%llu",
link_idx, spider->connection_ids[link_idx]));
if (conn->connection_id != spider->connection_ids[link_idx])
{
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)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
}
db_conn = conn->db_conn;
if (!result_list->current)
{
if (!result_list->first)
{
if (!(result_list->first = (SPIDER_RESULT *)
spider_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_1, sizeof(*result_list->first),
2013-06-27 13:18:48 +02:00
MYF(MY_WME | MY_ZEROFILL)))
) {
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
TMP_TABLE_PARAM *tmp_tbl_prm = (TMP_TABLE_PARAM *)
&result_list->first->result_tmp_tbl_prm;
tmp_tbl_prm->init();
tmp_tbl_prm->field_count = 3;
result_list->last = result_list->first;
result_list->current = result_list->first;
} else {
result_list->current = result_list->first;
}
result_list->bgs_current = result_list->current;
current = (SPIDER_RESULT*) result_list->current;
} else {
if (
#ifndef WITHOUT_SPIDER_BG_SEARCH
result_list->bgs_phase > 0 ||
#endif
result_list->quick_phase > 0
) {
if (result_list->bgs_current == result_list->last)
{
if (!(result_list->last = (SPIDER_RESULT *)
spider_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_2, sizeof(*result_list->last),
2013-06-27 13:18:48 +02:00
MYF(MY_WME | MY_ZEROFILL)))
) {
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
TMP_TABLE_PARAM *tmp_tbl_prm = (TMP_TABLE_PARAM *)
&result_list->last->result_tmp_tbl_prm;
tmp_tbl_prm->init();
tmp_tbl_prm->field_count = 3;
result_list->bgs_current->next = result_list->last;
result_list->last->prev = result_list->bgs_current;
result_list->bgs_current = result_list->last;
} else {
result_list->bgs_current = result_list->bgs_current->next;
}
if (
#ifndef WITHOUT_SPIDER_BG_SEARCH
result_list->bgs_phase == 1 ||
#endif
result_list->quick_phase == 2
) {
if (result_list->low_mem_read)
{
do {
spider_db_free_one_result(result_list,
(SPIDER_RESULT*) result_list->current);
result_list->current = result_list->current->next;
} while (result_list->current != result_list->bgs_current);
} else {
result_list->current = result_list->bgs_current;
}
result_list->quick_phase = 0;
}
current = (SPIDER_RESULT*) result_list->bgs_current;
} else {
if (result_list->current == result_list->last)
{
if (!(result_list->last = (SPIDER_RESULT *)
spider_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_3, sizeof(*result_list->last),
2013-06-27 13:18:48 +02:00
MYF(MY_WME | MY_ZEROFILL)))
) {
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
TMP_TABLE_PARAM *tmp_tbl_prm = (TMP_TABLE_PARAM *)
&result_list->last->result_tmp_tbl_prm;
tmp_tbl_prm->init();
tmp_tbl_prm->field_count = 3;
result_list->current->next = result_list->last;
result_list->last->prev = result_list->current;
result_list->current = result_list->last;
} else {
result_list->current = result_list->current->next;
}
result_list->bgs_current = result_list->current;
current = (SPIDER_RESULT*) result_list->current;
}
}
if (result_list->quick_mode == 0)
{
if (spider_bit_is_set(spider->db_request_phase, link_idx))
{
spider_clear_bit(spider->db_request_phase, link_idx);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[link_idx];
request_key.next = NULL;
if (!(current->result = db_conn->store_result(NULL, &request_key,
&error_num)))
{
if (error_num && error_num != HA_ERR_END_OF_FILE)
{
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(error_num);
}
2014-03-24 21:22:28 +01:00
bool call_db_errorno = FALSE;
if (error_num != HA_ERR_END_OF_FILE)
{
call_db_errorno = TRUE;
if ((error_num = spider_db_errorno(conn)))
DBUG_RETURN(error_num);
}
DBUG_PRINT("info",("spider set finish_flg point 1"));
DBUG_PRINT("info",("spider current->finish_flg = TRUE"));
DBUG_PRINT("info",("spider result_list->finish_flg = TRUE"));
current->finish_flg = TRUE;
result_list->finish_flg = TRUE;
2013-06-27 13:18:48 +02:00
#ifndef WITHOUT_SPIDER_BG_SEARCH
2014-03-24 21:22:28 +01:00
if (result_list->bgs_phase <= 1)
{
2013-06-27 13:18:48 +02:00
#endif
2014-03-24 21:22:28 +01:00
result_list->current_row_num = 0;
table->status = STATUS_NOT_FOUND;
2013-06-27 13:18:48 +02:00
#ifndef WITHOUT_SPIDER_BG_SEARCH
2014-03-24 21:22:28 +01:00
}
2013-06-27 13:18:48 +02:00
#endif
2014-03-24 21:22:28 +01:00
if (!conn->mta_conn_mutex_unlock_later && !call_db_errorno)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2014-03-24 21:22:28 +01:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
}
2014-03-24 21:22:28 +01:00
DBUG_RETURN(HA_ERR_END_OF_FILE);
2013-06-27 13:18:48 +02:00
} else {
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
current->record_num = current->result->num_rows();
2014-06-08 12:52:11 +02:00
current->dbton_id = current->result->dbton_id;
2013-06-27 13:18:48 +02:00
result_list->record_num += current->record_num;
DBUG_PRINT("info",("spider current->record_num=%lld",
current->record_num));
DBUG_PRINT("info",("spider result_list->record_num=%lld",
result_list->record_num));
2014-03-24 21:15:55 +01:00
DBUG_PRINT("info",("spider result_list->internal_limit=%lld",
result_list->internal_limit));
DBUG_PRINT("info",("spider result_list->split_read=%lld",
result_list->split_read));
2013-06-27 13:18:48 +02:00
if (
result_list->internal_limit <= result_list->record_num ||
result_list->split_read > current->record_num
) {
DBUG_PRINT("info",("spider set finish_flg point 2"));
DBUG_PRINT("info",("spider current->finish_flg = TRUE"));
DBUG_PRINT("info",("spider result_list->finish_flg = TRUE"));
current->finish_flg = TRUE;
result_list->finish_flg = TRUE;
}
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list->bgs_phase <= 1)
{
#endif
result_list->current_row_num = 0;
#ifndef WITHOUT_SPIDER_BG_SEARCH
}
#endif
}
} else {
/* has_result() for case of result with result_tmp_tbl */
if (current->prev && current->prev->result &&
current->prev->result->has_result())
{
current->result = current->prev->result;
current->prev->result = NULL;
result_list->limit_num -= current->prev->record_num;
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
} else {
if (spider_bit_is_set(spider->db_request_phase, link_idx))
{
spider_clear_bit(spider->db_request_phase, link_idx);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[link_idx];
request_key.next = NULL;
if (!(current->result = conn->db_conn->use_result(&request_key,
&error_num)))
{
if (!error_num)
{
error_num = spider_db_errorno(conn);
} else {
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
}
DBUG_RETURN(error_num);
}
DBUG_PRINT("info", ("spider conn[%p]->quick_target=%p", conn, spider));
conn->quick_target = spider;
spider->quick_targets[link_idx] = spider;
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
}
2014-06-08 12:52:11 +02:00
current->dbton_id = current->result->dbton_id;
2013-06-27 13:18:48 +02:00
SPIDER_DB_ROW *row;
if (!(row = current->result->fetch_row()))
{
error_num = current->result->get_errno();
2013-06-27 13:18:48 +02:00
DBUG_PRINT("info",("spider set finish_flg point 3"));
DBUG_PRINT("info",("spider current->finish_flg = TRUE"));
DBUG_PRINT("info",("spider result_list->finish_flg = TRUE"));
current->finish_flg = TRUE;
result_list->finish_flg = TRUE;
current->result->free_result();
delete current->result;
current->result = NULL;
DBUG_PRINT("info", ("spider conn[%p]->quick_target=NULL", conn));
conn->quick_target = NULL;
spider->quick_targets[link_idx] = NULL;
if (
#ifndef WITHOUT_SPIDER_BG_SEARCH
result_list->bgs_phase <= 1 &&
#endif
result_list->quick_phase == 0
) {
result_list->current_row_num = 0;
table->status = STATUS_NOT_FOUND;
}
if (error_num)
DBUG_RETURN(error_num);
else if (result_list->quick_phase > 0)
2013-06-27 13:18:48 +02:00
DBUG_RETURN(0);
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
SPIDER_DB_ROW *tmp_row;
uint field_count = current->result->num_fields();
SPIDER_POSITION *position;
longlong page_size;
2013-06-27 13:18:48 +02:00
int roop_count = 0;
if (!result_list->quick_page_size)
{
if (result_list->quick_mode == 3)
{
page_size = 0;
} else {
result_list->quick_page_size = result_list->limit_num;
page_size = result_list->limit_num;
}
} else {
page_size =
result_list->limit_num < result_list->quick_page_size ?
result_list->limit_num : result_list->quick_page_size;
}
2013-06-27 13:18:48 +02:00
current->field_count = field_count;
if (!(position = (SPIDER_POSITION *)
spider_bulk_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_4, MYF(MY_WME | MY_ZEROFILL),
2013-06-27 13:18:48 +02:00
&position, sizeof(SPIDER_POSITION) * page_size,
&tmp_row, sizeof(char*) * field_count,
NullS))
)
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
current->pos_page_size = (int) page_size;
current->first_position = position;
current->tmp_tbl_row = tmp_row;
if (result_list->quick_mode == 3)
{
while (page_size > roop_count && row)
2013-06-27 13:18:48 +02:00
{
if (result_list->quick_page_byte < row->get_byte_size())
{
current->pos_page_size = roop_count;
page_size = roop_count;
result_list->quick_page_size = roop_count;
result_list->quick_page_byte = 0;
break;
} else {
result_list->quick_page_byte -= row->get_byte_size();
}
if (!(position->row = row->clone()))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
position++;
roop_count++;
row = current->result->fetch_row();
2013-06-27 13:18:48 +02:00
}
} else {
do {
if (!(position->row = row->clone()))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
position++;
roop_count++;
if (result_list->quick_page_byte < row->get_byte_size())
{
current->pos_page_size = roop_count;
page_size = roop_count;
result_list->quick_page_size = roop_count;
result_list->quick_page_byte = 0;
break;
} else {
result_list->quick_page_byte -= row->get_byte_size();
}
} while (
page_size > roop_count &&
(row = current->result->fetch_row())
);
}
2013-06-27 13:18:48 +02:00
if (
result_list->quick_mode == 3 &&
page_size == roop_count &&
result_list->limit_num > roop_count &&
row
2013-06-27 13:18:48 +02:00
) {
THD *thd = current_thd;
char buf[MAX_FIELD_WIDTH];
spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin);
tmp_str.init_calc_mem(SPD_MID_DB_STORE_RESULT_5);
2013-06-27 13:18:48 +02:00
DBUG_PRINT("info",("spider store result to temporary table"));
DBUG_ASSERT(!current->result_tmp_tbl);
#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
LEX_CSTRING field_name1 = {STRING_WITH_LEN("a")};
LEX_CSTRING field_name2 = {STRING_WITH_LEN("b")};
LEX_CSTRING field_name3 = {STRING_WITH_LEN("c")};
if (!(current->result_tmp_tbl = spider_mk_sys_tmp_table_for_result(
thd, table, &current->result_tmp_tbl_prm, &field_name1, &field_name2,
&field_name3, &my_charset_bin)))
#else
2013-06-27 13:18:48 +02:00
if (!(current->result_tmp_tbl = spider_mk_sys_tmp_table_for_result(
thd, table, &current->result_tmp_tbl_prm, "a", "b", "c",
&my_charset_bin)))
#endif
2013-06-27 13:18:48 +02:00
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
current->result_tmp_tbl_thd = thd;
TABLE *tmp_tbl = current->result_tmp_tbl;
tmp_tbl->file->extra(HA_EXTRA_WRITE_CACHE);
tmp_tbl->file->ha_start_bulk_insert((ha_rows) 0);
do {
if ((error_num = row->store_to_tmp_table(tmp_tbl, &tmp_str)))
{
tmp_tbl->file->ha_end_bulk_insert();
DBUG_RETURN(error_num);
}
roop_count++;
} while (
result_list->limit_num > roop_count &&
(row = current->result->fetch_row())
);
tmp_tbl->file->ha_end_bulk_insert();
page_size = result_list->limit_num;
}
current->record_num = roop_count;
result_list->record_num += roop_count;
if (
result_list->internal_limit <= result_list->record_num ||
page_size > roop_count ||
(
result_list->quick_mode == 3 &&
result_list->limit_num > roop_count
)
2013-06-27 13:18:48 +02:00
) {
DBUG_PRINT("info",("spider set finish_flg point 4"));
DBUG_PRINT("info",("spider current->finish_flg = TRUE"));
DBUG_PRINT("info",("spider result_list->finish_flg = TRUE"));
current->finish_flg = TRUE;
result_list->finish_flg = TRUE;
current->result->free_result();
if (!current->result_tmp_tbl)
{
delete current->result;
current->result = NULL;
}
DBUG_PRINT("info", ("spider conn[%p]->quick_target=NULL", conn));
conn->quick_target = NULL;
spider->quick_targets[link_idx] = NULL;
2014-09-18 02:26:30 +02:00
} else if (
result_list->quick_mode == 3 ||
result_list->limit_num == roop_count
) {
2013-06-27 13:18:48 +02:00
current->result->free_result();
if (!current->result_tmp_tbl)
{
delete current->result;
current->result = NULL;
}
DBUG_PRINT("info", ("spider conn[%p]->quick_target=NULL", conn));
conn->quick_target = NULL;
spider->quick_targets[link_idx] = NULL;
}
#ifndef WITHOUT_SPIDER_BG_SEARCH
DBUG_PRINT("info", ("spider bgs_phase=%d", result_list->bgs_phase));
#endif
DBUG_PRINT("info", ("spider quick_phase=%d", result_list->quick_phase));
2013-06-27 13:18:48 +02:00
if (
#ifndef WITHOUT_SPIDER_BG_SEARCH
result_list->bgs_phase <= 1 &&
#endif
result_list->quick_phase == 0
) {
result_list->current_row_num = 0;
}
DBUG_PRINT("info", ("spider result_list->current=%p", result_list->current));
DBUG_PRINT("info", ("spider current=%p", current));
DBUG_PRINT("info", ("spider first_position=%p", current->first_position));
DBUG_PRINT("info", ("spider current_row_num=%lld", result_list->current_row_num));
DBUG_PRINT("info", ("spider first_position[]=%p", &current->first_position[result_list->current_row_num]));
DBUG_PRINT("info", ("spider row=%p", current->first_position[result_list->current_row_num].row));
2013-06-27 13:18:48 +02:00
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_HS_READ)
conn = spider->hs_r_conns[link_idx];
else
conn = spider->hs_w_conns[link_idx];
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider conn->connection_id=%llu",
conn->connection_id));
DBUG_PRINT("info",("spider spider->connection_ids[%d]=%llu",
link_idx, spider->connection_ids[link_idx]));
if (conn->connection_id != spider->connection_ids[link_idx])
{
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)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
}
if (spider_bit_is_set(spider->db_request_phase, link_idx))
{
spider_clear_bit(spider->db_request_phase, link_idx);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[link_idx];
request_key.next = NULL;
if (!(result_list->hs_result = conn->db_conn->store_result(
&result_list->hs_result_buf, &request_key, &error_num)))
{
if (!error_num)
{
spider_db_errorno(conn);
DBUG_RETURN(ER_SPIDER_HS_NUM);
} else {
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
}
DBUG_RETURN(error_num);
}
result_list->hs_conn = conn->db_conn;
result_list->hs_has_result = TRUE;
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
}
#endif
DBUG_RETURN(0);
}
void spider_db_discard_result(
ha_spider *spider,
int link_idx,
SPIDER_CONN *conn
) {
int error_num;
SPIDER_DB_RESULT *result;
DBUG_ENTER("spider_db_discard_result");
if (spider_bit_is_set(spider->db_request_phase, link_idx))
{
spider_clear_bit(spider->db_request_phase, link_idx);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[link_idx];
request_key.next = NULL;
if ((result = conn->db_conn->use_result(&request_key, &error_num)))
{
result->free_result();
delete result;
}
DBUG_VOID_RETURN;
}
void spider_db_discard_multiple_result(
ha_spider *spider,
int link_idx,
SPIDER_CONN *conn
) {
int error_num;
SPIDER_DB_RESULT *result;
st_spider_db_request_key request_key;
DBUG_ENTER("spider_db_discard_multiple_result");
if (spider_bit_is_set(spider->db_request_phase, link_idx))
{
spider_clear_bit(spider->db_request_phase, link_idx);
}
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[link_idx];
request_key.next = NULL;
do
{
if (!conn->db_conn->cmp_request_key_to_snd(&request_key))
break;
if ((result = conn->db_conn->use_result(&request_key, &error_num)))
{
2013-06-27 13:18:48 +02:00
result->free_result();
delete result;
}
2013-06-27 13:18:48 +02:00
} while (!conn->db_conn->next_result());
DBUG_VOID_RETURN;
}
#ifdef HA_CAN_BULK_ACCESS
int spider_db_bulk_store_result(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx,
bool discard_result
) {
int error_num, tmp_error_num;
DBUG_ENTER("spider_db_bulk_store_result");
DBUG_PRINT("info",("spider spider=%p", spider));
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider link_idx=%d", link_idx));
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
/* already stored */
DBUG_RETURN(0);
}
error_num = spider_db_bulk_open_handler(spider, conn, link_idx);
if (!discard_result)
{
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_unlock_later = TRUE;
if ((tmp_error_num = spider_db_store_result(spider, link_idx,
spider->get_table())))
{
error_num = tmp_error_num;
}
conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
} else {
if (spider->connection_ids[link_idx] == conn->connection_id)
spider_db_discard_result(spider, link_idx, conn);
}
DBUG_RETURN(error_num);
}
#endif
int spider_db_fetch(
uchar *buf,
ha_spider *spider,
TABLE *table
) {
int error_num;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_fetch");
if (spider->sql_kind[spider->result_link_idx] == SPIDER_SQL_KIND_SQL)
{
if (!spider->select_column_mode) {
if (result_list->keyread)
error_num = spider_db_fetch_key(spider, buf, table,
result_list->key_info, result_list);
else
error_num = spider_db_fetch_table(spider, buf, table,
result_list);
} else
error_num = spider_db_fetch_minimum_columns(spider, buf, table,
result_list);
} else {
error_num = spider_db_fetch_table(spider, buf, table,
result_list);
}
result_list->current_row_num++;
DBUG_PRINT("info",("spider error_num=%d", error_num));
spider->pushed_pos = NULL;
DBUG_RETURN(error_num);
}
int spider_db_seek_prev(
uchar *buf,
ha_spider *spider,
TABLE *table
) {
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_seek_prev");
if (result_list->current_row_num <= 1)
{
if (result_list->current == result_list->first)
{
table->status = STATUS_NOT_FOUND;
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
if (result_list->low_mem_read == 1)
{
my_message(ER_SPIDER_LOW_MEM_READ_PREV_NUM,
ER_SPIDER_LOW_MEM_READ_PREV_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_LOW_MEM_READ_PREV_NUM);
}
result_list->current = result_list->current->prev;
result_list->current_row_num = result_list->current->record_num - 1;
} else {
result_list->current_row_num -= 2;
}
if (result_list->quick_mode == 0)
result_list->current->result->move_to_pos(result_list->current_row_num);
DBUG_RETURN(spider_db_fetch(buf, spider, table));
}
int spider_db_seek_next(
uchar *buf,
ha_spider *spider,
int link_idx,
TABLE *table
) {
int error_num;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn = spider->conns[link_idx];
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_seek_next");
if (
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
spider->conn_kind[spider->result_link_idx] == SPIDER_CONN_KIND_MYSQL &&
#endif
result_list->current_row_num >= result_list->current->record_num
) {
DBUG_PRINT("info",("spider result_list->current_row_num=%lld",
result_list->current_row_num));
DBUG_PRINT("info",("spider result_list->current->record_num=%lld",
result_list->current->record_num));
if (result_list->low_mem_read)
spider_db_free_one_result(result_list,
(SPIDER_RESULT*) result_list->current);
int roop_start = 0, roop_end = 1, roop_count, lock_mode, link_ok = 0;
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
if (!spider->use_fields)
2013-06-27 13:18:48 +02:00
{
#endif
lock_mode = spider_conn_lock_mode(spider);
if (lock_mode)
{
/* "for update" or "lock in share mode" */
link_ok = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_OK);
roop_start = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_end = spider->share->link_count;
} else {
link_ok = link_idx;
roop_start = link_idx;
roop_end = link_idx + 1;
}
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
2013-06-27 13:18:48 +02:00
}
#endif
2013-06-27 13:18:48 +02:00
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list->bgs_phase > 0)
{
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
if (spider->use_fields)
{
SPIDER_LINK_IDX_CHAIN *link_idx_chain;
SPIDER_LINK_IDX_HOLDER *link_idx_holder;
spider_fields *fields = spider->fields;
fields->set_pos_to_first_link_idx_chain();
while ((link_idx_chain = fields->get_next_link_idx_chain()))
2013-06-27 13:18:48 +02:00
{
conn = link_idx_chain->conn;
link_idx_holder = link_idx_chain->link_idx_holder;
spider_db_handler *dbton_hdl =
spider->dbton_handler[conn->dbton_id];
spider->link_idx_chain = link_idx_chain;
if ((error_num = spider_bg_conn_search(spider,
link_idx_holder->link_idx, dbton_hdl->first_link_idx,
FALSE, FALSE,
!fields->is_first_link_ok_chain(link_idx_chain))))
{
DBUG_PRINT("info",("spider error_num 1=%d", error_num));
DBUG_RETURN(error_num);
}
}
} else {
#endif
for (roop_count = roop_start; roop_count < roop_end;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
if ((error_num = spider_bg_conn_search(spider, roop_count, roop_start,
FALSE, FALSE, (roop_count != link_ok))))
{
DBUG_PRINT("info",("spider error_num 1=%d", error_num));
DBUG_RETURN(error_num);
}
2013-06-27 13:18:48 +02:00
}
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
2013-06-27 13:18:48 +02:00
}
#endif
2013-06-27 13:18:48 +02:00
} else {
#endif
if (result_list->current == result_list->bgs_current)
{
if (result_list->finish_flg)
{
table->status = STATUS_NOT_FOUND;
DBUG_PRINT("info",("spider error_num 2=%d", HA_ERR_END_OF_FILE));
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
spider_next_split_read_param(spider);
if (
result_list->quick_mode == 0 ||
2014-09-18 02:26:30 +02:00
result_list->quick_mode == 3 ||
2013-06-27 13:18:48 +02:00
!result_list->current->result
) {
result_list->limit_num =
result_list->internal_limit - result_list->record_num >=
result_list->split_read ?
result_list->split_read :
result_list->internal_limit - result_list->record_num;
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
if ((error_num = spider->reappend_limit_sql_part(
result_list->record_num, result_list->limit_num,
SPIDER_SQL_TYPE_SELECT_SQL)))
{
DBUG_PRINT("info",("spider error_num 3=%d", error_num));
DBUG_RETURN(error_num);
}
if (
!result_list->use_union &&
(error_num = spider->append_select_lock_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL))
) {
DBUG_PRINT("info",("spider error_num 4=%d", error_num));
DBUG_RETURN(error_num);
}
}
if (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER)
{
spider_db_append_handler_next(spider);
if ((error_num = spider->reappend_limit_sql_part(
0, result_list->limit_num,
SPIDER_SQL_TYPE_HANDLER)))
{
DBUG_PRINT("info",("spider error_num 5=%d", error_num));
DBUG_RETURN(error_num);
}
}
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
if (spider->use_fields)
{
SPIDER_LINK_IDX_CHAIN *link_idx_chain;
SPIDER_LINK_IDX_HOLDER *link_idx_holder;
spider_fields *fields = spider->fields;
fields->set_pos_to_first_link_idx_chain();
while ((link_idx_chain = fields->get_next_link_idx_chain()))
2013-06-27 13:18:48 +02:00
{
ulong sql_type;
conn = link_idx_chain->conn;
2013-06-27 13:18:48 +02:00
sql_type = SPIDER_SQL_TYPE_SELECT_SQL;
link_idx_holder = link_idx_chain->link_idx_holder;
link_idx = link_idx_holder->link_idx;
spider_db_handler *dbton_handler =
spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if ((error_num = dbton_handler->set_sql_for_exec(sql_type,
link_idx)))
{
DBUG_PRINT("info",("spider error_num 6=%d", error_num));
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &spider->need_mons[link_idx];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, link_idx)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
spider->need_mons[link_idx]
) {
error_num = fields->ping_table_mon_from_table(link_idx_chain);
}
DBUG_PRINT("info",("spider error_num 7a=%d", error_num));
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, link_idx,
spider->trx->thd, share);
if (dbton_handler->execute_sql(
sql_type,
conn,
result_list->quick_mode,
&spider->need_mons[link_idx])
2013-06-27 13:18:48 +02:00
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
spider->need_mons[link_idx]
) {
error_num = fields->ping_table_mon_from_table(link_idx_chain);
}
DBUG_PRINT("info",("spider error_num 8a=%d", error_num));
DBUG_RETURN(error_num);
2013-06-27 13:18:48 +02:00
}
spider->connection_ids[link_idx] = conn->connection_id;
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
if (fields->is_first_link_ok_chain(link_idx_chain))
{
if ((error_num = spider_db_store_result(spider, link_idx,
table)))
{
if (
error_num != HA_ERR_END_OF_FILE &&
spider->need_mons[link_idx]
) {
error_num =
fields->ping_table_mon_from_table(link_idx_chain);
}
DBUG_PRINT("info",("spider error_num 9a=%d", error_num));
DBUG_RETURN(error_num);
}
spider->result_link_idx = link_ok;
} else {
spider_db_discard_result(spider, link_idx, conn);
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
}
}
} else {
#endif
for (roop_count = roop_start; roop_count < roop_end;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
conn = spider->conns[roop_count];
if (spider->sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
sql_type = SPIDER_SQL_TYPE_SELECT_SQL;
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
spider_db_handler *dbton_handler =
spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if ((error_num = dbton_handler->set_sql_for_exec(sql_type,
roop_count)))
{
DBUG_PRINT("info",("spider error_num 6=%d", error_num));
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &spider->need_mons[roop_count];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, roop_count)))
2013-06-27 13:18:48 +02:00
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_PRINT("info",("spider error_num 7=%d", error_num));
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count,
spider->trx->thd, share);
if (dbton_handler->execute_sql(
sql_type,
conn,
result_list->quick_mode,
&spider->need_mons[roop_count])
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE
);
}
DBUG_PRINT("info",("spider error_num 8=%d", error_num));
DBUG_RETURN(error_num);
}
spider->connection_ids[roop_count] = conn->connection_id;
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
if (roop_count == link_ok)
{
if ((error_num = spider_db_store_result(spider, roop_count,
table)))
{
if (
error_num != HA_ERR_END_OF_FILE &&
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE
);
}
DBUG_PRINT("info",("spider error_num 9=%d", error_num));
DBUG_RETURN(error_num);
}
spider->result_link_idx = link_ok;
} else {
spider_db_discard_result(spider, roop_count, conn);
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
2013-06-27 13:18:48 +02:00
}
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
2013-06-27 13:18:48 +02:00
}
#endif
2013-06-27 13:18:48 +02:00
} else {
spider->connection_ids[link_idx] = conn->connection_id;
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_store_result(spider, link_idx, table)))
{
conn->mta_conn_mutex_unlock_later = FALSE;
DBUG_PRINT("info",("spider error_num 10=%d", error_num));
DBUG_RETURN(error_num);
}
conn->mta_conn_mutex_unlock_later = FALSE;
}
} else {
result_list->current = result_list->current->next;
result_list->current_row_num = 0;
if (
result_list->current == result_list->bgs_current &&
result_list->finish_flg
) {
table->status = STATUS_NOT_FOUND;
DBUG_PRINT("info",("spider error_num 11=%d", HA_ERR_END_OF_FILE));
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
}
#ifndef WITHOUT_SPIDER_BG_SEARCH
}
#endif
DBUG_RETURN(spider_db_fetch(buf, spider, table));
} else
DBUG_RETURN(spider_db_fetch(buf, spider, table));
}
int spider_db_seek_last(
uchar *buf,
ha_spider *spider,
int link_idx,
TABLE *table
) {
int error_num;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_seek_last");
if (result_list->finish_flg)
{
if (result_list->low_mem_read == 1)
{
my_message(ER_SPIDER_LOW_MEM_READ_PREV_NUM,
ER_SPIDER_LOW_MEM_READ_PREV_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_LOW_MEM_READ_PREV_NUM);
}
result_list->current = result_list->last;
result_list->current_row_num = result_list->current->record_num - 1;
if (result_list->quick_mode == 0)
result_list->current->result->move_to_pos(result_list->current_row_num);
DBUG_RETURN(spider_db_fetch(buf, spider, table));
} else if (!result_list->sorted ||
result_list->internal_limit <= result_list->record_num * 2)
{
if (result_list->low_mem_read == 1)
{
my_message(ER_SPIDER_LOW_MEM_READ_PREV_NUM,
ER_SPIDER_LOW_MEM_READ_PREV_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_LOW_MEM_READ_PREV_NUM);
}
spider_next_split_read_param(spider);
result_list->limit_num =
result_list->internal_limit - result_list->record_num;
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
if ((error_num = spider->reappend_limit_sql_part(
result_list->internal_offset + result_list->record_num,
result_list->limit_num,
SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
if (
!result_list->use_union &&
(error_num = spider->append_select_lock_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL))
)
DBUG_RETURN(error_num);
}
if (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER)
{
spider_db_append_handler_next(spider);
if ((error_num = spider->reappend_limit_sql_part(
result_list->internal_offset + result_list->record_num,
result_list->limit_num,
SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
if (
!result_list->use_union &&
(error_num = spider->append_select_lock_sql_part(
SPIDER_SQL_TYPE_HANDLER))
)
DBUG_RETURN(error_num);
}
int roop_start, roop_end, roop_count, lock_mode, link_ok;
lock_mode = spider_conn_lock_mode(spider);
if (lock_mode)
{
/* "for update" or "lock in share mode" */
link_ok = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_OK);
roop_start = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_end = spider->share->link_count;
} else {
link_ok = link_idx;
roop_start = link_idx;
roop_end = link_idx + 1;
}
for (roop_count = roop_start; roop_count < roop_end;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
if (spider->sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
sql_type = SPIDER_SQL_TYPE_SELECT_SQL;
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
conn = spider->conns[roop_count];
spider_db_handler *dbton_handler = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_handler->set_sql_for_exec(sql_type, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
DBUG_PRINT("info",("spider sql_type=%lu", sql_type));
conn->need_mon = &spider->need_mons[roop_count];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (dbton_handler->execute_sql(
sql_type,
conn,
result_list->quick_mode,
&spider->need_mons[roop_count])
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider->connection_ids[roop_count] = conn->connection_id;
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
if (roop_count == link_ok)
{
if ((error_num = spider_db_store_result(spider, roop_count, table)))
{
if (
error_num != HA_ERR_END_OF_FILE &&
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider->result_link_idx = link_ok;
} else {
spider_db_discard_result(spider, roop_count, conn);
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
}
result_list->current_row_num = result_list->current->record_num - 1;
if (result_list->quick_mode == 0)
result_list->current->result->move_to_pos(result_list->current_row_num);
DBUG_RETURN(spider_db_fetch(buf, spider, table));
}
if ((error_num = spider_db_free_result(spider, FALSE)))
DBUG_RETURN(error_num);
spider_first_split_read_param(spider);
result_list->desc_flg = !(result_list->desc_flg);
result_list->limit_num =
result_list->internal_limit >= result_list->split_read ?
result_list->split_read : result_list->internal_limit;
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
spider->set_order_to_pos_sql(SPIDER_SQL_TYPE_SELECT_SQL);
if (
(error_num = spider->append_key_order_with_alias_sql_part(
NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL)) ||
(error_num = spider->append_limit_sql_part(
result_list->internal_offset,
result_list->limit_num, SPIDER_SQL_TYPE_SELECT_SQL)) ||
(
!result_list->use_union &&
(spider->sql_kinds & SPIDER_SQL_KIND_SQL) &&
(error_num = spider->append_select_lock_sql_part(
SPIDER_SQL_TYPE_SELECT_SQL))
)
)
DBUG_RETURN(error_num);
}
if (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER)
{
const char *alias;
uint alias_length;
if (result_list->sorted && result_list->desc_flg)
{
alias = SPIDER_SQL_LAST_STR;
alias_length = SPIDER_SQL_LAST_LEN;
} else {
alias = SPIDER_SQL_FIRST_STR;
alias_length = SPIDER_SQL_FIRST_LEN;
}
spider->set_order_to_pos_sql(SPIDER_SQL_TYPE_HANDLER);
if (
(error_num = spider->append_key_order_with_alias_sql_part(
alias, alias_length, SPIDER_SQL_TYPE_HANDLER)) ||
(error_num = spider->reappend_limit_sql_part(
result_list->internal_offset,
result_list->limit_num, SPIDER_SQL_TYPE_HANDLER))
)
DBUG_RETURN(error_num);
}
int roop_start, roop_end, roop_count, lock_mode, link_ok;
lock_mode = spider_conn_lock_mode(spider);
if (lock_mode)
{
/* "for update" or "lock in share mode" */
link_ok = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_OK);
roop_start = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_end = spider->share->link_count;
} else {
link_ok = link_idx;
roop_start = link_idx;
roop_end = link_idx + 1;
}
for (roop_count = roop_start; roop_count < roop_end;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
if (spider->sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
sql_type = SPIDER_SQL_TYPE_SELECT_SQL;
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
conn = spider->conns[roop_count];
spider_db_handler *dbton_handler = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_handler->set_sql_for_exec(sql_type, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
DBUG_PRINT("info",("spider sql_type=%lu", sql_type));
conn->need_mon = &spider->need_mons[roop_count];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (dbton_handler->execute_sql(
sql_type,
conn,
result_list->quick_mode,
&spider->need_mons[roop_count])
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider->connection_ids[roop_count] = conn->connection_id;
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
if (roop_count == link_ok)
{
if ((error_num = spider_db_store_result(spider, roop_count, table)))
{
if (
error_num != HA_ERR_END_OF_FILE &&
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider->result_link_idx = link_ok;
} else {
spider_db_discard_result(spider, roop_count, conn);
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
}
DBUG_RETURN(spider_db_fetch(buf, spider, table));
}
int spider_db_seek_first(
uchar *buf,
ha_spider *spider,
TABLE *table
) {
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_seek_first");
if (
result_list->current != result_list->first &&
result_list->low_mem_read == 1
) {
my_message(ER_SPIDER_LOW_MEM_READ_PREV_NUM, ER_SPIDER_LOW_MEM_READ_PREV_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_LOW_MEM_READ_PREV_NUM);
}
result_list->current = result_list->first;
spider_db_set_pos_to_first_row(result_list);
DBUG_RETURN(spider_db_fetch(buf, spider, table));
}
void spider_db_set_pos_to_first_row(
SPIDER_RESULT_LIST *result_list
) {
DBUG_ENTER("spider_db_set_pos_to_first_row");
result_list->current_row_num = 0;
if (result_list->quick_mode == 0)
result_list->current->result->move_to_pos(0);
DBUG_VOID_RETURN;
}
void spider_db_create_position(
ha_spider *spider,
SPIDER_POSITION *pos
) {
SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_RESULT *current = (SPIDER_RESULT*) result_list->current;
DBUG_ENTER("spider_db_create_position");
if (result_list->quick_mode == 0)
{
SPIDER_DB_RESULT *result = current->result;
pos->row = result->current_row();
pos->pos_mode = 2;
pos->row->next_pos = result_list->tmp_pos_row_first;
result_list->tmp_pos_row_first = pos->row;
} else {
if (result_list->current_row_num <= result_list->quick_page_size)
{
SPIDER_POSITION *tmp_pos =
&current->first_position[result_list->current_row_num - 1];
memcpy(pos, tmp_pos, sizeof(SPIDER_POSITION));
tmp_pos->use_position = TRUE;
tmp_pos->pos_mode = 0;
pos->pos_mode = 0;
2014-09-18 02:26:30 +02:00
current->first_pos_use_position = TRUE;
2013-06-27 13:18:48 +02:00
} else {
TABLE *tmp_tbl = current->result_tmp_tbl;
pos->row = NULL;
pos->pos_mode = 1;
DBUG_PRINT("info",("spider tmp_tbl=%p", tmp_tbl));
DBUG_PRINT("info",("spider tmp_tbl->file=%p", tmp_tbl->file));
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->position(tmp_tbl->record[0]);
2014-09-18 02:26:30 +02:00
current->tmp_tbl_use_position = TRUE;
2013-06-27 13:18:48 +02:00
}
}
current->use_position = TRUE;
pos->use_position = TRUE;
pos->mrr_with_cnt = spider->mrr_with_cnt;
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
pos->direct_aggregate = result_list->direct_aggregate;
#endif
2013-06-27 13:18:48 +02:00
pos->sql_kind = spider->sql_kind[spider->result_link_idx];
pos->position_bitmap = spider->position_bitmap;
pos->ft_first = spider->ft_first;
pos->ft_current = spider->ft_current;
pos->result = current;
DBUG_VOID_RETURN;
}
int spider_db_seek_tmp(
uchar *buf,
SPIDER_POSITION *pos,
ha_spider *spider,
TABLE *table
) {
int error_num;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_seek_tmp");
if (pos->pos_mode != 1)
{
if (!pos->row)
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
pos->row->first();
}
2014-03-24 21:02:59 +01:00
if (pos->sql_kind == SPIDER_SQL_KIND_SQL)
2013-06-27 13:18:48 +02:00
{
if (!spider->select_column_mode)
{
if (result_list->keyread)
error_num = spider_db_seek_tmp_key(buf, pos, spider, table,
result_list->key_info);
else
error_num = spider_db_seek_tmp_table(buf, pos, spider, table);
} else
error_num = spider_db_seek_tmp_minimum_columns(buf, pos, spider, table);
} else
error_num = spider_db_seek_tmp_table(buf, pos, spider, table);
DBUG_PRINT("info",("spider error_num=%d", error_num));
DBUG_RETURN(error_num);
}
int spider_db_seek_tmp_table(
uchar *buf,
SPIDER_POSITION *pos,
ha_spider *spider,
TABLE *table
) {
int error_num;
Field **field;
SPIDER_DB_ROW *row = pos->row;
my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(buf, table->record[0]);
DBUG_ENTER("spider_db_seek_tmp_table");
if (pos->pos_mode == 1)
{
if ((error_num = spider_db_get_row_from_tmp_tbl_pos(pos, &row)))
DBUG_RETURN(error_num);
} else if (pos->pos_mode == 2)
{
/*
SPIDER_DB_RESULT *result = pos->result->result;
result->current_row = row;
*/
}
2013-09-16 20:31:13 +02:00
DBUG_PRINT("info", ("spider row=%p", row));
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
2015-02-19 16:41:26 +01:00
if (!spider->result_list.in_cmp_ref)
{
DBUG_PRINT("info", ("spider direct_aggregate=%s",
pos->direct_aggregate ? "TRUE" : "FALSE"));
spider->result_list.snap_mrr_with_cnt = pos->mrr_with_cnt;
spider->result_list.snap_direct_aggregate = pos->direct_aggregate;
spider->result_list.snap_row = row;
}
2013-09-16 20:22:54 +02:00
#endif
2013-06-27 13:18:48 +02:00
/* for mrr */
if (pos->mrr_with_cnt)
{
DBUG_PRINT("info", ("spider mrr_with_cnt"));
if (pos->sql_kind == SPIDER_SQL_KIND_SQL)
{
row->next();
2013-09-16 20:22:54 +02:00
} else {
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
spider->result_list.snap_mrr_with_cnt = FALSE;
#endif
2013-06-27 13:18:48 +02:00
}
}
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
/* for direct_aggregate */
if (pos->direct_aggregate)
{
if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
DBUG_RETURN(error_num);
}
#endif
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_append_match_fetch(spider,
pos->ft_first, pos->ft_current, row)))
DBUG_RETURN(error_num);
for (
field = table->field;
*field;
field++
) {
if ((
bitmap_is_set(table->read_set, (*field)->field_index) |
bitmap_is_set(table->write_set, (*field)->field_index)
)) {
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
2013-06-27 13:18:48 +02:00
#endif
Changing field::field_name and Item::name to LEX_CSTRING Benefits of this patch: - Removed a lot of calls to strlen(), especially for field_string - Strings generated by parser are now const strings, less chance of accidently changing a string - Removed a lot of calls with LEX_STRING as parameter (changed to pointer) - More uniform code - Item::name_length was not kept up to date. Now fixed - Several bugs found and fixed (Access to null pointers, access of freed memory, wrong arguments to printf like functions) - Removed a lot of casts from (const char*) to (char*) Changes: - This caused some ABI changes - lex_string_set now uses LEX_CSTRING - Some fucntions are now taking const char* instead of char* - Create_field::change and after changed to LEX_CSTRING - handler::connect_string, comment and engine_name() changed to LEX_CSTRING - Checked printf() related calls to find bugs. Found and fixed several errors in old code. - A lot of changes from LEX_STRING to LEX_CSTRING, especially related to parsing and events. - Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING* - Some changes for char* to const char* - Added printf argument checking for my_snprintf() - Introduced null_clex_str, star_clex_string, temp_lex_str to simplify code - Added item_empty_name and item_used_name to be able to distingush between items that was given an empty name and items that was not given a name This is used in sql_yacc.yy to know when to give an item a name. - select table_name."*' is not anymore same as table_name.* - removed not used function Item::rename() - Added comparision of item->name_length before some calls to my_strcasecmp() to speed up comparison - Moved Item_sp_variable::make_field() from item.h to item.cc - Some minimal code changes to avoid copying to const char * - Fixed wrong error message in wsrep_mysql_parse() - Fixed wrong code in find_field_in_natural_join() where real_item() was set when it shouldn't - ER_ERROR_ON_RENAME was used with extra arguments. - Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already give the error. TODO: - Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c - Change code to not modify LEX_CSTRING for database name (as part of lower_case_table_names)
2017-04-23 18:39:57 +02:00
DBUG_PRINT("info", ("spider bitmap is set %s",
SPIDER_field_name_str(*field)));
2013-06-27 13:18:48 +02:00
if ((error_num =
spider_db_fetch_row(spider->share, *field, row, ptr_diff)))
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, tmp_map);
2013-06-27 13:18:48 +02:00
#endif
}
row->next();
}
DBUG_RETURN(0);
}
int spider_db_seek_tmp_key(
uchar *buf,
SPIDER_POSITION *pos,
ha_spider *spider,
TABLE *table,
const KEY *key_info
) {
int error_num;
KEY_PART_INFO *key_part;
uint part_num;
SPIDER_DB_ROW *row = pos->row;
Field *field;
my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(buf, table->record[0]);
DBUG_ENTER("spider_db_seek_tmp_key");
if (pos->pos_mode == 1)
{
if ((error_num = spider_db_get_row_from_tmp_tbl_pos(pos, &row)))
DBUG_RETURN(error_num);
} else if (pos->pos_mode == 2)
{
/*
SPIDER_DB_RESULT *result = pos->result->result;
result->current_row = row;
*/
}
2013-09-16 20:31:13 +02:00
DBUG_PRINT("info", ("spider row=%p", row));
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
2015-02-19 16:41:26 +01:00
if (!spider->result_list.in_cmp_ref)
{
DBUG_PRINT("info", ("spider direct_aggregate=%s",
pos->direct_aggregate ? "TRUE" : "FALSE"));
spider->result_list.snap_mrr_with_cnt = pos->mrr_with_cnt;
spider->result_list.snap_direct_aggregate = pos->direct_aggregate;
spider->result_list.snap_row = row;
}
2013-09-16 20:22:54 +02:00
#endif
2013-06-27 13:18:48 +02:00
/* for mrr */
if (pos->mrr_with_cnt)
{
DBUG_PRINT("info", ("spider mrr_with_cnt"));
row->next();
}
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
/* for direct_aggregate */
if (pos->direct_aggregate)
{
if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
DBUG_RETURN(error_num);
}
#endif
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_append_match_fetch(spider,
pos->ft_first, pos->ft_current, row)))
DBUG_RETURN(error_num);
for (
key_part = key_info->key_part,
part_num = 0;
2013-08-24 11:37:49 +02:00
part_num < spider_user_defined_key_parts(key_info);
2013-06-27 13:18:48 +02:00
key_part++,
part_num++
) {
field = key_part->field;
if ((
bitmap_is_set(table->read_set, field->field_index) |
bitmap_is_set(table->write_set, field->field_index)
)) {
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
2013-06-27 13:18:48 +02:00
#endif
DBUG_PRINT("info", ("spider bitmap is set %s",
SPIDER_field_name_str(field)));
2013-06-27 13:18:48 +02:00
if ((error_num =
spider_db_fetch_row(spider->share, field, row, ptr_diff)))
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, tmp_map);
2013-06-27 13:18:48 +02:00
#endif
}
row->next();
}
DBUG_RETURN(0);
}
int spider_db_seek_tmp_minimum_columns(
uchar *buf,
SPIDER_POSITION *pos,
ha_spider *spider,
TABLE *table
) {
int error_num;
Field **field;
SPIDER_DB_ROW *row = pos->row;
my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(buf, table->record[0]);
DBUG_ENTER("spider_db_seek_tmp_minimum_columns");
if (pos->pos_mode == 1)
{
if ((error_num = spider_db_get_row_from_tmp_tbl_pos(pos, &row)))
DBUG_RETURN(error_num);
} else if (pos->pos_mode == 2)
{
/*
SPIDER_DB_RESULT *result = pos->result->result;
result->current_row = row;
*/
}
2013-09-16 20:31:13 +02:00
DBUG_PRINT("info", ("spider row=%p", row));
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
2015-02-19 16:41:26 +01:00
if (!spider->result_list.in_cmp_ref)
{
DBUG_PRINT("info", ("spider direct_aggregate=%s",
pos->direct_aggregate ? "TRUE" : "FALSE"));
spider->result_list.snap_mrr_with_cnt = pos->mrr_with_cnt;
spider->result_list.snap_direct_aggregate = pos->direct_aggregate;
spider->result_list.snap_row = row;
}
2013-09-16 20:22:54 +02:00
#endif
2013-06-27 13:18:48 +02:00
/* for mrr */
if (pos->mrr_with_cnt)
{
DBUG_PRINT("info", ("spider mrr_with_cnt"));
row->next();
}
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
/* for direct_aggregate */
if (pos->direct_aggregate)
{
if ((error_num = spider_db_fetch_for_item_sum_funcs(row, spider)))
DBUG_RETURN(error_num);
}
#endif
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_append_match_fetch(spider,
pos->ft_first, pos->ft_current, row)))
DBUG_RETURN(error_num);
for (
field = table->field;
*field;
field++
) {
DBUG_PRINT("info", ("spider field_index %u", (*field)->field_index));
if (spider_bit_is_set(pos->position_bitmap, (*field)->field_index))
{
/*
if ((
bitmap_is_set(table->read_set, (*field)->field_index) |
bitmap_is_set(table->write_set, (*field)->field_index)
)) {
DBUG_PRINT("info", ("spider read_set %u",
bitmap_is_set(table->read_set, (*field)->field_index)));
DBUG_PRINT("info", ("spider write_set %u",
bitmap_is_set(table->write_set, (*field)->field_index)));
*/
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
2013-06-27 13:18:48 +02:00
#endif
Changing field::field_name and Item::name to LEX_CSTRING Benefits of this patch: - Removed a lot of calls to strlen(), especially for field_string - Strings generated by parser are now const strings, less chance of accidently changing a string - Removed a lot of calls with LEX_STRING as parameter (changed to pointer) - More uniform code - Item::name_length was not kept up to date. Now fixed - Several bugs found and fixed (Access to null pointers, access of freed memory, wrong arguments to printf like functions) - Removed a lot of casts from (const char*) to (char*) Changes: - This caused some ABI changes - lex_string_set now uses LEX_CSTRING - Some fucntions are now taking const char* instead of char* - Create_field::change and after changed to LEX_CSTRING - handler::connect_string, comment and engine_name() changed to LEX_CSTRING - Checked printf() related calls to find bugs. Found and fixed several errors in old code. - A lot of changes from LEX_STRING to LEX_CSTRING, especially related to parsing and events. - Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING* - Some changes for char* to const char* - Added printf argument checking for my_snprintf() - Introduced null_clex_str, star_clex_string, temp_lex_str to simplify code - Added item_empty_name and item_used_name to be able to distingush between items that was given an empty name and items that was not given a name This is used in sql_yacc.yy to know when to give an item a name. - select table_name."*' is not anymore same as table_name.* - removed not used function Item::rename() - Added comparision of item->name_length before some calls to my_strcasecmp() to speed up comparison - Moved Item_sp_variable::make_field() from item.h to item.cc - Some minimal code changes to avoid copying to const char * - Fixed wrong error message in wsrep_mysql_parse() - Fixed wrong code in find_field_in_natural_join() where real_item() was set when it shouldn't - ER_ERROR_ON_RENAME was used with extra arguments. - Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already give the error. TODO: - Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c - Change code to not modify LEX_CSTRING for database name (as part of lower_case_table_names)
2017-04-23 18:39:57 +02:00
DBUG_PRINT("info", ("spider bitmap is set %s",
SPIDER_field_name_str(*field)));
2013-06-27 13:18:48 +02:00
if ((error_num =
spider_db_fetch_row(spider->share, *field, row, ptr_diff)))
DBUG_RETURN(error_num);
row->next();
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, tmp_map);
2013-06-27 13:18:48 +02:00
#endif
}
else if (bitmap_is_set(table->read_set, (*field)->field_index))
{
DBUG_PRINT("info", ("spider bitmap is cleared %s",
SPIDER_field_name_str(*field)));
2013-06-27 13:18:48 +02:00
bitmap_clear_bit(table->read_set, (*field)->field_index);
}
}
DBUG_RETURN(0);
}
int spider_db_show_table_status(
ha_spider *spider,
int link_idx,
int sts_mode,
uint flag
) {
int error_num;
SPIDER_CONN *conn = spider->conns[link_idx];
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
DBUG_ENTER("spider_db_show_table_status");
DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
sts_mode = dbton_hdl->sts_mode_exchange(sts_mode);
error_num = dbton_hdl->show_table_status(
link_idx,
sts_mode,
flag
);
DBUG_RETURN(error_num);
}
int spider_db_simple_action(
uint simple_action,
spider_db_handler *db_handler,
int link_idx
) {
int error_num;
DBUG_ENTER("spider_db_simple_action");
switch (simple_action)
{
case SPIDER_SIMPLE_RECORDS:
DBUG_PRINT("info",("spider simple records"));
error_num = db_handler->show_records(
link_idx
);
break;
#ifdef HA_HAS_CHECKSUM_EXTENDED
case SPIDER_SIMPLE_CHECKSUM_TABLE:
DBUG_PRINT("info",("spider simple checksum_table"));
error_num = db_handler->checksum_table(
link_idx
);
break;
#endif
default:
DBUG_ASSERT(0);
2020-03-24 08:35:19 +01:00
error_num = HA_ERR_CRASHED;
break;
}
DBUG_RETURN(error_num);
}
int spider_db_simple_action(
uint simple_action,
2013-06-27 13:18:48 +02:00
ha_spider *spider,
2014-03-24 21:12:36 +01:00
int link_idx,
bool pre_call
2013-06-27 13:18:48 +02:00
) {
int error_num;
2014-03-24 21:14:10 +01:00
THD *thd = spider->trx->thd;
SPIDER_CONN *conn;
DBUG_ENTER("spider_db_simple_action");
2014-03-24 21:12:36 +01:00
if (pre_call)
{
2014-03-24 21:14:10 +01:00
if (spider_param_bgs_mode(thd, spider->share->bgs_mode))
2014-03-24 21:12:36 +01:00
{
2014-03-24 21:14:10 +01:00
if ((error_num = spider_check_and_get_casual_read_conn(thd, spider,
link_idx)))
{
DBUG_RETURN(error_num);
}
conn = spider->conns[link_idx];
2014-03-24 21:12:36 +01:00
if (!(error_num = spider_create_conn_thread(conn)))
{
spider_bg_conn_simple_action(conn, simple_action, FALSE,
2014-03-24 21:12:36 +01:00
spider, link_idx, (int *) &spider->result_list.bgs_error);
}
} else {
2014-03-24 21:14:10 +01:00
conn = spider->conns[link_idx];
error_num = spider_db_simple_action(
simple_action,
spider->dbton_handler[conn->dbton_id],
2014-03-24 21:12:36 +01:00
link_idx
);
}
} else {
2014-03-24 21:14:10 +01:00
conn = spider->conns[link_idx];
if (spider->use_pre_action)
2014-03-24 21:12:36 +01:00
{
2014-03-24 21:14:10 +01:00
if (spider_param_bgs_mode(thd, spider->share->bgs_mode))
2014-03-24 21:12:36 +01:00
{
spider_bg_conn_wait(conn);
error_num = spider->result_list.bgs_error;
2014-03-24 21:14:10 +01:00
if (conn->casual_read_base_conn)
{
spider->conns[link_idx] = conn->casual_read_base_conn;
}
2014-03-24 21:12:36 +01:00
} else {
error_num = 0;
}
} else {
error_num = spider_db_simple_action(
simple_action,
spider->dbton_handler[conn->dbton_id],
2014-03-24 21:12:36 +01:00
link_idx
);
}
}
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
void spider_db_set_cardinarity(
ha_spider *spider,
TABLE *table
) {
int roop_count, roop_count2;
SPIDER_SHARE *share = spider->share;
KEY *key_info;
KEY_PART_INFO *key_part;
Field *field;
ha_rows rec_per_key;
DBUG_ENTER("spider_db_set_cardinarity");
for (roop_count = 0; roop_count < (int) table->s->keys; roop_count++)
{
key_info = &table->key_info[roop_count];
2013-08-24 11:37:49 +02:00
for (roop_count2 = 0;
roop_count2 < (int) spider_user_defined_key_parts(key_info);
2013-06-27 13:18:48 +02:00
roop_count2++)
{
key_part = &key_info->key_part[roop_count2];
field = key_part->field;
rec_per_key = (ha_rows) share->stat.records /
2013-06-27 13:18:48 +02:00
share->cardinality[field->field_index];
if (rec_per_key > ~(ulong) 0)
key_info->rec_per_key[roop_count2] = ~(ulong) 0;
else if (rec_per_key == 0)
key_info->rec_per_key[roop_count2] = 1;
else
key_info->rec_per_key[roop_count2] = (ulong) rec_per_key;
DBUG_PRINT("info",
("spider column id=%d", field->field_index));
DBUG_PRINT("info",
("spider cardinality=%lld",
share->cardinality[field->field_index]));
DBUG_PRINT("info",
("spider rec_per_key=%lu",
key_info->rec_per_key[roop_count2]));
}
}
DBUG_VOID_RETURN;
}
int spider_db_show_index(
ha_spider *spider,
int link_idx,
TABLE *table,
int crd_mode
) {
int error_num;
SPIDER_CONN *conn = spider->conns[link_idx];
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
DBUG_ENTER("spider_db_show_index");
crd_mode = dbton_hdl->crd_mode_exchange(crd_mode);
error_num = spider->dbton_handler[conn->dbton_id]->show_index(
link_idx,
crd_mode
);
DBUG_RETURN(error_num);
}
ha_rows spider_db_explain_select(
key_range *start_key,
key_range *end_key,
ha_spider *spider,
int link_idx
) {
SPIDER_CONN *conn = spider->conns[link_idx];
ha_rows rows;
DBUG_ENTER("spider_db_explain_select");
rows = spider->dbton_handler[conn->dbton_id]->explain_select(
start_key,
end_key,
link_idx
);
DBUG_RETURN(rows);
}
int spider_db_bulk_insert_init(
ha_spider *spider,
const TABLE *table
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
DBUG_ENTER("spider_db_bulk_insert_init");
spider->sql_kinds = 0;
spider->reset_sql_sql(SPIDER_SQL_TYPE_INSERT_SQL);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
spider->reset_hs_sql(SPIDER_SQL_TYPE_OTHER_HS);
#endif
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
if (spider->conns[roop_count])
spider->conns[roop_count]->ignore_dup_key = spider->ignore_dup_key;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (
spider_conn_use_handler(spider, spider->lock_mode, roop_count) &&
(
!spider->handler_opened(roop_count, SPIDER_CONN_KIND_HS_WRITE) ||
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
spider->hs_w_ret_fields_num[roop_count] < MAX_FIELDS ||
#endif
spider->hs_w_conns[roop_count]->server_lost
)
) {
if ((error_num = spider_db_open_handler(spider,
spider->hs_w_conns[roop_count], roop_count)))
{
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider->set_handler_opened(roop_count);
}
#else
spider_conn_use_handler(spider, spider->lock_mode, roop_count);
#endif
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
#endif
if (
(error_num = spider->append_insert_sql_part()) ||
(error_num = spider->append_into_sql_part(
SPIDER_SQL_TYPE_INSERT_SQL))
)
DBUG_RETURN(error_num);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
if (spider->sql_kinds & SPIDER_SQL_KIND_HS)
{
spider->result_list.hs_upd_rows = 0;
}
#endif
DBUG_RETURN(0);
}
int spider_db_bulk_insert(
ha_spider *spider,
TABLE *table,
ha_copy_info *copy_info,
2013-06-27 13:18:48 +02:00
bool bulk_end
) {
int error_num, first_insert_link_idx = -1;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
SPIDER_RESULT_LIST *result_list = &spider->result_list;
#endif
SPIDER_SHARE *share = spider->share;
THD *thd = spider->trx->thd;
DBUG_ENTER("spider_db_bulk_insert");
if (!bulk_end)
{
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
#endif
if ((error_num = spider->append_insert_values_sql_part(
SPIDER_SQL_TYPE_INSERT_SQL)))
DBUG_RETURN(error_num);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
if (spider->sql_kinds & SPIDER_SQL_KIND_HS)
{
if ((error_num = spider->append_insert_values_hs_part(
SPIDER_SQL_TYPE_INSERT_HS)))
DBUG_RETURN(error_num);
result_list->hs_upd_rows++;
}
#endif
}
if (spider->is_bulk_insert_exec_period(bulk_end))
{
int roop_count2;
SPIDER_CONN *conn, *first_insert_conn = NULL;
if ((error_num = spider->append_insert_terminator_sql_part(
SPIDER_SQL_TYPE_INSERT_SQL)))
{
DBUG_RETURN(error_num);
}
#ifdef HA_CAN_BULK_ACCESS
if (!spider->is_bulk_access_clone)
{
#endif
bool insert_info = FALSE;
2013-06-27 13:18:48 +02:00
for (
roop_count2 = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count2 < (int) share->link_count;
roop_count2 = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count2, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
spider_db_handler *dbton_handler;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->conn_kind[roop_count2] == SPIDER_CONN_KIND_MYSQL)
{
#endif
sql_type = SPIDER_SQL_TYPE_INSERT_SQL;
conn = spider->conns[roop_count2];
dbton_handler = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_handler->set_sql_for_exec(sql_type,
roop_count2)))
DBUG_RETURN(error_num);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
sql_type = SPIDER_SQL_TYPE_INSERT_HS;
conn = spider->hs_w_conns[roop_count2];
dbton_handler = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
}
#endif
conn->need_mon = &spider->need_mons[roop_count2];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, roop_count2)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if (
share->monitoring_kind[roop_count2] &&
spider->need_mons[roop_count2]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count2,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count2],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count2],
NULL,
0,
share->monitoring_kind[roop_count2],
share->monitoring_limit[roop_count2],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count2],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count2, spider->trx->thd,
share);
if (dbton_handler->execute_sql(
sql_type,
conn,
-1,
&spider->need_mons[roop_count2])
) {
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
spider->set_insert_to_pos_sql(SPIDER_SQL_TYPE_INSERT_SQL);
error_num = spider_db_errorno(conn);
if (error_num == HA_ERR_FOUND_DUPP_KEY)
{
conn->db_conn->set_dup_key_idx(spider, roop_count2);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if (
error_num != ER_DUP_ENTRY &&
error_num != ER_DUP_KEY &&
error_num != HA_ERR_FOUND_DUPP_KEY &&
share->monitoring_kind[roop_count2] &&
spider->need_mons[roop_count2]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count2,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count2],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count2],
NULL,
0,
share->monitoring_kind[roop_count2],
share->monitoring_limit[roop_count2],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count2],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
if (!insert_info && copy_info)
{
insert_info =
conn->db_conn->inserted_info(dbton_handler, copy_info);
}
2013-06-27 13:18:48 +02:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind != SPIDER_CONN_KIND_MYSQL)
{
uint roop_count;
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider result_list->hs_upd_rows=%llu",
result_list->hs_upd_rows));
for (roop_count = 0; roop_count < result_list->hs_upd_rows;
roop_count++)
{
SPIDER_DB_RESULT *result;
if (spider_bit_is_set(spider->db_request_phase, roop_count2))
{
spider_clear_bit(spider->db_request_phase, roop_count2);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[roop_count2];
request_key.next = NULL;
if ((result = conn->db_conn->use_result(&request_key, &error_num)))
{
result->free_result();
delete result;
} else {
if (!error_num)
{
error_num = spider_db_errorno(conn);
}
DBUG_RETURN(error_num);
}
}
}
#endif
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if (first_insert_link_idx == -1)
{
first_insert_link_idx = roop_count2;
first_insert_conn = conn;
}
}
conn = first_insert_conn;
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
conn->need_mon = &spider->need_mons[first_insert_link_idx];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
spider->set_insert_to_pos_sql(SPIDER_SQL_TYPE_INSERT_SQL);
if (table->next_number_field &&
(
!table->auto_increment_field_not_null ||
(
!table->next_number_field->val_int() &&
!(thd->variables.sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO)
)
)
) {
ulonglong last_insert_id;
spider_db_handler *dbton_handler =
spider->dbton_handler[conn->dbton_id];
if (spider->store_last_insert_id)
last_insert_id = spider->store_last_insert_id;
else if ((error_num = dbton_handler->
show_last_insert_id(first_insert_link_idx, last_insert_id)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
table->next_number_field->set_notnull();
if (
(error_num = spider_db_update_auto_increment(spider,
first_insert_link_idx)) ||
(error_num = table->next_number_field->store(
last_insert_id, TRUE))
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
spider->store_last_insert_id = 0;
#ifdef HA_CAN_BULK_ACCESS
}
#endif
}
if (
(bulk_end || !spider->bulk_insert) &&
(error_num = spider_trx_check_link_idx_failed(spider))
)
DBUG_RETURN(error_num);
DBUG_RETURN(0);
}
#ifdef HA_CAN_BULK_ACCESS
int spider_db_bulk_bulk_insert(
ha_spider *spider
) {
int error_num = 0, first_insert_link_idx = -1, tmp_error_num;
int roop_count2;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn, *first_insert_conn = NULL;
TABLE *table = spider->get_table();
THD *thd = spider->trx->thd;
DBUG_ENTER("spider_db_bulk_bulk_insert");
for (
roop_count2 = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count2 < (int) share->link_count;
roop_count2 = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count2, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->conn_kind[roop_count2] == SPIDER_CONN_KIND_MYSQL)
{
#endif
conn = spider->conns[roop_count2];
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
conn = spider->hs_w_conns[roop_count2];
}
#endif
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((tmp_error_num = spider_db_bulk_open_handler(spider, conn,
roop_count2)))
{
error_num = tmp_error_num;
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind != SPIDER_CONN_KIND_MYSQL)
{
uint roop_count;
2014-03-24 20:48:23 +01:00
SPIDER_RESULT_LIST *result_list = &spider->result_list;
2013-06-27 13:18:48 +02:00
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider result_list->hs_upd_rows=%llu",
result_list->hs_upd_rows));
for (roop_count = 0; roop_count < result_list->hs_upd_rows;
roop_count++)
{
SPIDER_DB_RESULT *result;
if (spider_bit_is_set(spider->db_request_phase, roop_count2))
{
spider_clear_bit(spider->db_request_phase, roop_count2);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[roop_count2];
request_key.next = NULL;
if ((result = conn->db_conn->use_result(&request_key, &error_num)))
{
result->free_result();
delete result;
} else {
if (!error_num)
{
error_num = spider_db_errorno(conn);
}
DBUG_RETURN(error_num);
}
}
}
#endif
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (first_insert_link_idx == -1)
{
first_insert_link_idx = roop_count2;
first_insert_conn = conn;
}
}
conn = first_insert_conn;
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &spider->need_mons[first_insert_link_idx];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if (table->next_number_field &&
(
!table->auto_increment_field_not_null ||
(
!table->next_number_field->val_int() &&
!(thd->variables.sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO)
)
)
) {
ulonglong last_insert_id;
if (spider->store_last_insert_id)
last_insert_id = spider->store_last_insert_id;
else
last_insert_id = conn->db_conn->last_insert_id();
table->next_number_field->set_notnull();
if (
(tmp_error_num = spider_db_update_auto_increment(spider,
first_insert_link_idx)) ||
(tmp_error_num = table->next_number_field->store(
last_insert_id, TRUE))
) {
error_num = tmp_error_num;
}
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
spider->store_last_insert_id = 0;
DBUG_RETURN(error_num);
}
#endif
int spider_db_update_auto_increment(
ha_spider *spider,
int link_idx
) {
int roop_count;
THD *thd = spider->trx->thd;
ulonglong last_insert_id, affected_rows;
SPIDER_SHARE *share = spider->share;
TABLE *table = spider->get_table();
int auto_increment_mode = spider_param_auto_increment_mode(thd,
share->auto_increment_mode);
DBUG_ENTER("spider_db_update_auto_increment");
if (
auto_increment_mode == 2 ||
(auto_increment_mode == 3 && !table->auto_increment_field_not_null)
) {
last_insert_id = spider->conns[link_idx]->db_conn->last_insert_id();
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
{
#endif
affected_rows = spider->conns[link_idx]->db_conn->affected_rows();
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
affected_rows = spider->result_list.hs_upd_rows;
}
#endif
DBUG_PRINT("info",("spider last_insert_id=%llu", last_insert_id));
2014-06-08 12:52:11 +02:00
share->lgtm_tblhnd_share->auto_increment_value =
2013-06-27 13:18:48 +02:00
last_insert_id + affected_rows;
2014-06-08 12:52:11 +02:00
DBUG_PRINT("info",("spider auto_increment_value=%llu",
share->lgtm_tblhnd_share->auto_increment_value));
2013-06-27 13:18:48 +02:00
/*
thd->record_first_successful_insert_id_in_cur_stmt(last_insert_id);
*/
if (
thd->first_successful_insert_id_in_cur_stmt == 0 ||
thd->first_successful_insert_id_in_cur_stmt > last_insert_id
) {
bool first_set = (thd->first_successful_insert_id_in_cur_stmt == 0);
thd->first_successful_insert_id_in_cur_stmt = last_insert_id;
if (
table->s->next_number_keypart == 0 &&
mysql_bin_log.is_open() &&
#if MYSQL_VERSION_ID < 50500
!thd->current_stmt_binlog_row_based
#else
!thd->is_current_stmt_binlog_format_row()
#endif
) {
if (
spider->check_partitioned() &&
thd->auto_inc_intervals_in_cur_stmt_for_binlog.nb_elements() > 0
) {
DBUG_PRINT("info",("spider table partitioning"));
Discrete_interval *current =
thd->auto_inc_intervals_in_cur_stmt_for_binlog.get_current();
current->replace(last_insert_id, affected_rows, 1);
} else {
DBUG_PRINT("info",("spider table"));
thd->auto_inc_intervals_in_cur_stmt_for_binlog.append(
last_insert_id, affected_rows, 1);
}
if (affected_rows > 1 || !first_set)
{
for (roop_count = first_set ? 1 : 0;
roop_count < (int) affected_rows;
roop_count++)
2013-08-24 11:37:49 +02:00
push_warning_printf(thd, SPIDER_WARN_LEVEL_NOTE,
2013-06-27 13:18:48 +02:00
ER_SPIDER_AUTOINC_VAL_IS_DIFFERENT_NUM,
ER_SPIDER_AUTOINC_VAL_IS_DIFFERENT_STR);
}
}
} else {
if (
table->s->next_number_keypart == 0 &&
mysql_bin_log.is_open() &&
#if MYSQL_VERSION_ID < 50500
!thd->current_stmt_binlog_row_based
#else
!thd->is_current_stmt_binlog_format_row()
#endif
) {
for (roop_count = 0; roop_count < (int) affected_rows; roop_count++)
2013-08-24 11:37:49 +02:00
push_warning_printf(thd, SPIDER_WARN_LEVEL_NOTE,
2013-06-27 13:18:48 +02:00
ER_SPIDER_AUTOINC_VAL_IS_DIFFERENT_NUM,
ER_SPIDER_AUTOINC_VAL_IS_DIFFERENT_STR);
}
}
}
DBUG_RETURN(0);
}
int spider_db_bulk_update_size_limit(
ha_spider *spider,
TABLE *table
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_CONN *conn;
ha_rows dup_key_found = 0;
2013-06-27 13:18:48 +02:00
DBUG_ENTER("spider_db_bulk_update_size_limit");
if (result_list->bulk_update_mode == 1)
{
/* execute bulk updating */
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_hdl->set_sql_for_exec(
SPIDER_SQL_TYPE_BULK_UPDATE_SQL, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_query_for_bulk_update(
spider, conn, roop_count, &dup_key_found)))
{
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
}
spider->reset_sql_sql(SPIDER_SQL_TYPE_BULK_UPDATE_SQL);
} else {
/* store query to temporary tables */
if ((error_num = spider->mk_bulk_tmp_table_and_bulk_start()))
{
goto error_mk_table;
}
if ((error_num = spider->bulk_tmp_table_insert()))
{
goto error_write_row;
}
spider->reset_sql_sql(SPIDER_SQL_TYPE_BULK_UPDATE_SQL);
}
DBUG_RETURN(0);
error_write_row:
spider->bulk_tmp_table_end_bulk_insert();
spider->rm_bulk_tmp_table();
spider->reset_sql_sql(SPIDER_SQL_TYPE_BULK_UPDATE_SQL);
error_mk_table:
DBUG_RETURN(error_num);
}
int spider_db_bulk_update_end(
ha_spider *spider,
ha_rows *dup_key_found
2013-06-27 13:18:48 +02:00
) {
int error_num = 0, error_num2, roop_count;
THD *thd = spider->trx->thd;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
bool is_error = thd->is_error();
DBUG_ENTER("spider_db_bulk_update_end");
if (spider->bulk_tmp_table_created())
{
if ((error_num2 = spider->bulk_tmp_table_end_bulk_insert()))
{
error_num = error_num2;
}
if (!is_error)
{
if (error_num)
goto error_last_query;
if ((error_num = spider->bulk_tmp_table_rnd_init()))
{
goto error_rnd_init;
}
while (!(error_num = spider->bulk_tmp_table_rnd_next()))
{
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_hdl->set_sql_for_exec(
SPIDER_SQL_TYPE_BULK_UPDATE_SQL, roop_count)))
{
if (error_num == ER_SPIDER_COND_SKIP_NUM)
{
continue;
}
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_query_for_bulk_update(
spider, conn, roop_count, dup_key_found)))
{
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
goto error_query;
}
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
}
}
if (error_num != HA_ERR_END_OF_FILE)
goto error_rnd_next;
spider->bulk_tmp_table_rnd_end();
}
}
if (!is_error)
{
if (!spider->sql_is_empty(SPIDER_SQL_TYPE_BULK_UPDATE_SQL))
{
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_hdl->set_sql_for_exec(
SPIDER_SQL_TYPE_BULK_UPDATE_SQL, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_query_for_bulk_update(
spider, conn, roop_count, dup_key_found)))
{
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
goto error_last_query;
}
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
}
}
}
spider->rm_bulk_tmp_table();
spider->reset_sql_sql(SPIDER_SQL_TYPE_BULK_UPDATE_SQL);
DBUG_RETURN(0);
error_query:
error_rnd_next:
spider->bulk_tmp_table_rnd_end();
error_rnd_init:
error_last_query:
spider->rm_bulk_tmp_table();
spider->reset_sql_sql(SPIDER_SQL_TYPE_BULK_UPDATE_SQL);
DBUG_RETURN(error_num);
}
int spider_db_bulk_update(
ha_spider *spider,
TABLE *table,
my_ptrdiff_t ptr_diff
) {
int error_num;
DBUG_ENTER("spider_db_bulk_update");
if ((error_num = spider->append_update_sql(table, ptr_diff, TRUE)))
DBUG_RETURN(error_num);
if (
spider->sql_is_filled_up(SPIDER_SQL_TYPE_BULK_UPDATE_SQL) &&
(error_num = spider_db_bulk_update_size_limit(spider, table))
)
DBUG_RETURN(error_num);
DBUG_RETURN(0);
}
int spider_db_update(
ha_spider *spider,
TABLE *table,
const uchar *old_data
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(old_data, table->record[0]);
DBUG_ENTER("spider_db_update");
if (result_list->bulk_update_mode)
DBUG_RETURN(spider_db_bulk_update(spider, table, ptr_diff));
if ((error_num = spider->append_update_sql(table, ptr_diff, FALSE)))
DBUG_RETURN(error_num);
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
conn->ignore_dup_key = spider->ignore_dup_key;
#endif
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_hdl->set_sql_for_exec(
SPIDER_SQL_TYPE_UPDATE_SQL, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
conn->need_mon = &spider->need_mons[roop_count];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_UPDATE_SQL,
conn,
-1,
&spider->need_mons[roop_count])
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
error_num != ER_DUP_ENTRY &&
error_num != ER_DUP_KEY &&
error_num != HA_ERR_FOUND_DUPP_KEY &&
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
if (
!conn->db_conn->affected_rows() &&
share->link_statuses[roop_count] == SPIDER_LINK_STATUS_RECOVERY &&
spider->pk_update
) {
/* insert */
if ((error_num = dbton_hdl->append_insert_for_recovery(
SPIDER_SQL_TYPE_INSERT_SQL, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_INSERT_SQL,
conn,
-1,
&spider->need_mons[roop_count])
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
error_num != ER_DUP_ENTRY &&
error_num != ER_DUP_KEY &&
error_num != HA_ERR_FOUND_DUPP_KEY &&
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
result_list->update_sqls[roop_count].length(0);
}
spider->reset_sql_sql(SPIDER_SQL_TYPE_UPDATE_SQL);
DBUG_RETURN(0);
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
2013-06-27 13:18:48 +02:00
int spider_db_direct_update(
ha_spider *spider,
TABLE *table,
KEY_MULTI_RANGE *ranges,
uint range_count,
ha_rows *update_rows,
ha_rows *found_rows
2013-06-27 13:18:48 +02:00
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
bool counted = FALSE;
st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
DBUG_ENTER("spider_db_direct_update");
spider_set_result_list_param(spider);
result_list->finish_flg = FALSE;
DBUG_PRINT("info", ("spider do_direct_update=%s",
spider->do_direct_update ? "TRUE" : "FALSE"));
DBUG_PRINT("info", ("spider direct_update_kinds=%u",
spider->direct_update_kinds));
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
(
spider->do_direct_update &&
(spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
) ||
(
!spider->do_direct_update &&
#endif
(spider->sql_kinds & SPIDER_SQL_KIND_SQL)
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
)
#endif
) {
#endif
if ((error_num = spider->append_update_sql_part()))
DBUG_RETURN(error_num);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
/*
SQL access -> SQL remote access
!spider->do_direct_update &&
(spider->sql_kinds & SPIDER_SQL_KIND_SQL)
SQL access -> SQL remote access with dirct_update
spider->do_direct_update &&
spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
spider->direct_update_fields
Handlersocket access -> SQL remote access with dirct_update
spider->do_direct_update &&
(spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
Handlersocket access -> Handlersocket access
spider->do_direct_update &&
(spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
*/
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->hs_increment || spider->hs_decrement)
{
if (
(spider->direct_update_kinds & SPIDER_SQL_KIND_SQL) &&
(error_num = spider->append_increment_update_set_sql_part())
) {
DBUG_RETURN(error_num);
}
} else {
#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
if (!spider->do_direct_update)
{
#endif
if (
(spider->sql_kinds & SPIDER_SQL_KIND_SQL) &&
(error_num = spider->append_update_set_sql_part())
) {
DBUG_RETURN(error_num);
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
} else {
if (
(spider->direct_update_kinds & SPIDER_SQL_KIND_SQL) &&
(error_num = spider->append_direct_update_set_sql_part())
) {
DBUG_RETURN(error_num);
}
2014-03-24 20:29:52 +01:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
2013-06-27 13:18:48 +02:00
if (
(spider->direct_update_kinds & SPIDER_SQL_KIND_HS) &&
(error_num = spider->append_direct_update_set_hs_part())
) {
DBUG_RETURN(error_num);
}
2014-03-24 20:29:52 +01:00
#endif
2013-06-27 13:18:48 +02:00
}
#endif
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
result_list->desc_flg = FALSE;
result_list->sorted = TRUE;
if (spider->active_index == MAX_KEY)
result_list->key_info = NULL;
else
result_list->key_info = &table->key_info[spider->active_index];
spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
result_list->limit_num =
result_list->internal_limit >= select_limit ?
select_limit : result_list->internal_limit;
result_list->internal_offset += offset_limit;
if (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
{
if (
(error_num = spider->append_key_where_sql_part(
(ranges && ranges->start_key.key) ? &ranges->start_key : NULL,
(ranges && ranges->end_key.key) ? &ranges->end_key : NULL,
SPIDER_SQL_TYPE_UPDATE_SQL)) ||
(error_num = spider->
append_key_order_for_direct_order_limit_with_alias_sql_part(
NULL, 0, SPIDER_SQL_TYPE_UPDATE_SQL)) ||
(error_num = spider->append_limit_sql_part(
result_list->internal_offset, result_list->limit_num,
SPIDER_SQL_TYPE_UPDATE_SQL))
) {
DBUG_RETURN(error_num);
}
}
2014-03-24 20:29:52 +01:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
2013-06-27 13:18:48 +02:00
if (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
{
if (
(error_num = spider->append_key_where_hs_part(
(ranges && ranges->start_key.key) ? &ranges->start_key : NULL,
(ranges && ranges->end_key.key) ? &ranges->end_key : NULL,
SPIDER_SQL_TYPE_UPDATE_HS)) ||
(error_num = spider->append_limit_hs_part(
result_list->internal_offset, result_list->limit_num,
SPIDER_SQL_TYPE_UPDATE_HS))
) {
DBUG_RETURN(error_num);
}
}
2014-03-24 20:29:52 +01:00
#endif
2013-06-27 13:18:48 +02:00
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
{
#endif
DBUG_PRINT("info", ("spider exec sql"));
conn = spider->conns[roop_count];
sql_type = SPIDER_SQL_TYPE_UPDATE_SQL;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
DBUG_PRINT("info", ("spider exec hs"));
conn = spider->hs_w_conns[roop_count];
sql_type = SPIDER_SQL_TYPE_UPDATE_HS;
}
#endif
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_hdl->set_sql_for_exec(sql_type, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
#ifdef HA_CAN_BULK_ACCESS
if (spider->is_bulk_access_clone)
{
spider->connection_ids[roop_count] = conn->connection_id;
spider_trx_add_bulk_access_conn(spider->trx, conn);
} else {
#endif
conn->need_mon = &spider->need_mons[roop_count];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (
(error_num = dbton_hdl->execute_sql(
sql_type,
conn,
-1,
&spider->need_mons[roop_count])
) &&
(error_num != HA_ERR_FOUND_DUPP_KEY || !spider->ignore_dup_key)
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
error_num != ER_DUP_ENTRY &&
error_num != ER_DUP_KEY &&
error_num != HA_ERR_FOUND_DUPP_KEY &&
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
{
2014-03-24 20:29:52 +01:00
#endif
2013-06-27 13:18:48 +02:00
if (!counted)
{
*update_rows = spider->conns[roop_count]->db_conn->affected_rows();
DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
*found_rows = spider->conns[roop_count]->db_conn->matched_rows();
DBUG_PRINT("info", ("spider found_rows = %llu", *found_rows));
2013-06-27 13:18:48 +02:00
counted = TRUE;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
SPIDER_DB_RESULT *result;
if (spider_bit_is_set(spider->db_request_phase, roop_count))
{
spider_clear_bit(spider->db_request_phase, roop_count);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[roop_count];
request_key.next = NULL;
if ((result = conn->db_conn->use_result(&request_key, &error_num)))
{
if (!counted)
{
*update_rows = conn->db_conn->affected_rows();
DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
*found_rows = conn->db_conn->matched_rows();
DBUG_PRINT("info", ("spider found_rows = %llu", *found_rows));
2013-06-27 13:18:48 +02:00
counted = TRUE;
}
result->free_result();
delete result;
} else {
if (!error_num)
{
error_num = spider_db_errorno(conn);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
DBUG_RETURN(error_num);
}
}
#endif
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
#ifdef HA_CAN_BULK_ACCESS
}
#endif
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
spider->reset_sql_sql(SPIDER_SQL_TYPE_UPDATE_SQL);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
spider->reset_hs_sql(SPIDER_SQL_TYPE_UPDATE_HS);
spider->reset_hs_keys(SPIDER_SQL_TYPE_UPDATE_HS);
spider->reset_hs_upds(SPIDER_SQL_TYPE_UPDATE_HS);
#endif
DBUG_RETURN(0);
}
#else
int spider_db_direct_update(
2013-06-27 13:18:48 +02:00
ha_spider *spider,
TABLE *table,
ha_rows *update_rows,
ha_rows *found_rows
2013-06-27 13:18:48 +02:00
) {
int error_num, roop_count;
2013-06-27 13:18:48 +02:00
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
2013-06-27 13:18:48 +02:00
bool counted = FALSE;
st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
DBUG_ENTER("spider_db_direct_update");
spider_set_result_list_param(spider);
result_list->finish_flg = FALSE;
DBUG_PRINT("info", ("spider do_direct_update=%s",
spider->do_direct_update ? "TRUE" : "FALSE"));
DBUG_PRINT("info", ("spider direct_update_kinds=%u",
spider->direct_update_kinds));
if ((error_num = spider->append_update_sql_part()))
DBUG_RETURN(error_num);
/*
SQL access -> SQL remote access
!spider->do_direct_update &&
(spider->sql_kinds & SPIDER_SQL_KIND_SQL)
SQL access -> SQL remote access with dirct_update
spider->do_direct_update &&
spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
spider->direct_update_fields
*/
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
if (!spider->do_direct_update)
{
2013-06-27 13:18:48 +02:00
#endif
if (
(spider->sql_kinds & SPIDER_SQL_KIND_SQL) &&
(error_num = spider->append_update_set_sql_part())
) {
DBUG_RETURN(error_num);
2013-06-27 13:18:48 +02:00
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
} else {
if (
(spider->direct_update_kinds & SPIDER_SQL_KIND_SQL) &&
(error_num = spider->append_direct_update_set_sql_part())
) {
DBUG_RETURN(error_num);
}
}
#endif
result_list->desc_flg = FALSE;
result_list->sorted = TRUE;
if (spider->active_index == MAX_KEY)
result_list->key_info = NULL;
else
result_list->key_info = &table->key_info[spider->active_index];
spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
result_list->limit_num =
result_list->internal_limit >= select_limit ?
select_limit : result_list->internal_limit;
result_list->internal_offset += offset_limit;
if (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
{
if (
(error_num = spider->append_key_where_sql_part(
NULL,
NULL,
SPIDER_SQL_TYPE_UPDATE_SQL)) ||
(error_num = spider->
append_key_order_for_direct_order_limit_with_alias_sql_part(
NULL, 0, SPIDER_SQL_TYPE_UPDATE_SQL)) ||
(error_num = spider->append_limit_sql_part(
result_list->internal_offset, result_list->limit_num,
SPIDER_SQL_TYPE_UPDATE_SQL))
) {
DBUG_RETURN(error_num);
}
}
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
DBUG_PRINT("info", ("spider exec sql"));
conn = spider->conns[roop_count];
sql_type = SPIDER_SQL_TYPE_UPDATE_SQL;
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if ((error_num = dbton_hdl->set_sql_for_exec(sql_type, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
#ifdef HA_CAN_BULK_ACCESS
if (spider->is_bulk_access_clone)
{
spider->connection_ids[roop_count] = conn->connection_id;
spider_trx_add_bulk_access_conn(spider->trx, conn);
} else {
#endif
conn->need_mon = &spider->need_mons[roop_count];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (
(error_num = dbton_hdl->execute_sql(
sql_type,
conn,
-1,
&spider->need_mons[roop_count])
) &&
(error_num != HA_ERR_FOUND_DUPP_KEY || !spider->ignore_dup_key)
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
error_num != ER_DUP_ENTRY &&
error_num != ER_DUP_KEY &&
error_num != HA_ERR_FOUND_DUPP_KEY &&
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE
);
}
DBUG_RETURN(error_num);
}
if (!counted)
{
*update_rows = spider->conns[roop_count]->db_conn->affected_rows();
DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
*found_rows = spider->conns[roop_count]->db_conn->matched_rows();
DBUG_PRINT("info", ("spider found_rows = %llu", *found_rows));
counted = TRUE;
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
#ifdef HA_CAN_BULK_ACCESS
}
#endif
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
spider->reset_sql_sql(SPIDER_SQL_TYPE_UPDATE_SQL);
DBUG_RETURN(0);
}
#endif
#endif
#ifdef HA_CAN_BULK_ACCESS
int spider_db_bulk_direct_update(
ha_spider *spider,
ha_rows *update_rows,
ha_rows *found_rows
) {
int error_num = 0, roop_count, tmp_error_num;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
bool counted = FALSE;
DBUG_ENTER("spider_db_bulk_direct_update");
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
{
#endif
DBUG_PRINT("info", ("spider exec sql"));
conn = spider->conns[roop_count];
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
DBUG_PRINT("info", ("spider exec hs"));
conn = spider->hs_w_conns[roop_count];
}
#endif
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((tmp_error_num = spider_db_bulk_open_handler(spider, conn,
roop_count)))
{
error_num = tmp_error_num;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
{
2014-03-24 20:48:23 +01:00
#endif
2013-06-27 13:18:48 +02:00
if (!counted)
{
*update_rows = spider->conns[roop_count]->db_conn->affected_rows();
DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
*found_rows = spider->conns[roop_count]->db_conn->matched_rows();
DBUG_PRINT("info", ("spider found_rows = %llu", *found_rows));
2013-06-27 13:18:48 +02:00
counted = TRUE;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
SPIDER_DB_RESULT *result;
if (spider_bit_is_set(spider->db_request_phase, roop_count))
{
spider_clear_bit(spider->db_request_phase, roop_count);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[roop_count];
request_key.next = NULL;
if ((result = conn->db_conn->use_result(&request_key, &error_num)))
{
if (!counted)
{
*update_rows = conn->db_conn->affected_rows();
DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
*found_rows = conn->db_conn->matched_rows();
DBUG_PRINT("info", ("spider found_rows = %llu", *found_rows));
2013-06-27 13:18:48 +02:00
counted = TRUE;
}
result->free_result();
delete result;
} else {
if (!error_num)
{
error_num = spider_db_errorno(conn);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
DBUG_RETURN(error_num);
}
}
#endif
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
DBUG_RETURN(error_num);
}
#endif
int spider_db_bulk_delete(
ha_spider *spider,
TABLE *table,
my_ptrdiff_t ptr_diff
) {
int error_num;
DBUG_ENTER("spider_db_bulk_delete");
if ((error_num = spider->append_delete_sql(table, ptr_diff, TRUE)))
DBUG_RETURN(error_num);
if (
spider->sql_is_filled_up(SPIDER_SQL_TYPE_BULK_UPDATE_SQL) &&
(error_num = spider_db_bulk_update_size_limit(spider, table))
)
DBUG_RETURN(error_num);
DBUG_RETURN(0);
}
int spider_db_delete(
ha_spider *spider,
TABLE *table,
const uchar *buf
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
my_ptrdiff_t ptr_diff = PTR_BYTE_DIFF(buf, table->record[0]);
DBUG_ENTER("spider_db_delete");
if (result_list->bulk_update_mode)
DBUG_RETURN(spider_db_bulk_delete(spider, table, ptr_diff));
if ((error_num = spider->append_delete_sql(table, ptr_diff, FALSE)))
DBUG_RETURN(error_num);
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_hdl->set_sql_for_exec(
SPIDER_SQL_TYPE_DELETE_SQL, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_query_with_set_names(
SPIDER_SQL_TYPE_DELETE_SQL, spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
result_list->update_sqls[roop_count].length(0);
}
if ((error_num = spider->reset_sql_sql(SPIDER_SQL_TYPE_DELETE_SQL)))
{
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
2013-06-27 13:18:48 +02:00
int spider_db_direct_delete(
ha_spider *spider,
TABLE *table,
KEY_MULTI_RANGE *ranges,
uint range_count,
ha_rows *delete_rows
2013-06-27 13:18:48 +02:00
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
bool counted = FALSE;
st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
DBUG_ENTER("spider_db_direct_delete");
spider_set_result_list_param(spider);
result_list->finish_flg = FALSE;
result_list->desc_flg = FALSE;
result_list->sorted = TRUE;
if (spider->active_index == MAX_KEY)
result_list->key_info = NULL;
else
result_list->key_info = &table->key_info[spider->active_index];
spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
result_list->limit_num =
result_list->internal_limit >= select_limit ?
select_limit : result_list->internal_limit;
result_list->internal_offset += offset_limit;
/*
result_list->limit_num =
result_list->internal_limit >= result_list->split_read ?
result_list->split_read : result_list->internal_limit;
*/
if (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
{
if (
(error_num = spider->append_delete_sql_part()) ||
(error_num = spider->append_from_sql_part(SPIDER_SQL_TYPE_DELETE_SQL))
) {
DBUG_RETURN(error_num);
}
spider->set_where_pos_sql(SPIDER_SQL_TYPE_DELETE_SQL);
if (
(error_num = spider->append_key_where_sql_part(
(ranges && ranges->start_key.key) ? &ranges->start_key : NULL,
(ranges && ranges->end_key.key) ? &ranges->end_key : NULL,
SPIDER_SQL_TYPE_DELETE_SQL)) ||
(error_num = spider->
append_key_order_for_direct_order_limit_with_alias_sql_part(
NULL, 0, SPIDER_SQL_TYPE_DELETE_SQL)) ||
(error_num = spider->append_limit_sql_part(
result_list->internal_offset, result_list->limit_num,
SPIDER_SQL_TYPE_DELETE_SQL))
) {
DBUG_RETURN(error_num);
}
}
2014-03-24 20:29:52 +01:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
2013-06-27 13:18:48 +02:00
if (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
{
if (
(error_num = spider->append_key_where_hs_part(
(ranges && ranges->start_key.key) ? &ranges->start_key : NULL,
(ranges && ranges->end_key.key) ? &ranges->end_key : NULL,
SPIDER_SQL_TYPE_DELETE_HS)) ||
(error_num = spider->append_limit_hs_part(
result_list->internal_offset, result_list->limit_num,
SPIDER_SQL_TYPE_DELETE_HS))
) {
DBUG_RETURN(error_num);
}
}
2014-03-24 20:29:52 +01:00
#endif
2013-06-27 13:18:48 +02:00
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
{
#endif
DBUG_PRINT("info", ("spider exec sql"));
conn = spider->conns[roop_count];
sql_type = SPIDER_SQL_TYPE_DELETE_SQL;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
DBUG_PRINT("info", ("spider exec hs"));
conn = spider->hs_w_conns[roop_count];
sql_type = SPIDER_SQL_TYPE_DELETE_HS;
}
#endif
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_hdl->set_sql_for_exec(sql_type, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
#ifdef HA_CAN_BULK_ACCESS
if (spider->is_bulk_access_clone)
{
spider->connection_ids[roop_count] = conn->connection_id;
spider_trx_add_bulk_access_conn(spider->trx, conn);
} else {
#endif
conn->need_mon = &spider->need_mons[roop_count];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (dbton_hdl->execute_sql(
sql_type,
conn,
-1,
&spider->need_mons[roop_count])
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
{
#endif
if (!counted)
{
*delete_rows = spider->conns[roop_count]->db_conn->affected_rows();
DBUG_PRINT("info", ("spider delete_rows = %llu", *delete_rows));
2013-06-27 13:18:48 +02:00
counted = TRUE;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
SPIDER_DB_RESULT *result;
if (spider_bit_is_set(spider->db_request_phase, roop_count))
{
spider_clear_bit(spider->db_request_phase, roop_count);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[roop_count];
request_key.next = NULL;
if ((result = conn->db_conn->use_result(&request_key, &error_num)))
{
if (!counted)
{
*delete_rows = conn->db_conn->affected_rows();
DBUG_PRINT("info", ("spider delete_rows = %llu", *delete_rows));
2013-06-27 13:18:48 +02:00
counted = TRUE;
}
result->free_result();
delete result;
} else {
if (!error_num)
{
error_num = spider_db_errorno(conn);
}
DBUG_RETURN(error_num);
}
}
#endif
#ifdef HA_CAN_BULK_ACCESS
}
#endif
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
int error_num2 = 0;
if (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
{
if ((error_num = spider->reset_sql_sql(SPIDER_SQL_TYPE_DELETE_SQL)))
error_num2 = error_num;
}
2014-03-24 20:29:52 +01:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
2013-06-27 13:18:48 +02:00
if (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
{
if ((error_num = spider->reset_hs_sql(SPIDER_SQL_TYPE_DELETE_HS)))
error_num2 = error_num;
if ((error_num = spider->reset_hs_keys(SPIDER_SQL_TYPE_DELETE_HS)))
error_num2 = error_num;
}
2014-03-24 20:29:52 +01:00
#endif
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num2);
}
#else
int spider_db_direct_delete(
ha_spider *spider,
TABLE *table,
ha_rows *delete_rows
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
bool counted = FALSE;
st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
DBUG_ENTER("spider_db_direct_delete");
spider_set_result_list_param(spider);
result_list->finish_flg = FALSE;
result_list->desc_flg = FALSE;
result_list->sorted = TRUE;
if (spider->active_index == MAX_KEY)
result_list->key_info = NULL;
else
result_list->key_info = &table->key_info[spider->active_index];
spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
result_list->limit_num =
result_list->internal_limit >= select_limit ?
select_limit : result_list->internal_limit;
result_list->internal_offset += offset_limit;
if (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
{
if (
(error_num = spider->append_delete_sql_part()) ||
(error_num = spider->append_from_sql_part(SPIDER_SQL_TYPE_DELETE_SQL))
) {
DBUG_RETURN(error_num);
}
spider->set_where_pos_sql(SPIDER_SQL_TYPE_DELETE_SQL);
if (
(error_num = spider->append_key_where_sql_part(
NULL,
NULL,
SPIDER_SQL_TYPE_DELETE_SQL)) ||
(error_num = spider->
append_key_order_for_direct_order_limit_with_alias_sql_part(
NULL, 0, SPIDER_SQL_TYPE_DELETE_SQL)) ||
(error_num = spider->append_limit_sql_part(
result_list->internal_offset, result_list->limit_num,
SPIDER_SQL_TYPE_DELETE_SQL))
) {
DBUG_RETURN(error_num);
}
}
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
DBUG_PRINT("info", ("spider exec sql"));
conn = spider->conns[roop_count];
sql_type = SPIDER_SQL_TYPE_DELETE_SQL;
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if ((error_num = dbton_hdl->set_sql_for_exec(sql_type, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
#ifdef HA_CAN_BULK_ACCESS
if (spider->is_bulk_access_clone)
{
spider->connection_ids[roop_count] = conn->connection_id;
spider_trx_add_bulk_access_conn(spider->trx, conn);
} else {
#endif
conn->need_mon = &spider->need_mons[roop_count];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (dbton_hdl->execute_sql(
sql_type,
conn,
-1,
&spider->need_mons[roop_count])
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
share->monitoring_flag[roop_count],
TRUE
);
}
DBUG_RETURN(error_num);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
if (!counted)
{
*delete_rows = spider->conns[roop_count]->db_conn->affected_rows();
DBUG_PRINT("info", ("spider delete_rows = %llu", *delete_rows));
counted = TRUE;
}
#ifdef HA_CAN_BULK_ACCESS
}
#endif
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
int error_num2 = 0;
if (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
{
if ((error_num = spider->reset_sql_sql(SPIDER_SQL_TYPE_DELETE_SQL)))
error_num2 = error_num;
}
DBUG_RETURN(error_num2);
}
#endif
2013-06-27 13:18:48 +02:00
#endif
int spider_db_delete_all_rows(
ha_spider *spider
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
DBUG_ENTER("spider_db_delete_all_rows");
if ((error_num = spider->append_delete_all_rows_sql_part(
SPIDER_SQL_TYPE_DELETE_SQL)))
DBUG_RETURN(error_num);
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
uint dbton_id = share->use_sql_dbton_ids[roop_count];
spider_db_handler *dbton_hdl = spider->dbton_handler[dbton_id];
conn = spider->conns[roop_count];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if ((error_num = dbton_hdl->set_sql_for_exec(
SPIDER_SQL_TYPE_DELETE_SQL, roop_count)))
{
DBUG_RETURN(error_num);
}
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
conn->need_mon = &spider->need_mons[roop_count];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (
(error_num = spider_db_set_names(spider, conn, roop_count)) ||
(
dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_DELETE_SQL,
conn,
-1,
&spider->need_mons[roop_count]) &&
(error_num = spider_db_errorno(conn))
)
) {
if (
error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
!conn->disable_reconnect
) {
/* retry */
if ((error_num = spider_db_ping(spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
if ((error_num = spider_db_set_names(spider, conn, roop_count)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
share);
if (dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_DELETE_SQL,
conn,
-1,
&spider->need_mons[roop_count])
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
} else {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
if ((error_num = spider->reset_sql_sql(SPIDER_SQL_TYPE_DELETE_SQL)))
DBUG_RETURN(error_num);
DBUG_RETURN(0);
}
int spider_db_disable_keys(
ha_spider *spider
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
spider_db_handler *dbton_hdl;
DBUG_ENTER("spider_db_disable_keys");
if (
spider_param_internal_optimize(spider->trx->thd,
share->internal_optimize) == 1
) {
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
dbton_hdl = spider->dbton_handler[conn->dbton_id];
if ((error_num = dbton_hdl->disable_keys(conn, roop_count)))
{
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
}
DBUG_RETURN(0);
}
int spider_db_enable_keys(
ha_spider *spider
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
spider_db_handler *dbton_hdl;
DBUG_ENTER("spider_db_enable_keys");
if (
spider_param_internal_optimize(spider->trx->thd,
share->internal_optimize) == 1
) {
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
dbton_hdl = spider->dbton_handler[conn->dbton_id];
if ((error_num = dbton_hdl->enable_keys(conn, roop_count)))
{
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
}
DBUG_RETURN(0);
}
int spider_db_check_table(
ha_spider *spider,
HA_CHECK_OPT* check_opt
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
spider_db_handler *dbton_hdl;
DBUG_ENTER("spider_db_check_table");
if (
spider_param_internal_optimize(spider->trx->thd,
share->internal_optimize) == 1
) {
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
dbton_hdl = spider->dbton_handler[conn->dbton_id];
if ((error_num = dbton_hdl->check_table(conn, roop_count, check_opt)))
{
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
}
DBUG_RETURN(0);
}
int spider_db_repair_table(
ha_spider *spider,
HA_CHECK_OPT* check_opt
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
spider_db_handler *dbton_hdl;
DBUG_ENTER("spider_db_repair_table");
if (
spider_param_internal_optimize(spider->trx->thd,
share->internal_optimize) == 1
) {
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
dbton_hdl = spider->dbton_handler[conn->dbton_id];
if ((error_num = dbton_hdl->repair_table(conn, roop_count, check_opt)))
{
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
}
DBUG_RETURN(0);
}
int spider_db_analyze_table(
ha_spider *spider
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
spider_db_handler *dbton_hdl;
DBUG_ENTER("spider_db_analyze_table");
if (
spider_param_internal_optimize(spider->trx->thd,
share->internal_optimize) == 1
) {
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
dbton_hdl = spider->dbton_handler[conn->dbton_id];
if ((error_num = dbton_hdl->analyze_table(conn, roop_count)))
{
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
}
DBUG_RETURN(0);
}
int spider_db_optimize_table(
ha_spider *spider
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
spider_db_handler *dbton_hdl;
DBUG_ENTER("spider_db_optimize_table");
if (
spider_param_internal_optimize(spider->trx->thd,
share->internal_optimize) == 1
) {
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
dbton_hdl = spider->dbton_handler[conn->dbton_id];
if ((error_num = dbton_hdl->optimize_table(conn, roop_count)))
{
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
}
DBUG_RETURN(0);
}
int spider_db_flush_tables(
ha_spider *spider,
bool lock
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
spider_db_handler *dbton_hdl;
DBUG_ENTER("spider_db_flush_tables");
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
dbton_hdl = spider->dbton_handler[conn->dbton_id];
if ((error_num = dbton_hdl->flush_tables(conn, roop_count, lock)))
{
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
DBUG_RETURN(0);
}
int spider_db_flush_logs(
ha_spider *spider
) {
int roop_count, error_num;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn;
spider_db_handler *dbton_hdl;
DBUG_ENTER("spider_db_flush_logs");
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
SPIDER_LINK_STATUS_RECOVERY);
roop_count < (int) share->link_count;
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
conn = spider->conns[roop_count];
dbton_hdl = spider->dbton_handler[conn->dbton_id];
if ((error_num = dbton_hdl->flush_logs(conn, roop_count)))
{
if (
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
error_num = spider_ping_table_mon_from_table(
spider->trx,
spider->trx->thd,
share,
roop_count,
2013-06-27 13:18:48 +02:00
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
spider->conn_link_idx[roop_count],
NULL,
0,
share->monitoring_kind[roop_count],
share->monitoring_limit[roop_count],
2015-10-28 23:34:53 +01:00
share->monitoring_flag[roop_count],
2013-06-27 13:18:48 +02:00
TRUE
);
}
DBUG_RETURN(error_num);
}
}
DBUG_RETURN(0);
}
/**
Find the field among the items in an expression tree.
@param item_list List of items of the expression.
@param item_count Number of items in the item list.
@param start_item Index of the first item to consider.
@param str String into which the expression is to be printed.
@param func_name Function or operator name.
@param func_name_length Length of function or operator name.
@return Pointer to the field in the item list if the list
contains only one field; NULL otherwise.
*/
Field *spider_db_find_field_in_item_list(
Item **item_list,
uint item_count,
uint start_item,
spider_string *str,
const char *func_name,
int func_name_length
) {
uint item_num;
Item *item;
Field *field = NULL;
DBUG_ENTER("spider_db_find_field_in_item_list");
if (str && func_name_length)
{
if (strncasecmp(func_name, ",", 1))
{
/* A known function or operator */
for (item_num = start_item; item_num < item_count; item_num++)
{
item = item_list[item_num];
if (item->type() == Item::FIELD_ITEM)
{
if (field)
{
/* Field is not relevant if there are multiple fields */
DBUG_RETURN(NULL);
}
field = ((Item_field *) item)->field;
}
}
}
}
DBUG_RETURN(field);
}
/**
Print an operand value within a statement generated for an expression.
@param item Operand value to print.
@param field Field related to the operand value.
@param spider Spider.
@param str String into which the value is to be printed.
@param alias Name related to the operand.
@param alias_length Length of the name.
@param dbton_id Spider Db/Table id.
@param use_fields Use fields or exchange fields.
@param fields Array of fields in the expression.
@return Error code.
*/
int spider_db_print_item_type(
Item *item,
Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
) {
2013-06-27 13:18:48 +02:00
DBUG_ENTER("spider_db_print_item_type");
DBUG_PRINT("info",("spider COND type=%d", item->type()));
if (item->type() == Item::REF_ITEM &&
((Item_ref*)item)->ref_type() == Item_ref::DIRECT_REF)
{
item= item->real_item();
DBUG_PRINT("info",("spider new COND type=%d", item->type()));
}
2013-06-27 13:18:48 +02:00
switch (item->type())
{
case Item::FUNC_ITEM:
DBUG_RETURN(spider_db_open_item_func((Item_func *) item, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
case Item::SUM_FUNC_ITEM:
DBUG_RETURN(spider_db_open_item_sum_func((Item_sum *)item, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
2013-09-16 20:22:54 +02:00
#endif
2013-06-27 13:18:48 +02:00
case Item::COND_ITEM:
DBUG_RETURN(spider_db_open_item_cond((Item_cond *) item, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
2013-06-27 13:18:48 +02:00
case Item::FIELD_ITEM:
DBUG_RETURN(spider_db_open_item_field((Item_field *) item, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
2013-06-27 13:18:48 +02:00
case Item::REF_ITEM:
DBUG_RETURN(spider_db_open_item_ref((Item_ref *) item, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
2013-06-27 13:18:48 +02:00
case Item::ROW_ITEM:
DBUG_RETURN(spider_db_open_item_row((Item_row *) item, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
#ifdef SPIDER_USE_CONST_ITEM_FOR_STRING_INT_REAL_DECIMAL_DATE_ITEM
case Item::CONST_ITEM:
{
switch (item->cmp_type()) {
case TIME_RESULT:
case STRING_RESULT:
DBUG_RETURN(spider_db_open_item_string(item, field, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
case INT_RESULT:
case REAL_RESULT:
case DECIMAL_RESULT:
DBUG_RETURN(spider_db_open_item_int(item, field, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
default:
DBUG_ASSERT(FALSE);
DBUG_RETURN(spider_db_print_item_type_default(item, spider, str));
}
}
#else
case Item::STRING_ITEM:
DBUG_RETURN(spider_db_open_item_string(item, field, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
case Item::INT_ITEM:
case Item::REAL_ITEM:
case Item::DECIMAL_ITEM:
DBUG_RETURN(spider_db_open_item_int(item, field, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
#endif
2013-06-27 13:18:48 +02:00
case Item::CACHE_ITEM:
DBUG_RETURN(spider_db_open_item_cache((Item_cache *) item, field, spider,
str, alias, alias_length, dbton_id, use_fields, fields));
2015-10-28 23:34:53 +01:00
case Item::INSERT_VALUE_ITEM:
DBUG_RETURN(spider_db_open_item_insert_value((Item_insert_value *) item,
field, spider, str, alias, alias_length, dbton_id, use_fields, fields));
2013-06-27 13:18:48 +02:00
case Item::SUBSELECT_ITEM:
case Item::TRIGGER_FIELD_ITEM:
2015-10-28 23:34:53 +01:00
#ifdef SPIDER_HAS_EXPR_CACHE_ITEM
case Item::EXPR_CACHE_ITEM:
#endif
2013-06-27 13:18:48 +02:00
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
default:
DBUG_RETURN(spider_db_print_item_type_default(item, spider, str));
}
DBUG_RETURN(0);
}
int spider_db_print_item_type_default(
Item *item,
ha_spider *spider,
spider_string *str
) {
DBUG_ENTER("spider_db_print_item_type_default");
THD *thd = spider->trx->thd;
SPIDER_SHARE *share = spider->share;
if (spider_param_skip_default_condition(thd,
share->skip_default_condition))
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
if (str)
{
if (spider->share->access_charset->cset == system_charset_info->cset)
{
#if MYSQL_VERSION_ID < 50500
item->print(str->get_str(), QT_IS);
#else
item->print(str->get_str(), QT_TO_SYSTEM_CHARSET);
#endif
} else {
item->print(str->get_str(), QT_ORDINARY);
}
str->mem_calc();
2013-06-27 13:18:48 +02:00
}
DBUG_RETURN(0);
}
int spider_db_open_item_cond(
Item_cond *item_cond,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
2013-06-27 13:18:48 +02:00
) {
int error_num = 0;
List_iterator_fast<Item> lif(*(item_cond->argument_list()));
Item *item;
char *func_name = NULL;
int func_name_length = 0, restart_pos = 0;
DBUG_ENTER("spider_db_open_item_cond");
if (str)
{
if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
}
restart_first:
if ((item = lif++))
{
if (str)
restart_pos = str->length();
if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
alias, alias_length, dbton_id, use_fields, fields)))
2013-06-27 13:18:48 +02:00
{
if (
str &&
error_num == ER_SPIDER_COND_SKIP_NUM &&
item_cond->functype() == Item_func::COND_AND_FUNC
) {
DBUG_PRINT("info",("spider COND skip"));
str->length(restart_pos);
goto restart_first;
}
DBUG_RETURN(error_num);
}
}
if (error_num)
DBUG_RETURN(error_num);
while ((item = lif++))
{
if (str)
{
restart_pos = str->length();
if (!func_name)
{
func_name = (char*) item_cond->func_name();
func_name_length = strlen(func_name);
}
if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
str->q_append(func_name, func_name_length);
str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
}
if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
alias, alias_length, dbton_id, use_fields, fields)))
2013-06-27 13:18:48 +02:00
{
if (
str &&
error_num == ER_SPIDER_COND_SKIP_NUM &&
item_cond->functype() == Item_func::COND_AND_FUNC
) {
DBUG_PRINT("info",("spider COND skip"));
str->length(restart_pos);
} else
DBUG_RETURN(error_num);
}
}
if (str)
{
if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
}
DBUG_RETURN(0);
}
int spider_db_open_item_func(
Item_func *item_func,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
2013-06-27 13:18:48 +02:00
) {
DBUG_ENTER("spider_db_open_item_func");
DBUG_RETURN(spider_dbton[dbton_id].db_util->open_item_func(
item_func, spider, str, alias, alias_length, use_fields, fields));
2013-06-27 13:18:48 +02:00
}
2013-09-16 20:22:54 +02:00
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
int spider_db_open_item_sum_func(
Item_sum *item_sum,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
2013-09-16 20:22:54 +02:00
) {
DBUG_ENTER("spider_db_open_item_func");
DBUG_RETURN(spider_dbton[dbton_id].db_util->open_item_sum_func(
item_sum, spider, str, alias, alias_length, use_fields, fields));
2013-09-16 20:22:54 +02:00
}
#endif
2013-06-27 13:18:48 +02:00
int spider_db_open_item_ident(
Item_ident *item_ident,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
2013-06-27 13:18:48 +02:00
) {
int error_num, field_name_length;
SPIDER_SHARE *share = spider->share;
DBUG_ENTER("spider_db_open_item_ident");
if (
item_ident->cached_field_index != NO_CACHED_FIELD_INDEX &&
item_ident->cached_table
) {
Field *field = item_ident->cached_table->table->field[
item_ident->cached_field_index];
DBUG_PRINT("info",("spider use cached_field_index"));
DBUG_PRINT("info",("spider const_table=%s",
field->table->const_table ? "TRUE" : "FALSE"));
if (field->table->const_table)
2013-06-27 13:18:48 +02:00
{
if (str)
{
String str_value;
String *tmp_str;
tmp_str = field->val_str(&str_value);
if (!tmp_str)
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 +
tmp_str->length() * 2))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->append_escape_string(tmp_str->ptr(), tmp_str->length());
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
}
} else {
if (!use_fields)
{
if (!(field = spider->field_exchange(field)))
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
if (str)
{
if ((error_num = share->dbton_share[dbton_id]->
append_column_name_with_alias(str, field->field_index,
alias, alias_length)))
DBUG_RETURN(error_num);
}
} else {
if (str)
{
SPIDER_TABLE_HOLDER *table= fields->find_table(field);
/* If table or table->spider is NULL the GBH creation
would have been skipped the first pass (see below). */
spider = table->spider;
share = spider->share;
if ((error_num = share->dbton_share[dbton_id]->
append_column_name_with_alias(str, field->field_index,
table->alias->ptr(), table->alias->length())))
DBUG_RETURN(error_num);
} else
{
SPIDER_TABLE_HOLDER *table= fields->find_table(field);
if (!table || !table->spider)
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
}
}
2013-06-27 13:18:48 +02:00
}
DBUG_RETURN(0);
}
if (str)
{
#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
if (item_ident->field_name.str)
field_name_length = item_ident->field_name.length;
#else
if (item_ident->field_name)
field_name_length = strlen(item_ident->field_name);
#endif
else
field_name_length = 0;
2013-06-27 13:18:48 +02:00
if (share->access_charset->cset == system_charset_info->cset)
{
if (str->reserve(alias_length +
field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
str->q_append(alias, alias_length);
#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
2013-06-27 13:18:48 +02:00
if ((error_num = spider_dbton[dbton_id].db_util->
append_escaped_name(str, item_ident->field_name.str,
field_name_length)))
#else
if ((error_num = spider_dbton[dbton_id].db_util->
append_escaped_name(str, item_ident->field_name, field_name_length)))
#endif
2013-06-27 13:18:48 +02:00
{
DBUG_RETURN(error_num);
}
} else {
if (str->reserve(alias_length))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(alias, alias_length);
#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
2013-06-27 13:18:48 +02:00
if ((error_num = spider_dbton[dbton_id].db_util->
append_escaped_name_with_charset(str, item_ident->field_name.str,
2013-06-27 13:18:48 +02:00
field_name_length, system_charset_info)))
#else
if ((error_num = spider_dbton[dbton_id].db_util->
append_escaped_name_with_charset(str, item_ident->field_name,
field_name_length, system_charset_info)))
#endif
2013-06-27 13:18:48 +02:00
{
DBUG_RETURN(error_num);
}
}
}
DBUG_RETURN(0);
}
int spider_db_open_item_field(
Item_field *item_field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
2013-06-27 13:18:48 +02:00
) {
int error_num;
Field *field = item_field->field;
SPIDER_SHARE *share = spider->share;
DBUG_ENTER("spider_db_open_item_field");
if (field)
2013-06-27 13:18:48 +02:00
{
DBUG_PRINT("info",("spider field=%p", field));
DBUG_PRINT("info",("spider db=%s", field->table->s->db.str));
DBUG_PRINT("info",("spider table_name=%s",
field->table->s->table_name.str));
DBUG_PRINT("info",("spider const_table=%s",
field->table->const_table ? "TRUE" : "FALSE"));
if (field->table->const_table)
2013-06-27 13:18:48 +02:00
{
if (str)
2013-06-27 13:18:48 +02:00
{
String str_value;
String *tmp_str;
tmp_str = field->val_str(&str_value);
if (!tmp_str)
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 +
tmp_str->length() * 2))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->append_escape_string(tmp_str->ptr(), tmp_str->length());
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
}
DBUG_RETURN(0);
} else {
DBUG_PRINT("info",("spider tmp_table=%u", field->table->s->tmp_table));
if (field->table->s->tmp_table != INTERNAL_TMP_TABLE)
{
if (!use_fields)
{
if (!(field = spider->field_exchange(field)))
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
if (str)
{
if ((error_num = share->dbton_share[dbton_id]->
append_column_name_with_alias(str, field->field_index,
alias, alias_length)))
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
} else {
if (str)
{
SPIDER_TABLE_HOLDER *table= fields->find_table(field);
/* If table or table->spider is NULL the GBH creation
would have been skipped the first pass (see below). */
spider = table->spider;
share = spider->share;
if ((error_num = share->dbton_share[dbton_id]->
append_column_name_with_alias(str, field->field_index,
table->alias->ptr(), table->alias->length())))
DBUG_RETURN(error_num);
} else
{
SPIDER_TABLE_HOLDER *table= fields->find_table(field);
if (!table || !table->spider)
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
}
DBUG_RETURN(0);
}
2013-06-27 13:18:48 +02:00
}
}
}
DBUG_RETURN(spider_db_open_item_ident(
(Item_ident *) item_field, spider, str, alias, alias_length, dbton_id,
use_fields, fields));
2013-06-27 13:18:48 +02:00
}
int spider_db_open_item_ref(
Item_ref *item_ref,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
2013-06-27 13:18:48 +02:00
) {
int error_num;
DBUG_ENTER("spider_db_open_item_ref");
if (item_ref->ref)
{
#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
2013-06-27 13:18:48 +02:00
if (
(*(item_ref->ref))->type() != Item::CACHE_ITEM &&
item_ref->ref_type() != Item_ref::VIEW_REF &&
!item_ref->table_name &&
Changing field::field_name and Item::name to LEX_CSTRING Benefits of this patch: - Removed a lot of calls to strlen(), especially for field_string - Strings generated by parser are now const strings, less chance of accidently changing a string - Removed a lot of calls with LEX_STRING as parameter (changed to pointer) - More uniform code - Item::name_length was not kept up to date. Now fixed - Several bugs found and fixed (Access to null pointers, access of freed memory, wrong arguments to printf like functions) - Removed a lot of casts from (const char*) to (char*) Changes: - This caused some ABI changes - lex_string_set now uses LEX_CSTRING - Some fucntions are now taking const char* instead of char* - Create_field::change and after changed to LEX_CSTRING - handler::connect_string, comment and engine_name() changed to LEX_CSTRING - Checked printf() related calls to find bugs. Found and fixed several errors in old code. - A lot of changes from LEX_STRING to LEX_CSTRING, especially related to parsing and events. - Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING* - Some changes for char* to const char* - Added printf argument checking for my_snprintf() - Introduced null_clex_str, star_clex_string, temp_lex_str to simplify code - Added item_empty_name and item_used_name to be able to distingush between items that was given an empty name and items that was not given a name This is used in sql_yacc.yy to know when to give an item a name. - select table_name."*' is not anymore same as table_name.* - removed not used function Item::rename() - Added comparision of item->name_length before some calls to my_strcasecmp() to speed up comparison - Moved Item_sp_variable::make_field() from item.h to item.cc - Some minimal code changes to avoid copying to const char * - Fixed wrong error message in wsrep_mysql_parse() - Fixed wrong code in find_field_in_natural_join() where real_item() was set when it shouldn't - ER_ERROR_ON_RENAME was used with extra arguments. - Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already give the error. TODO: - Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c - Change code to not modify LEX_CSTRING for database name (as part of lower_case_table_names)
2017-04-23 18:39:57 +02:00
item_ref->name.str &&
2013-06-27 13:18:48 +02:00
item_ref->alias_name_used
)
#else
if (
(*(item_ref->ref))->type() != Item::CACHE_ITEM &&
item_ref->ref_type() != Item_ref::VIEW_REF &&
!item_ref->table_name &&
item_ref->name &&
item_ref->alias_name_used
)
#endif
{
2013-06-27 13:18:48 +02:00
if (str)
{
#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
Changing field::field_name and Item::name to LEX_CSTRING Benefits of this patch: - Removed a lot of calls to strlen(), especially for field_string - Strings generated by parser are now const strings, less chance of accidently changing a string - Removed a lot of calls with LEX_STRING as parameter (changed to pointer) - More uniform code - Item::name_length was not kept up to date. Now fixed - Several bugs found and fixed (Access to null pointers, access of freed memory, wrong arguments to printf like functions) - Removed a lot of casts from (const char*) to (char*) Changes: - This caused some ABI changes - lex_string_set now uses LEX_CSTRING - Some fucntions are now taking const char* instead of char* - Create_field::change and after changed to LEX_CSTRING - handler::connect_string, comment and engine_name() changed to LEX_CSTRING - Checked printf() related calls to find bugs. Found and fixed several errors in old code. - A lot of changes from LEX_STRING to LEX_CSTRING, especially related to parsing and events. - Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING* - Some changes for char* to const char* - Added printf argument checking for my_snprintf() - Introduced null_clex_str, star_clex_string, temp_lex_str to simplify code - Added item_empty_name and item_used_name to be able to distingush between items that was given an empty name and items that was not given a name This is used in sql_yacc.yy to know when to give an item a name. - select table_name."*' is not anymore same as table_name.* - removed not used function Item::rename() - Added comparision of item->name_length before some calls to my_strcasecmp() to speed up comparison - Moved Item_sp_variable::make_field() from item.h to item.cc - Some minimal code changes to avoid copying to const char * - Fixed wrong error message in wsrep_mysql_parse() - Fixed wrong code in find_field_in_natural_join() where real_item() was set when it shouldn't - ER_ERROR_ON_RENAME was used with extra arguments. - Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already give the error. TODO: - Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c - Change code to not modify LEX_CSTRING for database name (as part of lower_case_table_names)
2017-04-23 18:39:57 +02:00
uint length = item_ref->name.length;
#else
uint length = strlen(item_ref->name);
#endif
2013-06-27 13:18:48 +02:00
if (str->reserve(length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
2013-06-27 13:18:48 +02:00
if ((error_num = spider_dbton[dbton_id].db_util->
Changing field::field_name and Item::name to LEX_CSTRING Benefits of this patch: - Removed a lot of calls to strlen(), especially for field_string - Strings generated by parser are now const strings, less chance of accidently changing a string - Removed a lot of calls with LEX_STRING as parameter (changed to pointer) - More uniform code - Item::name_length was not kept up to date. Now fixed - Several bugs found and fixed (Access to null pointers, access of freed memory, wrong arguments to printf like functions) - Removed a lot of casts from (const char*) to (char*) Changes: - This caused some ABI changes - lex_string_set now uses LEX_CSTRING - Some fucntions are now taking const char* instead of char* - Create_field::change and after changed to LEX_CSTRING - handler::connect_string, comment and engine_name() changed to LEX_CSTRING - Checked printf() related calls to find bugs. Found and fixed several errors in old code. - A lot of changes from LEX_STRING to LEX_CSTRING, especially related to parsing and events. - Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING* - Some changes for char* to const char* - Added printf argument checking for my_snprintf() - Introduced null_clex_str, star_clex_string, temp_lex_str to simplify code - Added item_empty_name and item_used_name to be able to distingush between items that was given an empty name and items that was not given a name This is used in sql_yacc.yy to know when to give an item a name. - select table_name."*' is not anymore same as table_name.* - removed not used function Item::rename() - Added comparision of item->name_length before some calls to my_strcasecmp() to speed up comparison - Moved Item_sp_variable::make_field() from item.h to item.cc - Some minimal code changes to avoid copying to const char * - Fixed wrong error message in wsrep_mysql_parse() - Fixed wrong code in find_field_in_natural_join() where real_item() was set when it shouldn't - ER_ERROR_ON_RENAME was used with extra arguments. - Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already give the error. TODO: - Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c - Change code to not modify LEX_CSTRING for database name (as part of lower_case_table_names)
2017-04-23 18:39:57 +02:00
append_name(str, item_ref->name.str, length)))
#else
if ((error_num = spider_dbton[dbton_id].db_util->
append_name(str, item_ref->name, length)))
#endif
2013-06-27 13:18:48 +02:00
{
DBUG_RETURN(error_num);
}
}
DBUG_RETURN(0);
}
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); // MDEV-25116
2013-06-27 13:18:48 +02:00
}
DBUG_RETURN(spider_db_open_item_ident((Item_ident *) item_ref, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
2013-06-27 13:18:48 +02:00
}
int spider_db_open_item_row(
Item_row *item_row,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
2013-06-27 13:18:48 +02:00
) {
int error_num;
uint roop_count, cols = item_row->cols() - 1;
Item *item;
DBUG_ENTER("spider_db_open_item_row");
if (str)
{
if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
}
for (roop_count = 0; roop_count < cols; roop_count++)
{
item = item_row->element_index(roop_count);
if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
alias, alias_length, dbton_id, use_fields, fields)))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
if (str)
{
if (str->reserve(SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
}
item = item_row->element_index(roop_count);
if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
alias, alias_length, dbton_id, use_fields, fields)))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
if (str)
{
if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
SPIDER_SQL_CLOSE_PAREN_LEN);
}
DBUG_RETURN(0);
}
/**
Print a string value within a generated statement.
@param item String value to print.
@param field Field related to the string value.
@param spider Spider.
@param str String into which the value is to be printed.
@param alias Name related to the string value.
@param alias_length Length of the name.
@param dbton_id Spider Db/Table id.
@param use_fields Use fields or exchange fields.
@param fields Array of fields in an expression containing
the string value.
@return Error code.
*/
int spider_db_open_item_string(
Item *item,
Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
) {
int error_num = 0;
2013-06-27 13:18:48 +02:00
DBUG_ENTER("spider_db_open_item_string");
2013-06-27 13:18:48 +02:00
if (str)
{
THD *thd = NULL;
TABLE *table;
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *saved_map;
Time_zone *saved_time_zone;
String str_value;
2013-06-27 13:18:48 +02:00
char tmp_buf[MAX_FIELD_WIDTH];
spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
String *tmp_str2;
tmp_str.init_calc_mem(SPD_MID_DB_OPEN_ITEM_STRING_1);
2015-02-19 16:41:26 +01:00
if (!(tmp_str2 = item->val_str(tmp_str.get_str())))
{
if (str->reserve(SPIDER_SQL_NULL_LEN))
{
error_num = HA_ERR_OUT_OF_MEM;
goto end;
}
2015-02-19 16:41:26 +01:00
str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
} else {
if (
field &&
field->type() == FIELD_TYPE_TIMESTAMP &&
field->table->in_use->variables.time_zone != UTC
) {
/*
Store the string value in the field. This is necessary
when the statement contains more than one value for the
same field.
*/
table = field->table;
thd = table->in_use;
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
saved_map = dbug_tmp_use_all_columns(table, &table->write_set);
item->save_in_field(field, FALSE);
saved_time_zone = thd->variables.time_zone;
thd->variables.time_zone = UTC;
/* Retrieve the stored value converted to UTC */
tmp_str2 = field->val_str(&str_value);
if (!tmp_str2)
{
error_num = HA_ERR_OUT_OF_MEM;
goto end;
}
}
if (str->charset() != tmp_str2->charset())
{
if ((error_num = spider_db_append_charset_name_before_string(str,
tmp_str2->charset())))
{
goto end;
}
}
2015-02-19 16:41:26 +01:00
if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 +
tmp_str2->length() * 2))
{
error_num = HA_ERR_OUT_OF_MEM;
goto end;
}
if (!thd)
tmp_str.mem_calc();
2015-02-19 16:41:26 +01:00
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->append_escape_string(tmp_str2->ptr(), tmp_str2->length(),
tmp_str2->charset());
if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
{
error_num = HA_ERR_OUT_OF_MEM;
goto end;
}
2015-02-19 16:41:26 +01:00
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
}
end:
if (thd)
{
thd->variables.time_zone = saved_time_zone;
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, saved_map);
}
2013-06-27 13:18:48 +02:00
}
DBUG_RETURN(error_num);
2013-06-27 13:18:48 +02:00
}
/**
Print an integer value within a generated statement.
@param item Integer value to print.
@param field Field related to the integer value.
@param spider Spider.
@param str String into which the value is to be printed.
@param alias Name related to the integer value.
@param alias_length Length of the name.
@param dbton_id Spider Db/Table id.
@param use_fields Use fields or exchange fields.
@param fields Array of fields in an expression containing
the integer value.
@return Error code.
*/
int spider_db_open_item_int(
Item *item,
Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
) {
int error_num = 0;
2013-06-27 13:18:48 +02:00
DBUG_ENTER("spider_db_open_item_int");
2013-06-27 13:18:48 +02:00
if (str)
{
THD *thd = NULL;
TABLE *table;
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *saved_map;
Time_zone *saved_time_zone;
String str_value;
bool print_quoted_string;
2013-06-27 13:18:48 +02:00
char tmp_buf[MAX_FIELD_WIDTH];
spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
2014-03-24 21:10:40 +01:00
String *tmp_str2;
tmp_str.init_calc_mem(SPD_MID_DB_OPEN_ITEM_INT_1);
2014-03-24 21:10:40 +01:00
if (!(tmp_str2 = item->val_str(tmp_str.get_str())))
{
error_num = HA_ERR_OUT_OF_MEM;
goto end;
}
2013-06-27 13:18:48 +02:00
tmp_str.mem_calc();
if (
field &&
field->type() == FIELD_TYPE_TIMESTAMP &&
field->table->in_use->variables.time_zone != UTC
) {
/*
Store the int value in the field. This is necessary
when the statement contains more than one value for the
same field.
*/
table = field->table;
thd = table->in_use;
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
saved_map = dbug_tmp_use_all_columns(table, &table->write_set);
item->save_in_field(field, FALSE);
saved_time_zone = thd->variables.time_zone;
thd->variables.time_zone = UTC;
print_quoted_string = TRUE;
} else {
#ifdef SPIDER_ITEM_HAS_CMP_TYPE
DBUG_PRINT("info",("spider cmp_type=%u", item->cmp_type()));
if (item->cmp_type() == TIME_RESULT)
print_quoted_string = TRUE;
else
#endif
print_quoted_string = FALSE;
}
if (print_quoted_string)
{
if (thd)
{
/* Retrieve the stored value converted to UTC */
tmp_str2 = field->val_str(&str_value);
if (!tmp_str2)
{
error_num = HA_ERR_OUT_OF_MEM;
goto end;
}
}
2014-03-24 21:10:40 +01:00
if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + tmp_str2->length()))
{
error_num = HA_ERR_OUT_OF_MEM;
goto end;
}
2014-03-24 21:10:40 +01:00
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->append(*tmp_str2);
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
} else {
2014-03-24 21:10:40 +01:00
if (str->append(*tmp_str2))
error_num = HA_ERR_OUT_OF_MEM;
}
end:
if (thd)
{
thd->variables.time_zone = saved_time_zone;
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, saved_map);
2014-03-24 21:10:40 +01:00
}
2013-06-27 13:18:48 +02:00
}
DBUG_RETURN(error_num);
2013-06-27 13:18:48 +02:00
}
/**
Print a cached value within a generated statement.
@param item Cached value to print.
@param field Field related to the cached value.
@param spider Spider.
@param str String into which the value is to be printed.
@param alias Name related to the cached value.
@param alias_length Length of the name.
@param dbton_id Spider Db/Table id.
@param use_fields Use fields or exchange fields.
@param fields Array of fields in the expression containing
the cached value.
@return Error code.
*/
int spider_db_open_item_cache(
Item_cache *item_cache,
Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
) {
2013-06-27 13:18:48 +02:00
DBUG_ENTER("spider_db_open_item_cache");
if (!item_cache->const_item())
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
2014-03-24 21:02:59 +01:00
DBUG_PRINT("info",("spider result_type=%u", item_cache->result_type()));
2013-06-27 13:18:48 +02:00
switch (item_cache->result_type())
{
case STRING_RESULT:
DBUG_RETURN(spider_db_open_item_string(item_cache, field, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
2013-06-27 13:18:48 +02:00
case ROW_RESULT:
{
int error_num;
Item_cache_row *item_cache_row = (Item_cache_row *) item_cache;
uint item_count = item_cache_row->cols() - 1, roop_count;
if (str)
{
if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
}
for (roop_count = 0; roop_count < item_count; ++roop_count)
{
if ((error_num = spider_db_open_item_cache(
(Item_cache *) item_cache_row->element_index(roop_count), NULL,
spider, str, alias, alias_length, dbton_id, use_fields, fields
))) {
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
if (str)
{
if (str->reserve(SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
}
if ((error_num = spider_db_open_item_cache(
(Item_cache *) item_cache_row->element_index(roop_count), NULL,
spider, str, alias, alias_length, dbton_id, use_fields, fields
))) {
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
if (str)
{
if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
SPIDER_SQL_CLOSE_PAREN_LEN);
}
}
DBUG_RETURN(0);
case REAL_RESULT:
case INT_RESULT:
case DECIMAL_RESULT:
default:
break;
}
DBUG_RETURN(spider_db_open_item_int(item_cache, field, spider, str,
alias, alias_length, dbton_id, use_fields, fields));
2013-06-27 13:18:48 +02:00
}
/**
Print an INSERT value within a generated INSERT statement.
@param item INSERT value to print.
@param field Field related to the INSERT value.
@param spider Spider.
@param str String into which the value is to be printed.
@param alias Name related to the INSERT value.
@param alias_length Length of the name.
@param dbton_id Spider Db/Table id.
@param use_fields Use fields or exchange fields.
@param fields Array of fields in the expression.
@return Error code.
*/
int spider_db_open_item_insert_value(
Item_insert_value *item_insert_value,
Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
) {
2015-10-28 23:34:53 +01:00
int error_num;
DBUG_ENTER("spider_db_open_item_insert_value");
2015-10-28 23:34:53 +01:00
if (item_insert_value->arg)
{
if (str)
{
if (str->reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
}
if ((error_num = spider_db_print_item_type(item_insert_value->arg, field,
spider, str, alias, alias_length, dbton_id, use_fields, fields)))
2015-10-28 23:34:53 +01:00
DBUG_RETURN(error_num);
if (str)
{
if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
}
}
2015-10-28 23:34:53 +01:00
DBUG_RETURN(0);
}
2013-06-27 13:18:48 +02:00
int spider_db_append_condition(
ha_spider *spider,
const char *alias,
uint alias_length,
bool test_flg
) {
int error_num;
DBUG_ENTER("spider_db_append_condition");
if (!test_flg)
{
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
if ((error_num = spider->append_condition_sql_part(
alias, alias_length, SPIDER_SQL_TYPE_SELECT_SQL, FALSE)))
DBUG_RETURN(error_num);
}
if (spider->sql_kinds & SPIDER_SQL_KIND_HANDLER)
{
if ((error_num = spider->append_condition_sql_part(
alias, alias_length, SPIDER_SQL_TYPE_HANDLER, FALSE)))
DBUG_RETURN(error_num);
}
} else {
if (spider->cond_check)
DBUG_RETURN(spider->cond_check_error);
spider->cond_check = TRUE;
if ((spider->cond_check_error = spider->append_condition_sql_part(
NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL, TRUE)))
DBUG_RETURN(spider->cond_check_error);
}
DBUG_RETURN(0);
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
int spider_db_append_update_columns(
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
uint dbton_id,
bool use_fields,
spider_fields *fields
2013-06-27 13:18:48 +02:00
) {
int error_num;
2015-10-28 23:34:53 +01:00
bool add_comma = FALSE;
2013-06-27 13:18:48 +02:00
List_iterator_fast<Item> fi(*spider->direct_update_fields),
vi(*spider->direct_update_values);
Item *field, *value;
DBUG_ENTER("spider_db_append_update_columns");
while ((field = fi++))
{
value = vi++;
if ((error_num = spider_db_print_item_type(
(Item *) field, NULL, spider, str, alias, alias_length, dbton_id,
use_fields, fields)))
2013-06-27 13:18:48 +02:00
{
if (
error_num == ER_SPIDER_COND_SKIP_NUM &&
field->type() == Item::FIELD_ITEM &&
((Item_field *) field)->field
2015-10-28 23:34:53 +01:00
) {
DBUG_PRINT("info",("spider no match field(ex. vp child table)"));
2013-06-27 13:18:48 +02:00
continue;
2015-10-28 23:34:53 +01:00
}
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
if (str)
{
if (str->reserve(SPIDER_SQL_EQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
}
if ((error_num = spider_db_print_item_type(
(Item *) value, ((Item_field *) field)->field, spider, str,
alias, alias_length, dbton_id, use_fields, fields)))
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
if (str)
{
if (str->reserve(SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
2015-10-28 23:34:53 +01:00
add_comma = TRUE;
2013-06-27 13:18:48 +02:00
}
}
2015-10-28 23:34:53 +01:00
if (str && add_comma)
2013-06-27 13:18:48 +02:00
str->length(str->length() - SPIDER_SQL_COMMA_LEN);
DBUG_RETURN(0);
}
#endif
uint spider_db_check_ft_idx(
Item_func *item_func,
ha_spider *spider
) {
uint roop_count, roop_count2, part_num;
uint item_count = item_func->argument_count();
Item **item_list = item_func->arguments();
Item_field *item_field;
Field *field;
TABLE *table = spider->get_table();
TABLE_SHARE *table_share = table->s;
KEY *key_info;
KEY_PART_INFO *key_part;
bool match1, match2;
DBUG_ENTER("spider_db_check_ft_idx");
for (roop_count = 0; roop_count < table_share->keys; roop_count++)
{
key_info = &table->key_info[roop_count];
if (
key_info->algorithm == HA_KEY_ALG_FULLTEXT &&
2013-08-24 11:37:49 +02:00
item_count - 1 == spider_user_defined_key_parts(key_info)
2013-06-27 13:18:48 +02:00
) {
match1 = TRUE;
for (roop_count2 = 1; roop_count2 < item_count; roop_count2++)
{
item_field = (Item_field *) item_list[roop_count2];
field = item_field->field;
if (!(field = spider->field_exchange(field)))
DBUG_RETURN(MAX_KEY);
match2 = FALSE;
for (key_part = key_info->key_part, part_num = 0;
2013-08-24 11:37:49 +02:00
part_num < spider_user_defined_key_parts(key_info);
key_part++, part_num++)
2013-06-27 13:18:48 +02:00
{
if (key_part->field == field)
{
match2 = TRUE;
break;
}
}
if (!match2)
{
match1 = FALSE;
break;
}
}
if (match1)
DBUG_RETURN(roop_count);
}
}
DBUG_RETURN(MAX_KEY);
}
int spider_db_udf_fetch_row(
SPIDER_TRX *trx,
Field *field,
SPIDER_DB_ROW *row
) {
DBUG_ENTER("spider_db_udf_fetch_row");
DBUG_RETURN(row->store_to_field(field, trx->udf_access_charset));
DBUG_RETURN(0);
}
int spider_db_udf_fetch_table(
SPIDER_TRX *trx,
SPIDER_CONN *conn,
TABLE *table,
SPIDER_DB_RESULT *result,
uint set_on,
uint set_off
) {
int error_num;
SPIDER_DB_ROW *row = NULL;
Field **field;
uint roop_count;
DBUG_ENTER("spider_db_udf_fetch_table");
if (!(row = result->fetch_row()))
DBUG_RETURN(HA_ERR_END_OF_FILE);
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
2013-06-27 13:18:48 +02:00
#endif
for (
roop_count = 0,
field = table->field;
roop_count < set_on;
roop_count++,
field++
) {
if ((error_num =
spider_db_udf_fetch_row(trx, *field, row)))
{
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, tmp_map);
2013-06-27 13:18:48 +02:00
#endif
DBUG_RETURN(error_num);
}
row->next();
}
for (; roop_count < set_off; roop_count++, field++)
(*field)->set_default();
#ifndef DBUG_OFF
MDEV-17556 Assertion `bitmap_is_set_all(&table->s->all_set)' failed The assertion failed in handler::ha_reset upon SELECT under READ UNCOMMITTED from table with index on virtual column. This was the debug-only failure, though the problem is mush wider: * MY_BITMAP is a structure containing my_bitmap_map, the latter is a raw bitmap. * read_set, write_set and vcol_set of TABLE are the pointers to MY_BITMAP * The rest of MY_BITMAPs are stored in TABLE and TABLE_SHARE * The pointers to the stored MY_BITMAPs, like orig_read_set etc, and sometimes all_set and tmp_set, are assigned to the pointers. * Sometimes tmp_use_all_columns is used to substitute the raw bitmap directly with all_set.bitmap * Sometimes even bitmaps are directly modified, like in TABLE::update_virtual_field(): bitmap_clear_all(&tmp_set) is called. The last three bullets in the list, when used together (which is mostly always) make the program flow cumbersome and impossible to follow, notwithstanding the errors they cause, like this MDEV-17556, where tmp_set pointer was assigned to read_set, write_set and vcol_set, then its bitmap was substituted with all_set.bitmap by dbug_tmp_use_all_columns() call, and then bitmap_clear_all(&tmp_set) was applied to all this. To untangle this knot, the rule should be applied: * Never substitute bitmaps! This patch is about this. orig_*, all_set bitmaps are never substituted already. This patch changes the following function prototypes: * tmp_use_all_columns, dbug_tmp_use_all_columns to accept MY_BITMAP** and to return MY_BITMAP * instead of my_bitmap_map* * tmp_restore_column_map, dbug_tmp_restore_column_maps to accept MY_BITMAP* instead of my_bitmap_map* These functions now will substitute read_set/write_set/vcol_set directly, and won't touch underlying bitmaps.
2020-12-29 04:38:16 +01:00
dbug_tmp_restore_column_map(&table->write_set, tmp_map);
2013-06-27 13:18:48 +02:00
#endif
table->status = 0;
DBUG_RETURN(0);
}
int spider_db_udf_direct_sql_connect(
const SPIDER_DIRECT_SQL *direct_sql,
SPIDER_CONN *conn
) {
int error_num, connect_retry_count;
THD* thd = current_thd;
longlong connect_retry_interval;
DBUG_ENTER("spider_db_udf_direct_sql_connect");
if (thd)
{
conn->connect_timeout = spider_param_connect_timeout(thd,
direct_sql->connect_timeout);
conn->net_read_timeout = spider_param_net_read_timeout(thd,
direct_sql->net_read_timeout);
conn->net_write_timeout = spider_param_net_write_timeout(thd,
direct_sql->net_write_timeout);
connect_retry_interval = spider_param_connect_retry_interval(thd);
connect_retry_count = spider_param_connect_retry_count(thd);
} else {
conn->connect_timeout = spider_param_connect_timeout(NULL,
direct_sql->connect_timeout);
conn->net_read_timeout = spider_param_net_read_timeout(NULL,
direct_sql->net_read_timeout);
conn->net_write_timeout = spider_param_net_write_timeout(NULL,
direct_sql->net_write_timeout);
connect_retry_interval = spider_param_connect_retry_interval(NULL);
connect_retry_count = spider_param_connect_retry_count(NULL);
}
DBUG_PRINT("info",("spider connect_timeout=%u", conn->connect_timeout));
DBUG_PRINT("info",("spider net_read_timeout=%u", conn->net_read_timeout));
DBUG_PRINT("info",("spider net_write_timeout=%u", conn->net_write_timeout));
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (direct_sql->access_mode == 0)
{
#endif
if ((error_num = spider_reset_conn_setted_parameter(conn, thd)))
DBUG_RETURN(error_num);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
if (conn->dbton_id == SPIDER_DBTON_SIZE)
{
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
#endif
my_printf_error(
ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM,
ER_SPIDER_SQL_WRAPPER_IS_INVALID_STR,
MYF(0), conn->tgt_wrapper);
DBUG_RETURN(ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
my_printf_error(
ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM,
ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR,
MYF(0), conn->tgt_wrapper);
DBUG_RETURN(ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM);
}
#endif
}
/*
if (!(conn->db_conn = spider_dbton[conn->dbton_id].create_db_conn(conn)))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
*/
if ((error_num = conn->db_conn->connect(
direct_sql->tgt_host,
direct_sql->tgt_username,
direct_sql->tgt_password,
direct_sql->tgt_port,
direct_sql->tgt_socket,
direct_sql->server_name,
connect_retry_count, connect_retry_interval)))
{
DBUG_RETURN(error_num);
}
++conn->connection_id;
DBUG_RETURN(0);
}
int spider_db_udf_direct_sql_ping(
SPIDER_DIRECT_SQL *direct_sql
) {
int error_num;
SPIDER_CONN *conn = direct_sql->conn;
DBUG_ENTER("spider_db_udf_direct_sql_ping");
if (conn->server_lost)
{
if ((error_num = spider_db_udf_direct_sql_connect(direct_sql, conn)))
DBUG_RETURN(error_num);
conn->server_lost = FALSE;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (direct_sql->access_mode == 0)
{
#endif
if ((error_num = conn->db_conn->ping()))
{
spider_db_disconnect(conn);
if ((error_num = spider_db_udf_direct_sql_connect(direct_sql, conn)))
{
DBUG_PRINT("info", ("spider conn=%p SERVER_LOST", conn));
conn->server_lost = TRUE;
DBUG_RETURN(error_num);
}
if((error_num = conn->db_conn->ping()))
{
spider_db_disconnect(conn);
DBUG_PRINT("info", ("spider conn=%p SERVER_LOST", conn));
conn->server_lost = TRUE;
DBUG_RETURN(error_num);
}
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
conn->ping_time = (time_t) time((time_t*) 0);
DBUG_RETURN(0);
}
int spider_db_udf_direct_sql(
SPIDER_DIRECT_SQL *direct_sql
) {
int error_num = 0, status = 0, roop_count = 0, need_mon = 0;
uint udf_table_mutex_index, field_num, set_on, set_off;
long long roop_count2;
bool end_of_file;
SPIDER_TRX *trx = direct_sql->trx;
THD *thd = trx->thd, *c_thd = current_thd;
SPIDER_CONN *conn = direct_sql->conn;
SPIDER_DB_RESULT *result = NULL;
TABLE *table;
int bulk_insert_rows = (int) spider_param_udf_ds_bulk_insert_rows(thd,
direct_sql->bulk_insert_rows);
int table_loop_mode = spider_param_udf_ds_table_loop_mode(thd,
direct_sql->table_loop_mode);
double ping_interval_at_trx_start =
spider_param_ping_interval_at_trx_start(thd);
time_t tmp_time = (time_t) time((time_t*) 0);
bool need_trx_end, need_all_commit, insert_start = FALSE;
#if MYSQL_VERSION_ID < 50500
#else
enum_sql_command sql_command_backup;
#endif
DBUG_ENTER("spider_db_udf_direct_sql");
#if MYSQL_VERSION_ID < 50500
#else
if (direct_sql->real_table_used)
{
if (spider_sys_open_tables(c_thd, &direct_sql->table_list_first,
&direct_sql->open_tables_backup))
{
direct_sql->real_table_used = FALSE;
DBUG_RETURN(my_errno);
}
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
{
if (!spider_bit_is_set(direct_sql->real_table_bitmap, roop_count))
continue;
direct_sql->tables[roop_count] =
direct_sql->table_list[roop_count].table;
}
direct_sql->open_tables_thd = c_thd;
roop_count = 0;
}
#endif
if (c_thd != thd)
{
need_all_commit = TRUE;
need_trx_end = TRUE;
} else {
need_all_commit = FALSE;
#if MYSQL_VERSION_ID < 50500
#else
if (direct_sql->real_table_used)
{
need_trx_end = TRUE;
} else {
#endif
if (c_thd->transaction.stmt.ha_list)
need_trx_end = FALSE;
else
need_trx_end = TRUE;
#if MYSQL_VERSION_ID < 50500
#else
}
#endif
}
if (!conn->disable_reconnect)
{
if (
(
conn->server_lost ||
difftime(tmp_time, conn->ping_time) >= ping_interval_at_trx_start
) &&
(error_num = spider_db_udf_direct_sql_ping(direct_sql))
)
DBUG_RETURN(error_num);
} else if (conn->server_lost)
{
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
}
#if MYSQL_VERSION_ID < 50500
#else
sql_command_backup = c_thd->lex->sql_command;
c_thd->lex->sql_command = SQLCOM_INSERT;
#endif
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2013-06-27 13:18:48 +02:00
conn->need_mon = &need_mon;
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
2013-06-27 13:18:48 +02:00
if (
!(error_num = spider_db_udf_direct_sql_set_names(direct_sql, trx, conn)) &&
!(error_num = spider_db_udf_direct_sql_select_db(direct_sql, conn))
) {
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (direct_sql->access_mode != 0)
{
st_spider_db_request_key request_key;
request_key.spider_thread_id = direct_sql->trx->spider_thread_id;
request_key.query_id = direct_sql->trx->thd->query_id;
request_key.handler = direct_sql;
request_key.request_id = 1;
request_key.next = NULL;
if ((error_num = conn->db_conn->append_sql(
direct_sql->sql, direct_sql->sql_length, &request_key)))
{
#if MYSQL_VERSION_ID < 50500
#else
c_thd->lex->sql_command = sql_command_backup;
#endif
DBUG_RETURN(error_num);
}
}
#endif
spider_conn_set_timeout_from_direct_sql(conn, thd, direct_sql);
if (spider_db_query(
conn,
direct_sql->sql,
direct_sql->sql_length,
-1,
&need_mon)
) {
error_num = spider_db_errorno(conn);
if (error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM)
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
} else {
DBUG_PRINT("info",("spider conn=%p", conn));
if (!direct_sql->table_count)
roop_count = -1;
do {
if (roop_count == direct_sql->table_count)
{
if (table_loop_mode == 1)
roop_count--;
else if (table_loop_mode == 2)
roop_count = 0;
else
roop_count = -1;
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = direct_sql->trx->spider_thread_id;
request_key.query_id = direct_sql->trx->thd->query_id;
request_key.handler = direct_sql;
request_key.request_id = 1;
request_key.next = NULL;
if ((result = conn->db_conn->use_result(&request_key, &error_num)))
{
end_of_file = FALSE;
if (roop_count >= 0)
{
while (!error_num && !end_of_file)
{
udf_table_mutex_index = spider_udf_calc_hash(
direct_sql->db_names[roop_count],
spider_param_udf_table_lock_mutex_count());
udf_table_mutex_index += spider_udf_calc_hash(
direct_sql->table_names[roop_count],
spider_param_udf_table_lock_mutex_count());
udf_table_mutex_index %=
spider_param_udf_table_lock_mutex_count();
pthread_mutex_lock(
&trx->udf_table_mutexes[udf_table_mutex_index]);
table = direct_sql->tables[roop_count];
table->in_use = c_thd;
memset((uchar *) table->null_flags, ~(uchar) 0,
sizeof(uchar) * table->s->null_bytes);
insert_start = TRUE;
field_num = result->num_fields();
if (field_num > table->s->fields)
{
set_on = table->s->fields;
set_off = table->s->fields;
} else {
set_on = field_num;
set_off = table->s->fields;
}
for (roop_count2 = 0; roop_count2 < set_on; roop_count2++)
bitmap_set_bit(table->write_set, (uint) roop_count2);
for (; roop_count2 < set_off; roop_count2++)
bitmap_clear_bit(table->write_set, (uint) roop_count2);
#if MYSQL_VERSION_ID < 50500
if (table->file->has_transactions())
#endif
{
THR_LOCK_DATA *to[2];
table->file->store_lock(table->in_use, to,
TL_WRITE_CONCURRENT_INSERT);
if ((error_num = table->file->ha_external_lock(table->in_use,
F_WRLCK)))
{
table->file->print_error(error_num, MYF(0));
break;
}
#if MYSQL_VERSION_ID < 50500
#else
2014-03-24 20:34:15 +01:00
if (
table->s->tmp_table == NO_TMP_TABLE &&
table->pos_in_table_list
) {
2013-06-27 13:18:48 +02:00
TABLE_LIST *next_tables =
table->pos_in_table_list->next_global;
while (next_tables && next_tables->parent_l)
{
DBUG_PRINT("info",("spider call child lock"));
TABLE *child_table = next_tables->table;
child_table->file->store_lock(child_table->in_use, to,
TL_WRITE_CONCURRENT_INSERT);
if ((error_num = child_table->file->ha_external_lock(
child_table->in_use, F_WRLCK)))
{
table->file->print_error(error_num, MYF(0));
break;
}
next_tables = next_tables->next_global;
}
}
#endif
}
if (direct_sql->iop)
{
if (direct_sql->iop[roop_count] == 1)
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
else if (direct_sql->iop[roop_count] == 2)
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
}
table->file->ha_start_bulk_insert(
(ha_rows) bulk_insert_rows);
for (roop_count2 = 0;
roop_count2 < bulk_insert_rows;
roop_count2++)
{
if ((error_num = spider_db_udf_fetch_table(
trx, conn, table, result, set_on, set_off)))
{
if (error_num == HA_ERR_END_OF_FILE)
{
end_of_file = TRUE;
error_num = 0;
}
break;
}
if (direct_sql->iop && direct_sql->iop[roop_count] == 2)
{
if ((error_num = spider_sys_replace(table,
&direct_sql->modified_non_trans_table)))
{
table->file->print_error(error_num, MYF(0));
break;
}
} else if ((error_num =
table->file->ha_write_row(table->record[0])))
{
/* insert */
if (
!direct_sql->iop || direct_sql->iop[roop_count] != 1 ||
table->file->is_fatal_error(error_num, HA_CHECK_DUP)
) {
DBUG_PRINT("info",("spider error_num=%d", error_num));
table->file->print_error(error_num, MYF(0));
break;
} else
error_num = 0;
}
}
if (error_num)
table->file->ha_end_bulk_insert();
else
error_num = table->file->ha_end_bulk_insert();
if (direct_sql->iop)
{
if (direct_sql->iop[roop_count] == 1)
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
else if (direct_sql->iop[roop_count] == 2)
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
}
#if MYSQL_VERSION_ID < 50500
if (table->file->has_transactions())
#endif
{
table->file->ha_external_lock(table->in_use, F_UNLCK);
#if MYSQL_VERSION_ID < 50500
#else
2014-03-24 20:34:15 +01:00
if (
table->s->tmp_table == NO_TMP_TABLE &&
table->pos_in_table_list
) {
2013-06-27 13:18:48 +02:00
TABLE_LIST *next_tables =
table->pos_in_table_list->next_global;
while (next_tables && next_tables->parent_l)
{
DBUG_PRINT("info",("spider call child lock"));
TABLE *child_table = next_tables->table;
child_table->file->ha_external_lock(child_table->in_use,
F_UNLCK);
next_tables = next_tables->next_global;
}
}
#endif
}
table->file->ha_reset();
table->in_use = thd;
pthread_mutex_unlock(
&trx->udf_table_mutexes[udf_table_mutex_index]);
}
if (error_num)
roop_count = -1;
}
result->free_result();
delete result;
} else {
if (!error_num)
{
error_num = spider_db_errorno(conn);
}
if (error_num)
{
if (error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM)
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
else if (error_num == HA_ERR_FOUND_DUPP_KEY)
{
my_printf_error(ER_SPIDER_HS_NUM, ER_SPIDER_HS_STR, MYF(0),
conn->db_conn->get_errno(), conn->db_conn->get_error());
}
break;
}
}
if ((status = conn->db_conn->next_result()) > 0)
{
error_num = status;
break;
}
if (roop_count >= 0)
roop_count++;
} while (status == 0);
}
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if (need_trx_end && insert_start)
{
if (error_num)
{
(void) ha_rollback_trans(c_thd, FALSE);
if (need_all_commit)
(void) ha_rollback_trans(c_thd, TRUE);
} else {
if ((error_num = ha_commit_trans(c_thd, FALSE)))
my_error(error_num, MYF(0));
if (need_all_commit)
{
if ((error_num = ha_commit_trans(c_thd, TRUE)))
my_error(error_num, MYF(0));
}
}
}
#if MYSQL_VERSION_ID < 50500
#else
c_thd->lex->sql_command = sql_command_backup;
#endif
DBUG_RETURN(error_num);
}
int spider_db_udf_direct_sql_select_db(
SPIDER_DIRECT_SQL *direct_sql,
SPIDER_CONN *conn
) {
int error_num, need_mon = 0;
SPIDER_DB_CONN *db_conn = conn->db_conn;
DBUG_ENTER("spider_db_udf_direct_sql_select_db");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (direct_sql->access_mode == 0)
{
#endif
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
if (
!conn->default_database.length() ||
conn->default_database.length() !=
direct_sql->tgt_default_db_name_length ||
memcmp(direct_sql->tgt_default_db_name, conn->default_database.ptr(),
direct_sql->tgt_default_db_name_length)
) {
if (
(
spider_db_before_query(conn, &need_mon) ||
db_conn->select_db(direct_sql->tgt_default_db_name)
) &&
(error_num = spider_db_errorno(conn))
) {
if (
error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
!conn->disable_reconnect
)
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
DBUG_RETURN(error_num);
}
conn->default_database.length(0);
if (conn->default_database.reserve(
direct_sql->tgt_default_db_name_length + 1))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
conn->default_database.q_append(direct_sql->tgt_default_db_name,
direct_sql->tgt_default_db_name_length + 1);
conn->default_database.length(direct_sql->tgt_default_db_name_length);
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
DBUG_RETURN(0);
}
int spider_db_udf_direct_sql_set_names(
SPIDER_DIRECT_SQL *direct_sql,
SPIDER_TRX *trx,
SPIDER_CONN *conn
) {
int error_num, need_mon = 0;
DBUG_ENTER("spider_db_udf_direct_sql_set_names");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (direct_sql->access_mode == 0)
{
#endif
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
if (
!conn->access_charset ||
trx->udf_access_charset->cset != conn->access_charset->cset
) {
if (
(
spider_db_before_query(conn, &need_mon) ||
conn->db_conn->set_character_set(trx->udf_access_charset->csname)
) &&
(error_num = spider_db_errorno(conn))
) {
if (
error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
!conn->disable_reconnect
) {
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
}
DBUG_RETURN(error_num);
}
conn->access_charset = trx->udf_access_charset;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
DBUG_RETURN(0);
}
int spider_db_udf_check_and_set_set_names(
SPIDER_TRX *trx
) {
int error_num;
DBUG_ENTER("spider_db_udf_check_and_set_set_names");
if (
!trx->udf_access_charset ||
trx->udf_access_charset->cset !=
trx->thd->variables.character_set_client->cset)
{
trx->udf_access_charset = trx->thd->variables.character_set_client;
if ((error_num = spider_db_udf_append_set_names(trx)))
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
int spider_db_udf_append_set_names(
SPIDER_TRX *trx
) {
DBUG_ENTER("spider_db_udf_append_set_names");
DBUG_RETURN(0);
}
void spider_db_udf_free_set_names(
SPIDER_TRX *trx
) {
DBUG_ENTER("spider_db_udf_free_set_names");
DBUG_VOID_RETURN;
}
int spider_db_udf_ping_table(
SPIDER_TABLE_MON_LIST *table_mon_list,
SPIDER_SHARE *share,
SPIDER_TRX *trx,
SPIDER_CONN *conn,
char *where_clause,
uint where_clause_length,
bool ping_only,
bool use_where,
longlong limit
) {
2014-03-24 21:38:08 +01:00
int error_num;
2013-06-27 13:18:48 +02:00
DBUG_ENTER("spider_db_udf_ping_table");
if (!pthread_mutex_trylock(&table_mon_list->monitor_mutex))
{
2014-03-24 21:38:08 +01:00
int need_mon = 0;
uint tmp_conn_link_idx = 0;
ha_spider spider;
uchar db_request_phase = 0;
2014-06-08 12:52:11 +02:00
ulonglong db_request_id = 0;
2013-06-27 13:18:48 +02:00
spider.share = share;
spider.trx = trx;
spider.need_mons = &need_mon;
spider.conn_link_idx = &tmp_conn_link_idx;
2014-03-24 21:38:08 +01:00
spider.db_request_phase = &db_request_phase;
2014-06-08 12:52:11 +02:00
spider.db_request_id = &db_request_id;
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &need_mon;
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_ping(&spider, conn, 0)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
table_mon_list->last_mon_result = error_num;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
2015-10-28 23:34:53 +01:00
if (error_num == ER_CON_COUNT_ERROR)
{
my_error(ER_CON_COUNT_ERROR, MYF(0));
DBUG_RETURN(ER_CON_COUNT_ERROR);
}
2013-06-27 13:18:48 +02:00
my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
share->server_names[0]);
DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (!ping_only)
{
int init_sql_alloc_size =
spider_param_init_sql_alloc_size(trx->thd, share->init_sql_alloc_size);
char *sql_buf = (char *) my_alloca(init_sql_alloc_size * 2);
if (!sql_buf)
{
table_mon_list->last_mon_result = HA_ERR_OUT_OF_MEM;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
my_error(HA_ERR_OUT_OF_MEM, MYF(0));
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
char *where_buf = sql_buf + init_sql_alloc_size;
2013-06-27 13:18:48 +02:00
spider_string sql_str(sql_buf, sizeof(sql_buf),
system_charset_info);
spider_string where_str(where_buf, sizeof(where_buf),
system_charset_info);
sql_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_1);
where_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_2);
2013-06-27 13:18:48 +02:00
sql_str.length(0);
where_str.length(0);
if (
use_where &&
where_str.append(where_clause, where_clause_length,
trx->thd->variables.character_set_client)
) {
table_mon_list->last_mon_result = HA_ERR_OUT_OF_MEM;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
my_error(HA_ERR_OUT_OF_MEM, MYF(0));
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
share->access_charset = system_charset_info;
if ((error_num = spider_db_udf_ping_table_append_select(&sql_str,
share, trx, &where_str, use_where, limit, conn->dbton_id)))
{
table_mon_list->last_mon_result = error_num;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
my_error(error_num, MYF(0));
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &need_mon;
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(&spider, conn, 0)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
table_mon_list->last_mon_result = error_num;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
DBUG_PRINT("info",("spider error_num=%d", error_num));
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, 0, trx->thd, share);
if (spider_db_query(
conn,
sql_str.ptr(),
sql_str.length(),
-1,
&need_mon)
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
table_mon_list->last_mon_result = error_num;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
DBUG_PRINT("info",("spider error_num=%d", error_num));
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
spider_db_discard_result(&spider, 0, conn);
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
}
table_mon_list->last_mon_result = 0;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
} else {
pthread_mutex_lock(&table_mon_list->monitor_mutex);
error_num = table_mon_list->last_mon_result;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
int spider_db_udf_ping_table_append_mon_next(
spider_string *str,
char *child_table_name,
uint child_table_name_length,
int link_id,
char *static_link_id,
uint static_link_id_length,
2013-06-27 13:18:48 +02:00
char *where_clause,
uint where_clause_length,
longlong first_sid,
int full_mon_count,
int current_mon_count,
int success_count,
int fault_count,
int flags,
longlong limit
) {
char limit_str[SPIDER_SQL_INT_LEN], sid_str[SPIDER_SQL_INT_LEN];
int limit_str_length, sid_str_length;
spider_string child_table_name_str(child_table_name,
child_table_name_length + 1, str->charset());
spider_string where_clause_str(where_clause ? where_clause : "",
where_clause_length + 1, str->charset());
DBUG_ENTER("spider_db_udf_ping_table_append_mon_next");
child_table_name_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_1);
where_clause_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_2);
2013-06-27 13:18:48 +02:00
child_table_name_str.length(child_table_name_length);
where_clause_str.length(where_clause_length);
limit_str_length = my_sprintf(limit_str, (limit_str, "%lld", limit));
sid_str_length = my_sprintf(sid_str, (sid_str, "%lld", first_sid));
if (str->reserve(
SPIDER_SQL_SELECT_LEN +
SPIDER_SQL_PING_TABLE_LEN +
(child_table_name_length * 2) +
(
static_link_id ?
(SPIDER_SQL_INT_LEN * 5) +
(SPIDER_SQL_VALUE_QUOTE_LEN * 2) +
(static_link_id_length * 2) :
(SPIDER_SQL_INT_LEN * 6)
) +
2013-06-27 13:18:48 +02:00
sid_str_length +
limit_str_length +
(where_clause_length * 2) +
(SPIDER_SQL_VALUE_QUOTE_LEN * 4) +
(SPIDER_SQL_COMMA_LEN * 9) +
SPIDER_SQL_CLOSE_PAREN_LEN
))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
str->q_append(SPIDER_SQL_PING_TABLE_STR, SPIDER_SQL_PING_TABLE_LEN);
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
2015-10-28 23:34:53 +01:00
str->append_escape_string(child_table_name_str.ptr(), child_table_name_str.length());
2013-06-27 13:18:48 +02:00
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
if (static_link_id)
{
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->append_for_single_quote(static_link_id, static_link_id_length);
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
} else {
str->qs_append(link_id);
}
2013-06-27 13:18:48 +02:00
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
str->qs_append(flags);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
str->q_append(limit_str, limit_str_length);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
2015-10-28 23:34:53 +01:00
str->append_escape_string(where_clause_str.ptr(), where_clause_str.length());
2013-06-27 13:18:48 +02:00
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
str->q_append(sid_str, sid_str_length);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
str->qs_append(full_mon_count);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
str->qs_append(current_mon_count);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
str->qs_append(success_count);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
str->qs_append(fault_count);
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
DBUG_RETURN(0);
}
int spider_db_udf_ping_table_append_select(
spider_string *str,
SPIDER_SHARE *share,
SPIDER_TRX *trx,
spider_string *where_str,
bool use_where,
longlong limit,
uint dbton_id
) {
int error_num;
char limit_str[SPIDER_SQL_INT_LEN];
int limit_str_length;
DBUG_ENTER("spider_db_udf_ping_table_append_select");
if (str->reserve(SPIDER_SQL_SELECT_LEN + SPIDER_SQL_ONE_LEN +
SPIDER_SQL_FROM_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
if ((error_num = spider_db_append_name_with_quote_str(str,
share->tgt_dbs[0], dbton_id)))
DBUG_RETURN(error_num);
if (str->reserve(SPIDER_SQL_DOT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
if ((error_num = spider_db_append_name_with_quote_str(str,
share->tgt_table_names[0], share->sql_dbton_ids[0])))
DBUG_RETURN(error_num);
limit_str_length = my_sprintf(limit_str, (limit_str, "%lld", limit));
if (str->reserve(
(use_where ? (where_str->length() * 2) : 0) +
SPIDER_SQL_LIMIT_LEN + limit_str_length
))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2015-10-28 23:34:53 +01:00
if (use_where)
{
str->append_escape_string(where_str->ptr(), where_str->length());
}
2013-06-27 13:18:48 +02:00
str->q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
str->q_append(limit_str, limit_str_length);
DBUG_RETURN(0);
}
int spider_db_udf_ping_table_mon_next(
THD *thd,
SPIDER_TABLE_MON *table_mon,
SPIDER_CONN *conn,
SPIDER_MON_TABLE_RESULT *mon_table_result,
char *child_table_name,
uint child_table_name_length,
int link_id,
char *where_clause,
uint where_clause_length,
longlong first_sid,
int full_mon_count,
int current_mon_count,
int success_count,
int fault_count,
int flags,
longlong limit
) {
int error_num, need_mon = 0;
uint tmp_conn_link_idx = 0;
SPIDER_DB_RESULT *res;
SPIDER_SHARE *share = table_mon->share;
int init_sql_alloc_size =
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
ha_spider spider;
SPIDER_TRX trx;
DBUG_ENTER("spider_db_udf_ping_table_mon_next");
char *sql_buf = (char *) my_alloca(init_sql_alloc_size);
if (!sql_buf)
{
my_error(HA_ERR_OUT_OF_MEM, MYF(0));
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
spider_string sql_str(sql_buf, sizeof(sql_buf),
thd->variables.character_set_client);
sql_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_MON_NEXT_1);
2013-06-27 13:18:48 +02:00
sql_str.length(0);
trx.thd = thd;
spider.share = share;
spider.trx = &trx;
spider.need_mons = &need_mon;
spider.conn_link_idx = &tmp_conn_link_idx;
share->access_charset = thd->variables.character_set_client;
if ((error_num = spider_db_udf_ping_table_append_mon_next(&sql_str,
child_table_name, child_table_name_length, link_id,
table_mon->parent->share->static_link_ids[0],
table_mon->parent->share->static_link_ids_lengths[0],
where_clause,
2013-06-27 13:18:48 +02:00
where_clause_length, first_sid, full_mon_count, current_mon_count,
success_count, fault_count, flags, limit)))
{
my_error(error_num, MYF(0));
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &need_mon;
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_ping(&spider, conn, 0)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
share->server_names[0]);
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
}
if ((error_num = spider_db_set_names(&spider, conn, 0)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, 0, thd, share);
if (spider_db_query(
conn,
sql_str.ptr(),
sql_str.length(),
-1,
&need_mon)
) {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(spider_db_errorno(conn));
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = trx.spider_thread_id;
request_key.query_id = trx.thd->query_id;
request_key.handler = table_mon;
request_key.request_id = 1;
request_key.next = NULL;
if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
if (error_num)
{
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
my_afree(sql_buf);
DBUG_RETURN(error_num);
}
else if ((error_num = spider_db_errorno(conn)))
{
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
2013-06-27 13:18:48 +02:00
my_error(HA_ERR_OUT_OF_MEM, MYF(0));
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
my_afree(sql_buf);
2013-06-27 13:18:48 +02:00
error_num = res->fetch_table_mon_status(mon_table_result->result_status);
res->free_result();
delete res;
DBUG_RETURN(error_num);
}
int spider_db_udf_copy_key_row(
spider_string *str,
spider_string *source_str,
Field *field,
ulong *row_pos,
ulong *length,
const char *joint_str,
const int joint_length,
uint dbton_id
) {
int error_num;
DBUG_ENTER("spider_db_udf_copy_key_row");
#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
2013-06-27 13:18:48 +02:00
if ((error_num = spider_db_append_name_with_quote_str(str,
Changing field::field_name and Item::name to LEX_CSTRING Benefits of this patch: - Removed a lot of calls to strlen(), especially for field_string - Strings generated by parser are now const strings, less chance of accidently changing a string - Removed a lot of calls with LEX_STRING as parameter (changed to pointer) - More uniform code - Item::name_length was not kept up to date. Now fixed - Several bugs found and fixed (Access to null pointers, access of freed memory, wrong arguments to printf like functions) - Removed a lot of casts from (const char*) to (char*) Changes: - This caused some ABI changes - lex_string_set now uses LEX_CSTRING - Some fucntions are now taking const char* instead of char* - Create_field::change and after changed to LEX_CSTRING - handler::connect_string, comment and engine_name() changed to LEX_CSTRING - Checked printf() related calls to find bugs. Found and fixed several errors in old code. - A lot of changes from LEX_STRING to LEX_CSTRING, especially related to parsing and events. - Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING* - Some changes for char* to const char* - Added printf argument checking for my_snprintf() - Introduced null_clex_str, star_clex_string, temp_lex_str to simplify code - Added item_empty_name and item_used_name to be able to distingush between items that was given an empty name and items that was not given a name This is used in sql_yacc.yy to know when to give an item a name. - select table_name."*' is not anymore same as table_name.* - removed not used function Item::rename() - Added comparision of item->name_length before some calls to my_strcasecmp() to speed up comparison - Moved Item_sp_variable::make_field() from item.h to item.cc - Some minimal code changes to avoid copying to const char * - Fixed wrong error message in wsrep_mysql_parse() - Fixed wrong code in find_field_in_natural_join() where real_item() was set when it shouldn't - ER_ERROR_ON_RENAME was used with extra arguments. - Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already give the error. TODO: - Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c - Change code to not modify LEX_CSTRING for database name (as part of lower_case_table_names)
2017-04-23 18:39:57 +02:00
(char *) field->field_name.str, dbton_id)))
#else
if ((error_num = spider_db_append_name_with_quote_str(str,
(char *) field->field_name, dbton_id)))
#endif
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
if (str->reserve(joint_length + *length + SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(joint_str, joint_length);
str->q_append(source_str->ptr() + *row_pos, *length);
str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
DBUG_RETURN(0);
}
int spider_db_udf_copy_tables(
SPIDER_COPY_TABLES *copy_tables,
ha_spider *spider,
TABLE *table,
longlong bulk_insert_rows
) {
int error_num = 0, roop_count;
bool end_of_file = FALSE;
ulong *last_lengths, *last_row_pos = NULL;
ha_spider *tmp_spider;
SPIDER_CONN *tmp_conn;
int all_link_cnt =
copy_tables->link_idx_count[0] + copy_tables->link_idx_count[1];
SPIDER_COPY_TABLE_CONN *src_tbl_conn = copy_tables->table_conn[0];
SPIDER_COPY_TABLE_CONN *dst_tbl_conn;
spider_db_copy_table *select_ct = src_tbl_conn->copy_table;
spider_db_copy_table *insert_ct = NULL;
KEY *key_info = &table->key_info[table->s->primary_key];
int bulk_insert_interval;
DBUG_ENTER("spider_db_udf_copy_tables");
if (!(last_row_pos = (ulong *)
spider_bulk_malloc(spider_current_trx, SPD_MID_DB_UDF_COPY_TABLES_1, MYF(MY_WME),
2013-06-27 13:18:48 +02:00
&last_row_pos, sizeof(ulong) * table->s->fields,
&last_lengths, sizeof(ulong) * table->s->fields,
NullS))
) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
goto error;
}
while (!end_of_file)
{
if (copy_tables->trx->thd->killed)
{
my_error(ER_QUERY_INTERRUPTED, MYF(0));
error_num = ER_QUERY_INTERRUPTED;
goto error_killed;
}
if (copy_tables->use_transaction)
{
for (roop_count = 0; roop_count < all_link_cnt; roop_count++)
{
tmp_spider = &spider[roop_count];
tmp_conn = tmp_spider->conns[0];
2014-03-24 20:42:40 +01:00
/* disable transaction */
spider_conn_clear_queue_at_commit(tmp_conn);
2013-06-27 13:18:48 +02:00
if (!tmp_conn->trx_start)
{
pthread_mutex_assert_not_owner(&tmp_conn->mta_conn_mutex);
pthread_mutex_lock(&tmp_conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
tmp_conn->need_mon = &tmp_spider->need_mons[0];
DBUG_ASSERT(!tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = TRUE;
tmp_conn->mta_conn_mutex_unlock_later = TRUE;
2013-06-27 13:18:48 +02:00
if (spider_db_ping(tmp_spider, tmp_conn, 0))
{
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
tmp_spider->share->server_names[0]);
error_num = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
goto error_db_ping;
}
if (
(error_num = spider_db_set_names(tmp_spider, tmp_conn, 0)) ||
(error_num = spider_db_start_transaction(tmp_conn,
tmp_spider->need_mons))
) {
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
goto error_start_transaction;
}
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
}
}
} else {
for (roop_count = 0; roop_count < all_link_cnt; roop_count++)
{
tmp_spider = &spider[roop_count];
tmp_conn = tmp_spider->conns[0];
2014-03-24 20:42:40 +01:00
/* disable transaction */
spider_conn_clear_queue_at_commit(tmp_conn);
2013-06-27 13:18:48 +02:00
spider_db_handler *tmp_dbton_hdl =
tmp_spider->dbton_handler[tmp_conn->dbton_id];
if ((error_num = tmp_dbton_hdl->insert_lock_tables_list(tmp_conn, 0)))
goto error_lock_table_hash;
tmp_conn->table_lock = 2;
}
for (roop_count = 0; roop_count < all_link_cnt; roop_count++)
{
tmp_spider = &spider[roop_count];
tmp_conn = tmp_spider->conns[0];
pthread_mutex_assert_not_owner(&tmp_conn->mta_conn_mutex);
pthread_mutex_lock(&tmp_conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
tmp_conn->need_mon = &tmp_spider->need_mons[0];
DBUG_ASSERT(!tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = TRUE;
tmp_conn->mta_conn_mutex_unlock_later = TRUE;
2013-06-27 13:18:48 +02:00
if (spider_db_ping(tmp_spider, tmp_conn, 0))
{
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
tmp_spider->share->server_names[0]);
error_num = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
goto error_db_ping;
}
if (
tmp_conn->db_conn->have_lock_table_list() &&
(
(error_num = spider_db_set_names(tmp_spider, tmp_conn, 0)) ||
(error_num = spider_db_lock_tables(tmp_spider, 0))
)
) {
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
tmp_conn->table_lock = 0;
if (error_num == HA_ERR_OUT_OF_MEM)
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
goto error_lock_tables;
}
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
tmp_conn->table_lock = 1;
}
}
tmp_conn = src_tbl_conn->conn;
spider_conn_set_timeout_from_share(tmp_conn, 0,
copy_tables->trx->thd, src_tbl_conn->share);
pthread_mutex_assert_not_owner(&tmp_conn->mta_conn_mutex);
pthread_mutex_lock(&tmp_conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
tmp_conn->need_mon = &src_tbl_conn->need_mon;
DBUG_ASSERT(!tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = TRUE;
tmp_conn->mta_conn_mutex_unlock_later = TRUE;
2013-06-27 13:18:48 +02:00
if (select_ct->exec_query(
tmp_conn,
-1,
&src_tbl_conn->need_mon)
) {
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
error_num = spider_db_errorno(tmp_conn);
if (error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM)
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
goto error_db_query;
} else {
SPIDER_DB_RESULT *result;
st_spider_db_request_key request_key;
request_key.spider_thread_id = copy_tables->trx->spider_thread_id;
request_key.query_id = copy_tables->trx->thd->query_id;
request_key.handler = copy_tables;
request_key.request_id = 1;
request_key.next = NULL;
if ((result = tmp_conn->db_conn->use_result(&request_key, &error_num)))
{
SPIDER_DB_ROW *row;
roop_count = 0;
while ((row = result->fetch_row()))
{
dst_tbl_conn = copy_tables->table_conn[1];
insert_ct = dst_tbl_conn->copy_table;
if ((error_num = insert_ct->copy_rows(table, row,
&last_row_pos, &last_lengths)))
{
if (error_num == HA_ERR_OUT_OF_MEM)
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
result->free_result();
delete result;
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
goto error_db_query;
}
for (dst_tbl_conn = dst_tbl_conn->next; dst_tbl_conn;
dst_tbl_conn = dst_tbl_conn->next)
{
row->first();
insert_ct = dst_tbl_conn->copy_table;
if ((error_num = insert_ct->copy_rows(table, row)))
{
if (error_num == HA_ERR_OUT_OF_MEM)
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
result->free_result();
delete result;
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
goto error_db_query;
}
}
++roop_count;
}
error_num = result->get_errno();
if (error_num == HA_ERR_END_OF_FILE)
{
if (roop_count < bulk_insert_rows)
2013-06-27 13:18:48 +02:00
{
end_of_file = TRUE;
if (roop_count)
error_num = 0;
} else {
/* add next where clause */
select_ct->set_sql_to_pos();
error_num = select_ct->append_copy_where(insert_ct, key_info,
last_row_pos, last_lengths);
if (error_num)
{
if (error_num == HA_ERR_OUT_OF_MEM)
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
result->free_result();
delete result;
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
goto error_db_query;
}
if (
select_ct->append_key_order_str(key_info, 0, FALSE) ||
select_ct->append_limit(0, bulk_insert_rows) ||
(
copy_tables->use_transaction &&
select_ct->append_select_lock_str(SPIDER_LOCK_MODE_SHARED)
)
) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
result->free_result();
delete result;
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
error_num = ER_OUT_OF_RESOURCES;
goto error_db_query;
}
error_num = 0;
}
} else {
if (error_num == HA_ERR_OUT_OF_MEM)
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
result->free_result();
delete result;
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
goto error_db_query;
}
result->free_result();
delete result;
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
for (dst_tbl_conn = copy_tables->table_conn[1]; dst_tbl_conn;
dst_tbl_conn = dst_tbl_conn->next)
{
insert_ct = dst_tbl_conn->copy_table;
if ((error_num = insert_ct->append_insert_terminator()))
{
if (error_num == HA_ERR_OUT_OF_MEM)
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
goto error_db_query;
}
}
} else {
if (!error_num)
{
error_num = spider_db_errorno(tmp_conn);
}
if (error_num)
{
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
if (error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM)
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
goto error_db_query;
}
error_num = HA_ERR_END_OF_FILE;
end_of_file = TRUE;
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
2013-06-27 13:18:48 +02:00
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
}
}
2015-10-28 23:34:53 +01:00
if (!error_num && roop_count)
2013-06-27 13:18:48 +02:00
{
/*
dst_tbl_conn = copy_tables->table_conn[1];
spider_db_copy_table *source_ct = dst_tbl_conn->copy_table;
for (dst_tbl_conn = dst_tbl_conn->next; dst_tbl_conn;
dst_tbl_conn = dst_tbl_conn->next)
{
insert_ct = dst_tbl_conn->copy_table;
if (insert_ct->copy_insert_values(source_ct))
{
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
error_num = ER_OUT_OF_RESOURCES;
goto error_db_query;
}
}
*/
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (copy_tables->bg_mode)
{
for (dst_tbl_conn = copy_tables->table_conn[1]; dst_tbl_conn;
dst_tbl_conn = dst_tbl_conn->next)
{
if (spider_udf_bg_copy_exec_sql(dst_tbl_conn))
{
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
error_num = ER_OUT_OF_RESOURCES;
goto error_db_query;
}
}
} else {
#endif
for (dst_tbl_conn = copy_tables->table_conn[1]; dst_tbl_conn;
dst_tbl_conn = dst_tbl_conn->next)
{
tmp_conn = dst_tbl_conn->conn;
insert_ct = dst_tbl_conn->copy_table;
pthread_mutex_assert_not_owner(&tmp_conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
pthread_mutex_lock(&tmp_conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
tmp_conn->need_mon = &dst_tbl_conn->need_mon;
DBUG_ASSERT(!tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!tmp_conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
tmp_conn->mta_conn_mutex_lock_already = TRUE;
tmp_conn->mta_conn_mutex_unlock_later = TRUE;
spider_conn_set_timeout_from_share(tmp_conn, 0,
copy_tables->trx->thd, dst_tbl_conn->share);
if (insert_ct->exec_query(
tmp_conn,
-1,
&dst_tbl_conn->need_mon)
) {
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(tmp_conn);
if (error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM)
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
goto error_db_query;
} else {
DBUG_ASSERT(tmp_conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(tmp_conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
tmp_conn->mta_conn_mutex_lock_already = FALSE;
tmp_conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&tmp_conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&tmp_conn->mta_conn_mutex);
}
}
#ifndef WITHOUT_SPIDER_BG_SEARCH
}
#endif
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (copy_tables->bg_mode)
{
for (dst_tbl_conn = copy_tables->table_conn[1]; dst_tbl_conn;
dst_tbl_conn = dst_tbl_conn->next)
{
tmp_conn = dst_tbl_conn->conn;
if (tmp_conn->bg_exec_sql)
{
/* wait */
pthread_mutex_lock(&tmp_conn->bg_conn_mutex);
pthread_mutex_unlock(&tmp_conn->bg_conn_mutex);
}
if (dst_tbl_conn->bg_error_num)
{
if (error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM)
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
goto error_db_query;
}
}
}
#endif
}
if (copy_tables->use_transaction)
{
for (roop_count = 0; roop_count < all_link_cnt; roop_count++)
{
tmp_spider = &spider[roop_count];
tmp_conn = tmp_spider->conns[0];
if (tmp_conn->trx_start)
{
if ((error_num = spider_db_commit(tmp_conn)))
goto error_commit;
}
}
} else {
for (roop_count = 0; roop_count < all_link_cnt; roop_count++)
{
tmp_spider = &spider[roop_count];
tmp_conn = tmp_spider->conns[0];
if (tmp_conn->table_lock == 1)
{
tmp_conn->table_lock = 0;
if ((error_num = spider_db_unlock_tables(tmp_spider, 0)))
goto error_unlock_tables;
}
}
}
if (!end_of_file)
{
for (dst_tbl_conn = copy_tables->table_conn[1]; dst_tbl_conn;
dst_tbl_conn = dst_tbl_conn->next)
{
insert_ct = dst_tbl_conn->copy_table;
insert_ct->set_sql_to_pos();
}
DBUG_PRINT("info",("spider sleep"));
bulk_insert_interval = spider_param_udf_ct_bulk_insert_interval(
copy_tables->bulk_insert_interval);
my_sleep(bulk_insert_interval);
}
}
spider_free(spider_current_trx, last_row_pos, MYF(0));
DBUG_RETURN(0);
error_db_query:
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (copy_tables->bg_mode)
{
for (dst_tbl_conn = copy_tables->table_conn[1]; dst_tbl_conn;
dst_tbl_conn = dst_tbl_conn->next)
{
tmp_conn = dst_tbl_conn->conn;
if (tmp_conn->bg_exec_sql)
{
/* wait */
pthread_mutex_lock(&tmp_conn->bg_conn_mutex);
pthread_mutex_unlock(&tmp_conn->bg_conn_mutex);
}
}
}
#endif
error_unlock_tables:
error_commit:
error_lock_tables:
error_lock_table_hash:
error_start_transaction:
error_db_ping:
error_killed:
if (copy_tables->use_transaction)
{
for (roop_count = 0; roop_count < all_link_cnt; roop_count++)
{
tmp_spider = &spider[roop_count];
tmp_conn = tmp_spider->conns[0];
if (tmp_conn->trx_start)
spider_db_rollback(tmp_conn);
}
} else {
if (copy_tables->trx->locked_connections)
{
for (roop_count = 0; roop_count < all_link_cnt; roop_count++)
{
tmp_spider = &spider[roop_count];
tmp_conn = tmp_spider->conns[0];
if (tmp_conn->table_lock == 1)
{
tmp_conn->table_lock = 0;
spider_db_unlock_tables(tmp_spider, 0);
}
}
}
}
error:
if (last_row_pos)
{
spider_free(spider_current_trx, last_row_pos, MYF(0));
}
DBUG_RETURN(error_num);
}
int spider_db_open_handler(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx
) {
int error_num;
SPIDER_SHARE *share = spider->share;
uint *handler_id_ptr =
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
conn->conn_kind == SPIDER_CONN_KIND_MYSQL ?
#endif
&spider->m_handler_id[link_idx]
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
: conn->conn_kind == SPIDER_CONN_KIND_HS_READ ?
&spider->r_handler_id[link_idx] :
&spider->w_handler_id[link_idx]
#endif
;
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
DBUG_ENTER("spider_db_open_handler");
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &spider->need_mons[link_idx];
2013-06-27 13:18:48 +02:00
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2013-06-27 13:18:48 +02:00
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
if (!spider->handler_opened(link_idx, conn->conn_kind))
*handler_id_ptr = conn->opened_handlers;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
#endif
if (!spider->handler_opened(link_idx, conn->conn_kind))
my_sprintf(spider->m_handler_cid[link_idx],
(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_FORMAT,
*handler_id_ptr));
if ((error_num = dbton_hdl->append_open_handler_part(
SPIDER_SQL_TYPE_HANDLER, *handler_id_ptr, conn, link_idx)))
{
goto error;
}
spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
share);
if (dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_HANDLER,
conn,
-1,
&spider->need_mons[link_idx])
) {
error_num = spider_db_errorno(conn);
goto error;
}
dbton_hdl->reset_sql(SPIDER_SQL_TYPE_HANDLER);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
uint reconnect = 0;
if (conn->hs_pre_age != conn->hs_age && conn->server_lost)
{
spider_conn_queue_connect(share, conn, link_idx);
reconnect |= 1;
}
if ((error_num = spider_db_conn_queue_action(conn)))
{
goto error;
}
if (conn->hs_pre_age != conn->hs_age)
{
if (conn->db_conn->ping())
{
my_printf_error(ER_SPIDER_HS_NUM, ER_SPIDER_HS_STR, MYF(0),
conn->db_conn->get_errno(), conn->db_conn->get_error());
spider->need_mons[link_idx] = ER_SPIDER_HS_NUM;
error_num = ER_SPIDER_HS_NUM;
goto error;
}
conn->opened_handlers = 0;
conn->db_conn->reset_opened_handler();
conn->hs_age = conn->hs_pre_age;
reconnect |= 2;
}
if (conn->conn_kind == SPIDER_CONN_KIND_HS_READ)
{
if (spider->hs_r_conn_ages[link_idx] != conn->hs_age)
{
spider->clear_handler_opened(link_idx, SPIDER_CONN_KIND_HS_READ);
*handler_id_ptr = conn->opened_handlers;
}
} else {
if (spider->hs_w_conn_ages[link_idx] != conn->hs_age)
{
spider->clear_handler_opened(link_idx, SPIDER_CONN_KIND_HS_WRITE);
*handler_id_ptr = conn->opened_handlers;
}
}
#ifdef HA_CAN_BULK_ACCESS
if (!spider->is_bulk_access_clone)
{
#endif
conn->db_conn->reset_request_queue();
#ifdef HA_CAN_BULK_ACCESS
} else if (!spider->bulk_access_executing)
{
if (conn->conn_kind == SPIDER_CONN_KIND_HS_READ)
{
spider_set_bit(spider->result_list.hs_r_bulk_open_index, link_idx);
} else {
spider_set_bit(spider->result_list.hs_w_bulk_open_index, link_idx);
}
}
#endif
if ((error_num = dbton_hdl->append_open_handler_part(
SPIDER_SQL_TYPE_OTHER_HS, *handler_id_ptr, conn, link_idx)))
{
goto error;
}
#ifdef HA_CAN_BULK_ACCESS
if (spider->is_bulk_access_clone && !spider->bulk_access_executing)
{
spider->connection_ids[link_idx] = conn->connection_id;
spider_trx_add_bulk_access_conn(spider->trx, conn);
} else {
#endif
spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
share);
if (dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_SELECT_HS,
conn,
-1,
&spider->need_mons[link_idx])
) {
error_num = spider_db_errorno(conn);
goto error;
}
SPIDER_DB_RESULT *result;
if (spider_bit_is_set(spider->db_request_phase, link_idx))
{
spider_clear_bit(spider->db_request_phase, link_idx);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[link_idx];
request_key.next = NULL;
if (!(result = conn->db_conn->use_result(&request_key, &error_num)))
{
if (!error_num)
{
spider_db_errorno(conn);
error_num = ER_SPIDER_HS_NUM;
}
goto error;
} else {
conn->ping_time = (time_t) time((time_t*) 0);
}
result->free_result();
delete result;
#ifdef HA_CAN_BULK_ACCESS
}
#endif
if (conn->conn_kind == SPIDER_CONN_KIND_HS_READ)
{
spider->r_handler_index[link_idx] = spider->active_index;
spider->hs_r_conn_ages[link_idx] = conn->hs_age;
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
if (
spider->sql_command != SQLCOM_HS_INSERT &&
spider->hs_pushed_ret_fields_num < MAX_FIELDS
) {
spider->hs_r_ret_fields_num[link_idx] =
spider->hs_pushed_ret_fields_num;
memcpy(spider->hs_r_ret_fields[link_idx], spider->hs_pushed_ret_fields,
sizeof(uint32) * spider->hs_pushed_ret_fields_num);
} else {
spider->hs_r_ret_fields_num[link_idx] = MAX_FIELDS;
}
#endif
} else {
spider->w_handler_index[link_idx] = spider->active_index;
spider->hs_w_conn_ages[link_idx] = conn->hs_age;
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
if (
spider->sql_command != SQLCOM_HS_INSERT &&
spider->hs_pushed_ret_fields_num < MAX_FIELDS
) {
spider->hs_w_ret_fields_num[link_idx] =
spider->hs_pushed_ret_fields_num;
memcpy(spider->hs_w_ret_fields[link_idx], spider->hs_pushed_ret_fields,
sizeof(uint32) * spider->hs_pushed_ret_fields_num);
} else {
spider->hs_w_ret_fields_num[link_idx] = MAX_FIELDS;
}
#endif
}
}
#endif
if (!spider->handler_opened(link_idx, conn->conn_kind))
{
if ((error_num = dbton_hdl->insert_opened_handler(conn, link_idx)))
goto error;
conn->opened_handlers++;
}
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider opened_handlers=%u", conn->opened_handlers));
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(0);
error:
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
#ifdef HA_CAN_BULK_ACCESS
int spider_db_bulk_open_handler(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx
) {
int error_num = 0;
2014-03-24 20:48:23 +01:00
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
2013-06-27 13:18:48 +02:00
bool opening_index = FALSE;
2014-03-24 20:48:23 +01:00
#endif
2013-06-27 13:18:48 +02:00
DBUG_ENTER("spider_db_bulk_open_handler");
DBUG_PRINT("info",("spider spider=%p", spider));
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider link_idx=%d", link_idx));
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
DBUG_ASSERT(conn->conn_kind != SPIDER_CONN_KIND_MYSQL);
if (conn->conn_kind == SPIDER_CONN_KIND_HS_READ)
{
if (spider_bit_is_set(spider->result_list.hs_r_bulk_open_index, link_idx))
{
DBUG_PRINT("info",("spider SPIDER_CONN_KIND_HS_READ"));
spider_clear_bit(spider->result_list.hs_r_bulk_open_index, link_idx);
opening_index = TRUE;
}
} else {
if (spider_bit_is_set(spider->result_list.hs_w_bulk_open_index, link_idx))
{
DBUG_PRINT("info",("spider SPIDER_CONN_KIND_HS_WRITE"));
spider_clear_bit(spider->result_list.hs_w_bulk_open_index, link_idx);
opening_index = TRUE;
}
}
if (opening_index)
{
DBUG_PRINT("info",("spider conn->connection_id=%llu",
conn->connection_id));
DBUG_PRINT("info",("spider spider->connection_ids[%d]=%llu",
link_idx, spider->connection_ids[link_idx]));
if (conn->connection_id != spider->connection_ids[link_idx])
{
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
}
bool tmp_mta_conn_mutex_unlock_later;
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
tmp_mta_conn_mutex_unlock_later = conn->mta_conn_mutex_unlock_later;
conn->mta_conn_mutex_unlock_later = TRUE;
SPIDER_DB_RESULT *result;
if (spider_bit_is_set(spider->db_request_phase, link_idx))
{
spider_clear_bit(spider->db_request_phase, link_idx);
}
st_spider_db_request_key request_key;
request_key.spider_thread_id = spider->trx->spider_thread_id;
request_key.query_id = spider->trx->thd->query_id;
request_key.handler = spider;
request_key.request_id = spider->db_request_id[link_idx];
request_key.next = NULL;
if (!(result = conn->db_conn->use_result(&request_key, &error_num)))
{
if (!error_num)
{
spider_db_errorno(conn);
error_num = ER_SPIDER_HS_NUM;
}
} else {
result->free_result();
delete result;
}
conn->mta_conn_mutex_unlock_later = tmp_mta_conn_mutex_unlock_later;
}
#endif
DBUG_RETURN(error_num);
}
#endif
int spider_db_close_handler(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx,
uint tgt_conn_kind
) {
int error_num;
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
DBUG_ENTER("spider_db_close_handler");
DBUG_PRINT("info",("spider conn=%p", conn));
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &spider->need_mons[link_idx];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = TRUE;
conn->mta_conn_mutex_unlock_later = TRUE;
2013-06-27 13:18:48 +02:00
if (spider->handler_opened(link_idx, tgt_conn_kind))
{
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
{
#endif
dbton_hdl->reset_sql(SPIDER_SQL_TYPE_HANDLER);
if ((error_num = dbton_hdl->append_close_handler_part(
SPIDER_SQL_TYPE_HANDLER, link_idx)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
2013-06-27 13:18:48 +02:00
spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
spider->share);
if (dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_HANDLER,
conn,
-1,
&spider->need_mons[link_idx])
) {
error_num = spider_db_errorno(conn);
goto error;
}
dbton_hdl->reset_sql(SPIDER_SQL_TYPE_HANDLER);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
/*
conn->hs_conn->close();
conn->server_lost = TRUE;
*/
}
#endif
if ((error_num = dbton_hdl->delete_opened_handler(conn, link_idx)))
goto error;
conn->opened_handlers--;
DBUG_PRINT("info",("spider opened_handlers=%u", conn->opened_handlers));
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(0);
error:
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
2013-06-27 13:18:48 +02:00
DBUG_RETURN(error_num);
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
void spider_db_hs_request_buf_reset(
SPIDER_CONN *conn
) {
DBUG_ENTER("spider_db_hs_request_buf_reset");
if (conn->bulk_access_requests)
{
if (conn->db_conn->is_connected())
{
conn->db_conn->reset_request_queue();
}
conn->bulk_access_requests = 0;
}
DBUG_VOID_RETURN;
}
#endif
2014-09-18 02:26:30 +02:00
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);
}