mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
e066723a41
Get count from last_used_con->info Contributed by willhan at Tencent Games
6332 lines
196 KiB
C++
6332 lines
196 KiB
C++
/* Copyright (C) 2012-2018 Kentoku Shiba
|
|
|
|
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
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
|
|
|
|
#define MYSQL_SERVER 1
|
|
#include <my_global.h>
|
|
#include "mysql_version.h"
|
|
#include "spd_environ.h"
|
|
#if MYSQL_VERSION_ID < 50500
|
|
#include "mysql_priv.h"
|
|
#include <mysql/plugin.h>
|
|
#else
|
|
#include "sql_priv.h"
|
|
#include "probes_mysql.h"
|
|
#include "sql_analyse.h"
|
|
#endif
|
|
|
|
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
|
|
#include "spd_err.h"
|
|
#include "spd_param.h"
|
|
#include "spd_db_include.h"
|
|
#include "spd_include.h"
|
|
#include "spd_db_handlersocket.h"
|
|
#include "ha_spider.h"
|
|
#include "spd_db_conn.h"
|
|
#include "spd_trx.h"
|
|
#include "spd_conn.h"
|
|
#include "spd_malloc.h"
|
|
|
|
extern handlerton *spider_hton_ptr;
|
|
extern HASH spider_open_connections;
|
|
extern HASH spider_ipport_conns;
|
|
extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
|
|
extern const char spider_dig_upper[];
|
|
|
|
#define SPIDER_SQL_INTERVAL_STR " + interval "
|
|
#define SPIDER_SQL_INTERVAL_LEN (sizeof(SPIDER_SQL_INTERVAL_STR) - 1)
|
|
#define SPIDER_SQL_NEGINTERVAL_STR " - interval "
|
|
#define SPIDER_SQL_NEGINTERVAL_LEN (sizeof(SPIDER_SQL_NEGINTERVAL_STR) - 1)
|
|
|
|
#define SPIDER_SQL_NAME_QUOTE_STR ""
|
|
#define SPIDER_SQL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_NAME_QUOTE_STR) - 1)
|
|
static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR;
|
|
|
|
#define SPIDER_SQL_TYPE_FULL_HS (SPIDER_SQL_TYPE_SELECT_HS | \
|
|
SPIDER_SQL_TYPE_INSERT_HS | SPIDER_SQL_TYPE_UPDATE_HS | \
|
|
SPIDER_SQL_TYPE_DELETE_HS | SPIDER_SQL_TYPE_OTHER_HS)
|
|
|
|
static uchar SPIDER_SQL_LINESTRING_HEAD_STR[] =
|
|
{0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00};
|
|
#define SPIDER_SQL_LINESTRING_HEAD_LEN sizeof(SPIDER_SQL_LINESTRING_HEAD_STR)
|
|
|
|
static const char *spider_db_timefunc_interval_str[] =
|
|
{
|
|
" year", " quarter", " month", " week", " day",
|
|
" hour", " minute", " second", " microsecond",
|
|
" year_month", " day_hour", " day_minute",
|
|
" day_second", " hour_minute", " hour_second",
|
|
" minute_second", " day_microsecond", " hour_microsecond",
|
|
" minute_microsecond", " second_microsecond"
|
|
};
|
|
|
|
static SPIDER_HS_STRING_REF spider_null_string_ref = SPIDER_HS_STRING_REF();
|
|
|
|
int spider_handlersocket_init()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_init");
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_deinit()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_deinit");
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
spider_db_share *spider_handlersocket_create_share(
|
|
SPIDER_SHARE *share
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_create_share");
|
|
DBUG_RETURN(new spider_handlersocket_share(share));
|
|
}
|
|
|
|
spider_db_handler *spider_handlersocket_create_handler(
|
|
ha_spider *spider,
|
|
spider_db_share *db_share
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_create_handler");
|
|
DBUG_RETURN(new spider_handlersocket_handler(spider,
|
|
(spider_handlersocket_share *) db_share));
|
|
}
|
|
|
|
SPIDER_DB_CONN *spider_handlersocket_create_conn(
|
|
SPIDER_CONN *conn
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_create_conn");
|
|
DBUG_RETURN(new spider_db_handlersocket(conn));
|
|
}
|
|
|
|
bool spider_handlersocket_support_direct_join(
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_support_direct_join");
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
spider_db_handlersocket_util spider_db_handlersocket_utility;
|
|
|
|
SPIDER_DBTON spider_dbton_handlersocket = {
|
|
0,
|
|
SPIDER_DB_WRAPPER_MYSQL,
|
|
SPIDER_DB_ACCESS_TYPE_NOSQL,
|
|
spider_handlersocket_init,
|
|
spider_handlersocket_deinit,
|
|
spider_handlersocket_create_share,
|
|
spider_handlersocket_create_handler,
|
|
NULL,
|
|
spider_handlersocket_create_conn,
|
|
spider_handlersocket_support_direct_join,
|
|
&spider_db_handlersocket_utility
|
|
};
|
|
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_hs_string_ref_buffer::init()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::init");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_db_hs_string_ref_buffer::clear()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::clear");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
hs_conds.clear();
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_hs_string_ref_buffer::push_back(
|
|
SPIDER_HS_STRING_REF &cond
|
|
) {
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::push_back");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
hs_conds.push_back(cond);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
SPIDER_HS_STRING_REF *spider_db_hs_string_ref_buffer::ptr()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::ptr");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(&hs_conds[0]);
|
|
}
|
|
|
|
uint spider_db_hs_string_ref_buffer::size()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::size");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN((uint) hs_conds.size());
|
|
}
|
|
#else
|
|
spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer() : hs_da_init(FALSE)
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (hs_da_init)
|
|
{
|
|
spider_free_mem_calc(spider_current_trx,
|
|
hs_conds_id, hs_conds.max_element * hs_conds.size_of_element);
|
|
delete_dynamic(&hs_conds);
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_hs_string_ref_buffer::init()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::init");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!hs_da_init)
|
|
{
|
|
SPD_INIT_DYNAMIC_ARRAY2(&hs_conds, sizeof(SPIDER_HS_STRING_REF),
|
|
NULL, 16, 16, MYF(MY_WME));
|
|
spider_alloc_calc_mem_init(hs_conds, 159);
|
|
spider_alloc_calc_mem(spider_current_trx,
|
|
hs_conds, hs_conds.max_element * hs_conds.size_of_element);
|
|
hs_da_init = TRUE;
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_db_hs_string_ref_buffer::clear()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::clear");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
hs_conds.elements = 0;
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_hs_string_ref_buffer::push_back(
|
|
SPIDER_HS_STRING_REF &cond
|
|
) {
|
|
uint old_elements = hs_conds.max_element;
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::push_back");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (insert_dynamic(&hs_conds, (uchar *) &cond))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
if (hs_conds.max_element > old_elements)
|
|
{
|
|
spider_alloc_calc_mem(spider_current_trx,
|
|
hs_conds,
|
|
(hs_conds.max_element - old_elements) * hs_conds.size_of_element);
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
SPIDER_HS_STRING_REF *spider_db_hs_string_ref_buffer::ptr()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::ptr");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN((SPIDER_HS_STRING_REF *) hs_conds.buffer);
|
|
}
|
|
|
|
uint spider_db_hs_string_ref_buffer::size()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_string_ref_buffer::size");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(hs_conds.elements);
|
|
}
|
|
#endif
|
|
|
|
spider_db_hs_str_buffer::spider_db_hs_str_buffer() : hs_da_init(FALSE)
|
|
{
|
|
DBUG_ENTER("spider_db_hs_str_buffer::spider_db_hs_str_buffer");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_db_hs_str_buffer::~spider_db_hs_str_buffer()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_str_buffer::~spider_db_hs_str_buffer");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (hs_da_init)
|
|
{
|
|
spider_free_mem_calc(spider_current_trx,
|
|
hs_conds_id, hs_conds.max_element * hs_conds.size_of_element);
|
|
delete_dynamic(&hs_conds);
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_hs_str_buffer::init()
|
|
{
|
|
DBUG_ENTER("spider_db_hs_str_buffer::init");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!hs_da_init)
|
|
{
|
|
SPD_INIT_DYNAMIC_ARRAY2(&hs_conds, sizeof(spider_string *),
|
|
NULL, 16, 16, MYF(MY_WME));
|
|
spider_alloc_calc_mem_init(hs_conds, 160);
|
|
spider_alloc_calc_mem(spider_current_trx,
|
|
hs_conds, hs_conds.max_element * hs_conds.size_of_element);
|
|
hs_da_init = TRUE;
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_db_hs_str_buffer::clear()
|
|
{
|
|
uint i;
|
|
spider_string *element;
|
|
DBUG_ENTER("spider_db_hs_str_buffer::clear");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
for (i = 0; i < hs_conds.elements; i++)
|
|
{
|
|
get_dynamic(&hs_conds, (uchar *) &element, i);
|
|
element->free();
|
|
spider_free(spider_current_trx, element, MYF(0));
|
|
}
|
|
hs_conds.elements = 0;
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_string *spider_db_hs_str_buffer::add(
|
|
uint *strs_pos,
|
|
const char *str,
|
|
uint str_len
|
|
) {
|
|
spider_string *element;
|
|
DBUG_ENTER("spider_db_hs_str_buffer::add");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (hs_conds.elements <= *strs_pos + 1)
|
|
{
|
|
if (!(element = (spider_string *) spider_malloc(spider_current_trx, 8,
|
|
sizeof(spider_string), MYF(MY_WME | MY_ZEROFILL))))
|
|
DBUG_RETURN(NULL);
|
|
element->init_calc_mem(98);
|
|
element->set_charset(&my_charset_bin);
|
|
if ((element->reserve(str_len + 1)))
|
|
{
|
|
spider_free(spider_current_trx, element, MYF(0));
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
element->q_append(str, str_len);
|
|
uint old_elements = hs_conds.max_element;
|
|
if (insert_dynamic(&hs_conds, (uchar *) &element))
|
|
{
|
|
element->free();
|
|
spider_free(spider_current_trx, element, MYF(0));
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
if (hs_conds.max_element > old_elements)
|
|
{
|
|
spider_alloc_calc_mem(spider_current_trx,
|
|
hs_conds,
|
|
(hs_conds.max_element - old_elements) *
|
|
hs_conds.size_of_element);
|
|
}
|
|
} else {
|
|
element = ((spider_string **) hs_conds.buffer)[*strs_pos];
|
|
element->length(0);
|
|
if ((element->reserve(str_len + 1)))
|
|
DBUG_RETURN(NULL);
|
|
element->q_append(str, str_len);
|
|
}
|
|
(*strs_pos)++;
|
|
DBUG_RETURN(element);
|
|
}
|
|
|
|
spider_db_handlersocket_row::spider_db_handlersocket_row() :
|
|
spider_db_row(spider_dbton_handlersocket.dbton_id),
|
|
hs_row(NULL), field_count(0), row_size(0), cloned(FALSE)
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_row::spider_db_handlersocket_row");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_db_handlersocket_row::~spider_db_handlersocket_row()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_row::~spider_db_handlersocket_row");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (cloned)
|
|
{
|
|
spider_free(spider_current_trx, hs_row_first, MYF(0));
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_handlersocket_row::store_to_field(
|
|
Field *field,
|
|
CHARSET_INFO *access_charset
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_row::store_to_field");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!hs_row->begin())
|
|
{
|
|
DBUG_PRINT("info", ("spider field is null"));
|
|
field->set_null();
|
|
field->reset();
|
|
} else {
|
|
#ifndef DBUG_OFF
|
|
char buf[MAX_FIELD_WIDTH];
|
|
spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset());
|
|
tmp_str.init_calc_mem(119);
|
|
tmp_str.length(0);
|
|
tmp_str.append(hs_row->begin(), hs_row->size(), &my_charset_bin);
|
|
DBUG_PRINT("info", ("spider val=%s", tmp_str.c_ptr_safe()));
|
|
#endif
|
|
field->set_notnull();
|
|
if (field->flags & BLOB_FLAG)
|
|
{
|
|
DBUG_PRINT("info", ("spider blob field"));
|
|
((Field_blob *)field)->set_ptr(
|
|
hs_row->size(), (uchar *) hs_row->begin());
|
|
} else
|
|
field->store(hs_row->begin(), hs_row->size(), &my_charset_bin);
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_row::append_to_str(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_row::append_to_str");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (str->reserve(hs_row->size()))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(hs_row->begin(), hs_row->size());
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_row::append_escaped_to_str(
|
|
spider_string *str,
|
|
uint dbton_id
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_row::append_escaped_to_str");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
spider_string tmp_str(hs_row->begin(), hs_row->size() + 1, &my_charset_bin);
|
|
tmp_str.init_calc_mem(172);
|
|
tmp_str.length(hs_row->size());
|
|
if (str->reserve(hs_row->size() * 2 + 2))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
spider_dbton[dbton_id].db_util->append_escaped_util(str, tmp_str.get_str());
|
|
str->mem_calc();
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_db_handlersocket_row::first()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_row::first");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
hs_row = hs_row_first;
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
void spider_db_handlersocket_row::next()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_row::next");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
hs_row++;
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
bool spider_db_handlersocket_row::is_null()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_row::is_null");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(!hs_row->begin());
|
|
}
|
|
|
|
int spider_db_handlersocket_row::val_int()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_row::val_int");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(atoi(hs_row->begin()));
|
|
}
|
|
|
|
double spider_db_handlersocket_row::val_real()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_row::val_real");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(hs_row->begin() ? my_atof(hs_row->begin()) : 0.0);
|
|
}
|
|
|
|
my_decimal *spider_db_handlersocket_row::val_decimal(
|
|
my_decimal *decimal_value,
|
|
CHARSET_INFO *access_charset
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_row::val_decimal");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!hs_row->begin())
|
|
DBUG_RETURN(NULL);
|
|
|
|
#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
|
|
decimal_operation_results(str2my_decimal(0, hs_row->begin(), hs_row->size(),
|
|
access_charset, decimal_value), "", "");
|
|
#else
|
|
decimal_operation_results(str2my_decimal(0, hs_row->begin(), hs_row->size(),
|
|
access_charset, decimal_value));
|
|
#endif
|
|
|
|
DBUG_RETURN(decimal_value);
|
|
}
|
|
|
|
SPIDER_DB_ROW *spider_db_handlersocket_row::clone()
|
|
{
|
|
spider_db_handlersocket_row *clone_row;
|
|
char *tmp_char;
|
|
uint i;
|
|
DBUG_ENTER("spider_db_handlersocket_row::clone");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!(clone_row = new spider_db_handlersocket_row(dbton_id)))
|
|
{
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
if (!spider_bulk_malloc(spider_current_trx, 169, MYF(MY_WME),
|
|
&clone_row->hs_row, sizeof(SPIDER_HS_STRING_REF) * field_count,
|
|
&tmp_char, row_size,
|
|
NullS)
|
|
) {
|
|
delete clone_row;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
for (i = 0; i < field_count; i++)
|
|
{
|
|
memcpy(tmp_char, hs_row_first[i].begin(), hs_row_first[i].size());
|
|
clone_row->hs_row[i].set(tmp_char, hs_row_first[i].size());
|
|
tmp_char += hs_row_first[i].size();
|
|
}
|
|
clone_row->hs_row_first = clone_row->hs_row;
|
|
clone_row->cloned = TRUE;;
|
|
clone_row->row_size = row_size;;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
|
|
int spider_db_handlersocket_row::store_to_tmp_table(
|
|
TABLE *tmp_table,
|
|
spider_string *str
|
|
) {
|
|
uint i;
|
|
SPIDER_HS_STRING_REF *tmp_hs_row = hs_row;
|
|
DBUG_ENTER("spider_db_handlersocket_row::store_to_tmp_table");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
str->length(0);
|
|
for (i = 0; i < field_count; i++)
|
|
{
|
|
if (tmp_hs_row->begin())
|
|
{
|
|
if (str->reserve(tmp_hs_row->size()))
|
|
{
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
str->q_append(tmp_hs_row->begin(), tmp_hs_row->size());
|
|
}
|
|
tmp_hs_row++;
|
|
}
|
|
tmp_table->field[0]->set_notnull();
|
|
tmp_table->field[0]->store(
|
|
(const char *) hs_row,
|
|
sizeof(SPIDER_HS_STRING_REF) * field_count, &my_charset_bin);
|
|
tmp_table->field[1]->set_notnull();
|
|
tmp_table->field[1]->store(
|
|
str->ptr(), str->length(), &my_charset_bin);
|
|
tmp_table->field[2]->set_null();
|
|
DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
|
|
}
|
|
|
|
uint spider_db_handlersocket_row::get_byte_size()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_row::get_byte_size");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(row_size);
|
|
}
|
|
|
|
|
|
spider_db_handlersocket_result_buffer::spider_db_handlersocket_result_buffer(
|
|
) : spider_db_result_buffer()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result_buffer::spider_db_handlersocket_result_buffer");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_db_handlersocket_result_buffer::~spider_db_handlersocket_result_buffer()
|
|
{
|
|
DBUG_ENTER(
|
|
"spider_db_handlersocket_result_buffer::~spider_db_handlersocket_result_buffer");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
void spider_db_handlersocket_result_buffer::clear()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result_buffer::clear");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
hs_result.readbuf.clear();
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
bool spider_db_handlersocket_result_buffer::check_size(
|
|
longlong size
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_result_buffer::check_size");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if ((uint) hs_result.readbuf.real_size() > size)
|
|
{
|
|
hs_result.readbuf.real_free();
|
|
DBUG_RETURN(TRUE);
|
|
}
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
spider_db_handlersocket_result::spider_db_handlersocket_result(
|
|
SPIDER_DB_CONN *in_db_conn
|
|
) : spider_db_result(in_db_conn), row(in_db_conn->dbton_id)
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result::spider_db_handlersocket_result");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_db_handlersocket_result::~spider_db_handlersocket_result()
|
|
{
|
|
DBUG_ENTER(
|
|
"spider_db_handlersocket_result::~spider_db_handlersocket_result");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
bool spider_db_handlersocket_result::has_result()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result::has_result");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(((*hs_conn_p)->get_response_end_offset() > 0));
|
|
}
|
|
|
|
void spider_db_handlersocket_result::free_result()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result::free_result");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if ((*hs_conn_p)->get_response_end_offset() > 0)
|
|
{
|
|
(*hs_conn_p)->response_buf_remove();
|
|
if ((*hs_conn_p)->get_error_code())
|
|
{
|
|
DBUG_PRINT("info",("spider hs %d %s",
|
|
(*hs_conn_p)->get_error_code(),
|
|
(*hs_conn_p)->get_error().ptr()));
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
SPIDER_DB_ROW *spider_db_handlersocket_result::current_row()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result::current_row");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
|
|
}
|
|
|
|
SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_row");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!(row.hs_row = (SPIDER_HS_STRING_REF *)
|
|
(*hs_conn_p)->get_next_row()))
|
|
{
|
|
store_error_num = HA_ERR_END_OF_FILE;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
row.field_count = field_count;
|
|
row.hs_row_first = row.hs_row;
|
|
row.row_size = (*hs_conn_p)->get_row_size();
|
|
DBUG_RETURN((SPIDER_DB_ROW *) &row);
|
|
}
|
|
|
|
SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row_from_result_buffer(
|
|
spider_db_result_buffer *spider_res_buf
|
|
) {
|
|
spider_db_handlersocket_result_buffer *hs_res_buf;
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_row_from_result_buffer");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
hs_res_buf = (spider_db_handlersocket_result_buffer *) spider_res_buf;
|
|
if (!(row.hs_row = (SPIDER_HS_STRING_REF *)
|
|
(*hs_conn_p)->get_next_row_from_result(hs_res_buf->hs_result)))
|
|
{
|
|
store_error_num = HA_ERR_END_OF_FILE;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
row.field_count = field_count;
|
|
row.hs_row_first = row.hs_row;
|
|
row.row_size = (*hs_conn_p)->get_row_size_from_result(hs_res_buf->hs_result);
|
|
DBUG_RETURN((SPIDER_DB_ROW *) &row);
|
|
}
|
|
|
|
SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row_from_tmp_table(
|
|
TABLE *tmp_table
|
|
) {
|
|
uint i;
|
|
spider_string tmp_str1, tmp_str2;
|
|
const char *row_ptr;
|
|
SPIDER_HS_STRING_REF *tmp_hs_row;
|
|
uint field_count;
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_row_from_tmp_table");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
tmp_str1.init_calc_mem(171);
|
|
tmp_str2.init_calc_mem(173);
|
|
tmp_table->field[0]->val_str(tmp_str1.get_str());
|
|
tmp_table->field[1]->val_str(tmp_str2.get_str());
|
|
tmp_str1.mem_calc();
|
|
tmp_str2.mem_calc();
|
|
row_ptr = tmp_str2.ptr();
|
|
tmp_hs_row = (SPIDER_HS_STRING_REF *) tmp_str1.ptr();
|
|
field_count = tmp_str1.length() / sizeof(SPIDER_HS_STRING_REF);
|
|
row.hs_row = tmp_hs_row;
|
|
row.field_count = field_count;
|
|
row.hs_row_first = row.hs_row;
|
|
for (i = 0; i < field_count; i++)
|
|
{
|
|
if (tmp_hs_row->begin())
|
|
{
|
|
uint length = tmp_hs_row->size();
|
|
tmp_hs_row->set(row_ptr, length);
|
|
row_ptr += length;
|
|
}
|
|
tmp_hs_row++;
|
|
}
|
|
row.row_size = row_ptr - tmp_str2.ptr();
|
|
DBUG_RETURN((SPIDER_DB_ROW *) &row);
|
|
}
|
|
|
|
int spider_db_handlersocket_result::fetch_table_status(
|
|
int mode,
|
|
ha_statistics &stat
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_table_status");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_result::fetch_table_records(
|
|
int mode,
|
|
ha_rows &records
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_table_records");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_result::fetch_table_cardinality(
|
|
int mode,
|
|
TABLE *table,
|
|
longlong *cardinality,
|
|
uchar *cardinality_upd,
|
|
int bitmap_size
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_table_cardinality");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_result::fetch_table_mon_status(
|
|
int &status
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_table_mon_status");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
longlong spider_db_handlersocket_result::num_rows()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result::num_rows");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN((longlong) 0);
|
|
}
|
|
|
|
uint spider_db_handlersocket_result::num_fields()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result::num_fields");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(field_count);
|
|
}
|
|
|
|
void spider_db_handlersocket_result::move_to_pos(
|
|
longlong pos
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_result::move_to_pos");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_handlersocket_result::get_errno()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_result::get_errno");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info",("spider store_error_num=%d", store_error_num));
|
|
DBUG_RETURN(store_error_num);
|
|
}
|
|
|
|
#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
|
|
int spider_db_handlersocket_result::fetch_columns_for_discover_table_structure(
|
|
spider_string *str,
|
|
CHARSET_INFO *access_charset
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_columns_for_discover_table_structure");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
|
|
}
|
|
|
|
int spider_db_handlersocket_result::fetch_index_for_discover_table_structure(
|
|
spider_string *str,
|
|
CHARSET_INFO *access_charset
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_index_for_discover_table_structure");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
|
|
}
|
|
|
|
int spider_db_handlersocket_result::fetch_table_for_discover_table_structure(
|
|
spider_string *str,
|
|
SPIDER_SHARE *spider_share,
|
|
CHARSET_INFO *access_charset
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_result::fetch_table_for_discover_table_structure");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
|
|
}
|
|
#endif
|
|
|
|
spider_db_handlersocket::spider_db_handlersocket(
|
|
SPIDER_CONN *conn
|
|
) : spider_db_conn(conn),
|
|
handler_open_array_inited(FALSE),
|
|
request_key_req_first(NULL),
|
|
request_key_req_last(NULL),
|
|
request_key_snd_first(NULL),
|
|
request_key_snd_last(NULL),
|
|
request_key_reuse_first(NULL),
|
|
request_key_reuse_last(NULL)
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::spider_db_handlersocket");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
#else
|
|
hs_conn = NULL;
|
|
#endif
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_db_handlersocket::~spider_db_handlersocket()
|
|
{
|
|
st_spider_db_request_key *tmp_request_key;
|
|
DBUG_ENTER("spider_db_handlersocket::~spider_db_handlersocket");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (handler_open_array_inited)
|
|
{
|
|
reset_opened_handler();
|
|
spider_free_mem_calc(spider_current_trx,
|
|
handler_open_array_id,
|
|
handler_open_array.max_element *
|
|
handler_open_array.size_of_element);
|
|
delete_dynamic(&handler_open_array);
|
|
}
|
|
while (request_key_req_first)
|
|
{
|
|
tmp_request_key = request_key_req_first->next;
|
|
spider_free(spider_current_trx, request_key_req_first, MYF(0));
|
|
request_key_req_first = tmp_request_key;
|
|
}
|
|
while (request_key_snd_first)
|
|
{
|
|
tmp_request_key = request_key_snd_first->next;
|
|
spider_free(spider_current_trx, request_key_snd_first, MYF(0));
|
|
request_key_snd_first = tmp_request_key;
|
|
}
|
|
while (request_key_reuse_first)
|
|
{
|
|
tmp_request_key = request_key_reuse_first->next;
|
|
spider_free(spider_current_trx, request_key_reuse_first, MYF(0));
|
|
request_key_reuse_first = tmp_request_key;
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_handlersocket::init()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::init");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (
|
|
SPD_INIT_DYNAMIC_ARRAY2(&handler_open_array,
|
|
sizeof(SPIDER_LINK_FOR_HASH *), NULL, 16, 16, MYF(MY_WME))
|
|
) {
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
spider_alloc_calc_mem_init(handler_open_array, 79);
|
|
spider_alloc_calc_mem(spider_current_trx,
|
|
handler_open_array,
|
|
handler_open_array.max_element *
|
|
handler_open_array.size_of_element);
|
|
handler_open_array_inited = TRUE;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::is_connected()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::is_connected");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
DBUG_RETURN(hs_conn.operator->());
|
|
#else
|
|
DBUG_RETURN(hs_conn);
|
|
#endif
|
|
}
|
|
|
|
void spider_db_handlersocket::bg_connect()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::bg_connect");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_handlersocket::connect(
|
|
char *tgt_host,
|
|
char *tgt_username,
|
|
char *tgt_password,
|
|
long tgt_port,
|
|
char *tgt_socket,
|
|
char *server_name,
|
|
int connect_retry_count,
|
|
longlong connect_retry_interval
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::connect");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
SPIDER_HS_SOCKARGS sockargs;
|
|
sockargs.timeout = conn->connect_timeout;
|
|
sockargs.recv_timeout = conn->net_read_timeout;
|
|
sockargs.send_timeout = conn->net_write_timeout;
|
|
if (conn->hs_sock)
|
|
{
|
|
sockargs.family = AF_UNIX;
|
|
sockargs.set_unix_domain(conn->hs_sock);
|
|
} else {
|
|
char port_str[6];
|
|
my_sprintf(port_str, (port_str, "%05ld", conn->hs_port));
|
|
if (sockargs.resolve(conn->tgt_host, port_str) != 0)
|
|
{
|
|
my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
|
|
conn->tgt_host);
|
|
DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
|
|
}
|
|
}
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
if (!(hs_conn.operator->()))
|
|
#else
|
|
if (!(hs_conn))
|
|
#endif
|
|
{
|
|
hs_conn = SPIDER_HS_CONN_CREATE(sockargs);
|
|
} else {
|
|
hs_conn->reconnect();
|
|
spider_db_hs_request_buf_reset(conn);
|
|
}
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
if (!(hs_conn.operator->()))
|
|
#else
|
|
if (!(hs_conn))
|
|
#endif
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
while (hs_conn->get_error_code())
|
|
{
|
|
THD *thd = current_thd;
|
|
if (
|
|
!connect_retry_count ||
|
|
(thd && thd->killed)
|
|
) {
|
|
my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
|
|
conn->tgt_host);
|
|
DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
|
|
}
|
|
connect_retry_count--;
|
|
my_sleep((ulong) connect_retry_interval);
|
|
hs_conn->reconnect();
|
|
}
|
|
reset_request_key_req();
|
|
reset_request_key_snd();
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::ping()
|
|
{
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::ping");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if ((*hs_conn_p)->reconnect())
|
|
{
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
DBUG_RETURN(ER_SPIDER_HS_NUM);
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
|
|
reset_request_key_req();
|
|
reset_request_key_snd();
|
|
conn->opened_handlers = 0;
|
|
conn->db_conn->reset_opened_handler();
|
|
++conn->connection_id;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_db_handlersocket::bg_disconnect()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::bg_disconnect");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
void spider_db_handlersocket::disconnect()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::disconnect");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
if (hs_conn.operator->())
|
|
#else
|
|
DBUG_PRINT("info",("spider hs_conn=%p", hs_conn));
|
|
if (hs_conn)
|
|
#endif
|
|
{
|
|
hs_conn->close();
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
SPIDER_HS_CONN tmp_hs_conn;
|
|
tmp_hs_conn = hs_conn;
|
|
#else
|
|
delete hs_conn;
|
|
hs_conn = NULL;
|
|
#endif
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_handlersocket::set_net_timeout()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::set_net_timeout");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(hs_conn->set_timeout(
|
|
conn->net_write_timeout,
|
|
conn->net_read_timeout
|
|
));
|
|
}
|
|
|
|
int spider_db_handlersocket::exec_query(
|
|
const char *query,
|
|
uint length,
|
|
int quick_mode
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::query");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
DBUG_PRINT("info", ("spider hs_conn %p", hs_conn.operator->()));
|
|
#else
|
|
DBUG_PRINT("info", ("spider hs_conn %p", hs_conn));
|
|
#endif
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if (spider_param_general_log())
|
|
{
|
|
const char *tgt_str = conn->hs_sock ? conn->hs_sock : conn->tgt_host;
|
|
uint32 tgt_len = strlen(tgt_str);
|
|
spider_string tmp_query_str((*hs_conn_p)->get_writebuf_size() +
|
|
conn->tgt_wrapper_length +
|
|
tgt_len + (SPIDER_SQL_SPACE_LEN * 2));
|
|
tmp_query_str.init_calc_mem(231);
|
|
tmp_query_str.length(0);
|
|
tmp_query_str.q_append(conn->tgt_wrapper, conn->tgt_wrapper_length);
|
|
tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
|
|
tmp_query_str.q_append(tgt_str, tgt_len);
|
|
tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
|
|
tmp_query_str.q_append((*hs_conn_p)->get_writebuf_begin(),
|
|
(*hs_conn_p)->get_writebuf_size());
|
|
general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
|
|
tmp_query_str.length());
|
|
}
|
|
if ((*hs_conn_p)->request_send() < 0)
|
|
{
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
DBUG_RETURN(ER_SPIDER_HS_NUM);
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
move_request_key_to_snd();
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::get_errno()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::get_errno");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
stored_error = hs_conn->get_error_code();
|
|
DBUG_PRINT("info",("spider stored_error=%d", stored_error));
|
|
DBUG_RETURN(stored_error);
|
|
}
|
|
|
|
const char *spider_db_handlersocket::get_error()
|
|
{
|
|
const char *error_ptr;
|
|
DBUG_ENTER("spider_db_handlersocket::get_error");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
error_ptr = hs_conn->get_error().c_str();
|
|
#else
|
|
error_ptr = hs_conn->get_error().c_ptr();
|
|
#endif
|
|
DBUG_PRINT("info",("spider error=%s", error_ptr));
|
|
DBUG_RETURN(error_ptr);
|
|
}
|
|
|
|
bool spider_db_handlersocket::is_server_gone_error(
|
|
int error_num
|
|
) {
|
|
bool server_gone;
|
|
DBUG_ENTER("spider_db_handlersocket::is_server_gone_error");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
server_gone = (hs_conn->get_error_code() < 0);
|
|
DBUG_PRINT("info",("spider server_gone=%s", server_gone ? "TRUE" : "FALSE"));
|
|
DBUG_RETURN(server_gone);
|
|
}
|
|
|
|
bool spider_db_handlersocket::is_dup_entry_error(
|
|
int error_num
|
|
) {
|
|
bool dup_entry;
|
|
DBUG_ENTER("spider_db_handlersocket::is_dup_entry_error");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
#ifndef HANDLERSOCKET_MYSQL_UTIL
|
|
const char *c_str = hs_conn->get_error().c_str();
|
|
#else
|
|
const char *c_str = hs_conn->get_error().c_ptr_safe();
|
|
#endif
|
|
dup_entry =
|
|
(
|
|
c_str[0] == '1' &&
|
|
c_str[1] == '2' &&
|
|
c_str[2] == '1' &&
|
|
c_str[3] == '\0'
|
|
);
|
|
DBUG_PRINT("info",("spider dup_entry=%s", dup_entry ? "TRUE" : "FALSE"));
|
|
DBUG_RETURN(dup_entry);
|
|
}
|
|
|
|
bool spider_db_handlersocket::is_xa_nota_error(
|
|
int error_num
|
|
) {
|
|
bool xa_nota;
|
|
DBUG_ENTER("spider_db_handlersocket::is_xa_nota_error");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
xa_nota = (stored_error == ER_XAER_NOTA);
|
|
DBUG_PRINT("info",("spider xa_nota=%s", xa_nota ? "TRUE" : "FALSE"));
|
|
DBUG_RETURN(xa_nota);
|
|
}
|
|
|
|
spider_db_result *spider_db_handlersocket::store_result(
|
|
spider_db_result_buffer **spider_res_buf,
|
|
st_spider_db_request_key *request_key,
|
|
int *error_num
|
|
) {
|
|
int internal_error;
|
|
spider_db_handlersocket_result *result;
|
|
spider_db_handlersocket_result_buffer *hs_res_buf;
|
|
DBUG_ENTER("spider_db_handlersocket::store_result");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (*spider_res_buf)
|
|
{
|
|
hs_res_buf = (spider_db_handlersocket_result_buffer *) *spider_res_buf;
|
|
} else {
|
|
if (!(hs_res_buf = new spider_db_handlersocket_result_buffer()))
|
|
{
|
|
*error_num = HA_ERR_OUT_OF_MEM;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
*spider_res_buf = (spider_db_result_buffer *) hs_res_buf;
|
|
}
|
|
hs_res_buf->clear();
|
|
if (!(result = new spider_db_handlersocket_result(this)))
|
|
{
|
|
*error_num = HA_ERR_OUT_OF_MEM;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
*error_num = 0;
|
|
result->hs_conn_p = &hs_conn;
|
|
size_t num_fields;
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
if (request_key)
|
|
{
|
|
int tmp_res, tmp_err = (*hs_conn_p)->get_error_code();
|
|
while ((tmp_res = check_request_key(request_key)) == 1)
|
|
{
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if ((internal_error = (*hs_conn_p)->response_recv(num_fields)))
|
|
{
|
|
if (!tmp_err && internal_error > 0)
|
|
{
|
|
(*hs_conn_p)->clear_error();
|
|
} else {
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
#ifndef DBUG_OFF
|
|
if ((*hs_conn_p)->get_response_end_offset() > 0 &&
|
|
(*hs_conn_p)->get_readbuf_begin())
|
|
{
|
|
char tmp_buf[MAX_FIELD_WIDTH];
|
|
String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
|
|
tmp_str.length(0);
|
|
tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
|
|
(*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
|
|
DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
|
|
(*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
|
|
}
|
|
#endif
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if (internal_error > 0)
|
|
{
|
|
(*hs_conn_p)->response_buf_remove();
|
|
if ((*hs_conn_p)->get_error_code())
|
|
{
|
|
DBUG_PRINT("info",("spider hs %d %s",
|
|
(*hs_conn_p)->get_error_code(),
|
|
(*hs_conn_p)->get_error().ptr()));
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->clear_error();
|
|
}
|
|
delete result;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->response_buf_remove();
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
}
|
|
if (tmp_res == -1)
|
|
{
|
|
DBUG_PRINT("info",("spider ER_SPIDER_REQUEST_KEY_NUM"));
|
|
*error_num = ER_SPIDER_REQUEST_KEY_NUM;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if (
|
|
(internal_error = (*hs_conn_p)->response_recv(num_fields)) ||
|
|
(*error_num = (*hs_conn_p)->get_result(hs_res_buf->hs_result))
|
|
) {
|
|
if (*error_num)
|
|
{
|
|
*error_num = HA_ERR_OUT_OF_MEM;
|
|
}
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
#ifndef DBUG_OFF
|
|
if ((*hs_conn_p)->get_response_end_offset() > 0 &&
|
|
(*hs_conn_p)->get_readbuf_begin())
|
|
{
|
|
char tmp_buf[MAX_FIELD_WIDTH];
|
|
String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
|
|
tmp_str.length(0);
|
|
tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
|
|
(*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
|
|
DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
|
|
(*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
|
|
}
|
|
#endif
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if (internal_error > 0)
|
|
{
|
|
(*hs_conn_p)->response_buf_remove();
|
|
if ((*hs_conn_p)->get_error_code())
|
|
{
|
|
DBUG_PRINT("info",("spider hs %d %s",
|
|
(*hs_conn_p)->get_error_code(),
|
|
(*hs_conn_p)->get_error().ptr()));
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
}
|
|
delete result;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
#ifndef DBUG_OFF
|
|
if ((*hs_conn_p)->get_response_end_offset() > 0 &&
|
|
(*hs_conn_p)->get_readbuf_begin())
|
|
{
|
|
char tmp_buf[MAX_FIELD_WIDTH];
|
|
String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
|
|
tmp_str.length(0);
|
|
tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
|
|
(*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
|
|
DBUG_PRINT("info",("spider hs readbuf02 size=%zu str=%s",
|
|
(*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
|
|
}
|
|
#endif
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->response_buf_remove();
|
|
if ((*hs_conn_p)->get_error_code())
|
|
{
|
|
DBUG_PRINT("info",("spider hs %d %s",
|
|
(*hs_conn_p)->get_error_code(),
|
|
(*hs_conn_p)->get_error().ptr()));
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
field_count = (uint) num_fields;
|
|
result->field_count = field_count;
|
|
DBUG_RETURN(result);
|
|
}
|
|
|
|
spider_db_result *spider_db_handlersocket::use_result(
|
|
st_spider_db_request_key *request_key,
|
|
int *error_num
|
|
) {
|
|
int internal_error;
|
|
spider_db_handlersocket_result *result;
|
|
DBUG_ENTER("spider_db_handlersocket::use_result");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!(result = new spider_db_handlersocket_result(this)))
|
|
{
|
|
*error_num = HA_ERR_OUT_OF_MEM;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
*error_num = 0;
|
|
result->hs_conn_p = &hs_conn;
|
|
size_t num_fields;
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
if (request_key)
|
|
{
|
|
int tmp_res, tmp_err = (*hs_conn_p)->get_error_code();
|
|
while ((tmp_res = check_request_key(request_key)) == 1)
|
|
{
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if ((internal_error = (*hs_conn_p)->response_recv(num_fields)))
|
|
{
|
|
if (!tmp_err && internal_error > 0)
|
|
{
|
|
(*hs_conn_p)->clear_error();
|
|
} else {
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
#ifndef DBUG_OFF
|
|
if ((*hs_conn_p)->get_response_end_offset() > 0 &&
|
|
(*hs_conn_p)->get_readbuf_begin())
|
|
{
|
|
char tmp_buf[MAX_FIELD_WIDTH];
|
|
String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
|
|
tmp_str.length(0);
|
|
tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
|
|
(*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
|
|
DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
|
|
(*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
|
|
}
|
|
#endif
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if (internal_error > 0)
|
|
{
|
|
(*hs_conn_p)->response_buf_remove();
|
|
if ((*hs_conn_p)->get_error_code())
|
|
{
|
|
DBUG_PRINT("info",("spider hs %d %s",
|
|
(*hs_conn_p)->get_error_code(),
|
|
(*hs_conn_p)->get_error().ptr()));
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->clear_error();
|
|
}
|
|
delete result;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->response_buf_remove();
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
}
|
|
if (tmp_res == -1)
|
|
{
|
|
DBUG_PRINT("info",("spider ER_SPIDER_REQUEST_KEY_NUM"));
|
|
*error_num = ER_SPIDER_REQUEST_KEY_NUM;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if (
|
|
(internal_error = (*hs_conn_p)->response_recv(num_fields))
|
|
) {
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
#ifndef DBUG_OFF
|
|
if ((*hs_conn_p)->get_response_end_offset() > 0 &&
|
|
(*hs_conn_p)->get_readbuf_begin())
|
|
{
|
|
char tmp_buf[MAX_FIELD_WIDTH];
|
|
String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
|
|
tmp_str.length(0);
|
|
tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
|
|
(*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
|
|
DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
|
|
(*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
|
|
}
|
|
#endif
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if (internal_error > 0)
|
|
{
|
|
(*hs_conn_p)->response_buf_remove();
|
|
if ((*hs_conn_p)->get_error_code())
|
|
{
|
|
DBUG_PRINT("info",("spider hs %d %s",
|
|
(*hs_conn_p)->get_error_code(),
|
|
(*hs_conn_p)->get_error().ptr()));
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
}
|
|
delete result;
|
|
DBUG_RETURN(NULL);
|
|
}
|
|
#ifndef DBUG_OFF
|
|
if ((*hs_conn_p)->get_response_end_offset() > 0 &&
|
|
(*hs_conn_p)->get_readbuf_begin())
|
|
{
|
|
char tmp_buf[MAX_FIELD_WIDTH];
|
|
String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
|
|
tmp_str.length(0);
|
|
tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
|
|
(*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
|
|
DBUG_PRINT("info",("spider hs readbuf02 size=%zu str=%s",
|
|
(*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
|
|
}
|
|
#endif
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
field_count = (uint) num_fields;
|
|
result->field_count = field_count;
|
|
DBUG_RETURN(result);
|
|
}
|
|
|
|
int spider_db_handlersocket::next_result()
|
|
{
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::next_result");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
if ((*hs_conn_p)->stable_point())
|
|
DBUG_RETURN(-1);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
uint spider_db_handlersocket::affected_rows()
|
|
{
|
|
int error_num;
|
|
const SPIDER_HS_STRING_REF *hs_row;
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::affected_rows");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
if (
|
|
field_count != 1 ||
|
|
!(hs_row = (*hs_conn_p)->get_next_row()) ||
|
|
!hs_row->begin()
|
|
) {
|
|
DBUG_RETURN(0);
|
|
}
|
|
DBUG_RETURN((uint) my_strtoll10(hs_row->begin(), (char**) NULL, &error_num));
|
|
}
|
|
|
|
uint spider_db_handlersocket::matched_rows()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::matched_rows");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::inserted_info(
|
|
spider_db_handler *handler,
|
|
ha_copy_info *copy_info
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::inserted_info");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
ulonglong spider_db_handlersocket::last_insert_id()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::last_insert_id");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::set_character_set(
|
|
const char *csname
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::set_character_set");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::select_db(
|
|
const char *dbname
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::select_db");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::consistent_snapshot(
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::consistent_snapshot");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::trx_start_in_bulk_sql()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::trx_start_in_bulk_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_db_handlersocket::start_transaction(
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::start_transaction");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::commit(
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::commit");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::rollback(
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::rollback");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::xa_start_in_bulk_sql()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::xa_start_in_bulk_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_db_handlersocket::xa_start(
|
|
XID *xid,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::xa_start");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::xa_end(
|
|
XID *xid,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::xa_end");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::xa_prepare(
|
|
XID *xid,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::xa_prepare");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::xa_commit(
|
|
XID *xid,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::xa_commit");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::xa_rollback(
|
|
XID *xid,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::xa_rollback");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::set_trx_isolation_in_bulk_sql()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::set_trx_isolation_in_bulk_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_db_handlersocket::set_trx_isolation(
|
|
int trx_isolation,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::set_trx_isolation");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::set_autocommit_in_bulk_sql()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::set_autocommit_in_bulk_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_db_handlersocket::set_autocommit(
|
|
bool autocommit,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::set_autocommit");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::set_sql_log_off_in_bulk_sql()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::set_sql_log_off_in_bulk_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_db_handlersocket::set_sql_log_off(
|
|
bool sql_log_off,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::set_sql_log_off");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::set_wait_timeout_in_bulk_sql()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::set_wait_timeout_in_bulk_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_db_handlersocket::set_wait_timeout(
|
|
int wait_timeout,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::set_wait_timeout");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::set_sql_mode_in_bulk_sql()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::set_sql_mode_in_bulk_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_db_handlersocket::set_sql_mode(
|
|
sql_mode_t sql_mode,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::set_sql_mode");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::set_time_zone_in_bulk_sql()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::set_time_zone_in_bulk_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_db_handlersocket::set_time_zone(
|
|
Time_zone *time_zone,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::set_time_zone");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::show_master_status(
|
|
SPIDER_TRX *trx,
|
|
SPIDER_SHARE *share,
|
|
int all_link_idx,
|
|
int *need_mon,
|
|
TABLE *table,
|
|
spider_string *str,
|
|
int mode,
|
|
SPIDER_DB_RESULT **res1,
|
|
SPIDER_DB_RESULT **res2
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::show_master_status");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::append_sql(
|
|
char *sql,
|
|
ulong sql_length,
|
|
st_spider_db_request_key *request_key
|
|
) {
|
|
int error_num;
|
|
size_t req_num;
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::append_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if ((error_num = append_request_key(request_key)))
|
|
DBUG_RETURN(error_num);
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
if (!(req_num = (*hs_conn_p)->request_buf_append(sql, sql + sql_length)))
|
|
{
|
|
DBUG_PRINT("info",("spider hs %d %s",
|
|
(*hs_conn_p)->get_error_code(),
|
|
(*hs_conn_p)->get_error().ptr()));
|
|
(*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
|
|
DBUG_RETURN((*hs_conn_p)->get_error_code());
|
|
}
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
while (req_num > 1)
|
|
{
|
|
if ((error_num = append_request_key(request_key)))
|
|
DBUG_RETURN(error_num);
|
|
--req_num;
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::append_open_handler(
|
|
uint handler_id,
|
|
const char *db_name,
|
|
const char *table_name,
|
|
const char *index_name,
|
|
const char *sql,
|
|
st_spider_db_request_key *request_key
|
|
) {
|
|
int error_num;
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::append_open_handler");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if ((error_num = append_request_key(request_key)))
|
|
DBUG_RETURN(error_num);
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->request_buf_open_index(
|
|
handler_id,
|
|
db_name,
|
|
table_name,
|
|
index_name,
|
|
sql
|
|
);
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::append_select(
|
|
uint handler_id,
|
|
spider_string *sql,
|
|
SPIDER_DB_HS_STRING_REF_BUFFER *keys,
|
|
int limit,
|
|
int skip,
|
|
st_spider_db_request_key *request_key
|
|
) {
|
|
int error_num;
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::append_select");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if ((error_num = append_request_key(request_key)))
|
|
DBUG_RETURN(error_num);
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->request_buf_exec_generic(
|
|
handler_id,
|
|
SPIDER_HS_STRING_REF(sql->ptr(), sql->length()),
|
|
keys->ptr(), (size_t) keys->size(),
|
|
limit, skip,
|
|
SPIDER_HS_STRING_REF(),
|
|
NULL, 0);
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::append_insert(
|
|
uint handler_id,
|
|
SPIDER_DB_HS_STRING_REF_BUFFER *upds,
|
|
st_spider_db_request_key *request_key
|
|
) {
|
|
int error_num;
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::append_insert");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if ((error_num = append_request_key(request_key)))
|
|
DBUG_RETURN(error_num);
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->request_buf_exec_generic(
|
|
handler_id,
|
|
SPIDER_HS_STRING_REF(SPIDER_SQL_HS_INSERT_STR, SPIDER_SQL_HS_INSERT_LEN),
|
|
upds->ptr(), (size_t) upds->size(),
|
|
0, 0,
|
|
SPIDER_HS_STRING_REF(), NULL, 0);
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::append_update(
|
|
uint handler_id,
|
|
spider_string *sql,
|
|
SPIDER_DB_HS_STRING_REF_BUFFER *keys,
|
|
SPIDER_DB_HS_STRING_REF_BUFFER *upds,
|
|
int limit,
|
|
int skip,
|
|
bool increment,
|
|
bool decrement,
|
|
st_spider_db_request_key *request_key
|
|
) {
|
|
int error_num;
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::append_update");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if ((error_num = append_request_key(request_key)))
|
|
DBUG_RETURN(error_num);
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->request_buf_exec_generic(
|
|
handler_id,
|
|
SPIDER_HS_STRING_REF(sql->ptr(), sql->length()),
|
|
keys->ptr(), (size_t) keys->size(),
|
|
limit, skip,
|
|
increment ?
|
|
SPIDER_HS_STRING_REF(SPIDER_SQL_HS_INCREMENT_STR,
|
|
SPIDER_SQL_HS_INCREMENT_LEN) :
|
|
decrement ?
|
|
SPIDER_HS_STRING_REF(SPIDER_SQL_HS_DECREMENT_STR,
|
|
SPIDER_SQL_HS_DECREMENT_LEN) :
|
|
SPIDER_HS_STRING_REF(SPIDER_SQL_HS_UPDATE_STR,
|
|
SPIDER_SQL_HS_UPDATE_LEN),
|
|
upds->ptr(), (size_t) upds->size()
|
|
);
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::append_delete(
|
|
uint handler_id,
|
|
spider_string *sql,
|
|
SPIDER_DB_HS_STRING_REF_BUFFER *keys,
|
|
int limit,
|
|
int skip,
|
|
st_spider_db_request_key *request_key
|
|
) {
|
|
int error_num;
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::append_delete");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if ((error_num = append_request_key(request_key)))
|
|
DBUG_RETURN(error_num);
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->request_buf_exec_generic(
|
|
handler_id,
|
|
SPIDER_HS_STRING_REF(sql->ptr(), sql->length()),
|
|
keys->ptr(), (size_t) keys->size(),
|
|
limit, skip,
|
|
SPIDER_HS_STRING_REF(SPIDER_SQL_HS_DELETE_STR, SPIDER_SQL_HS_DELETE_LEN),
|
|
NULL, 0);
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_db_handlersocket::reset_request_queue()
|
|
{
|
|
SPIDER_HS_CONN *hs_conn_p = &hs_conn;
|
|
DBUG_ENTER("spider_db_handlersocket::reset_request_queue");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
(*hs_conn_p)->request_reset();
|
|
DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
|
|
(*hs_conn_p)->get_num_req_bufd()));
|
|
DBUG_PRINT("info",("spider hs num_req_sent=%zu",
|
|
(*hs_conn_p)->get_num_req_sent()));
|
|
DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
|
|
(*hs_conn_p)->get_num_req_rcvd()));
|
|
DBUG_PRINT("info",("spider hs response_end_offset=%zu",
|
|
(*hs_conn_p)->get_response_end_offset()));
|
|
reset_request_key_req();
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
size_t spider_db_handlersocket::escape_string(
|
|
char *to,
|
|
const char *from,
|
|
size_t from_length
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::escape_string");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
memcpy(to, from, from_length);
|
|
DBUG_RETURN(from_length);
|
|
}
|
|
|
|
bool spider_db_handlersocket::have_lock_table_list()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::have_lock_table_list");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_db_handlersocket::append_lock_tables(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::lock_tables");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket::append_unlock_tables(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::append_unlock_tables");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
uint spider_db_handlersocket::get_lock_table_hash_count()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::get_lock_table_hash_count");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_db_handlersocket::reset_lock_table_hash()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::reset_lock_table_hash");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
uint spider_db_handlersocket::get_opened_handler_count()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::get_opened_handler_count");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(handler_open_array.elements);
|
|
}
|
|
|
|
void spider_db_handlersocket::reset_opened_handler()
|
|
{
|
|
ha_spider *tmp_spider;
|
|
int tmp_link_idx;
|
|
SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
|
|
DBUG_ENTER("spider_db_handlersocket::reset_opened_handler");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
while ((tmp_link_for_hash =
|
|
(SPIDER_LINK_FOR_HASH **) pop_dynamic(&handler_open_array)))
|
|
{
|
|
tmp_spider = (*tmp_link_for_hash)->spider;
|
|
tmp_link_idx = (*tmp_link_for_hash)->link_idx;
|
|
tmp_spider->clear_handler_opened(tmp_link_idx, conn->conn_kind);
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
void spider_db_handlersocket::set_dup_key_idx(
|
|
ha_spider *spider,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::set_dup_key_idx");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_handlersocket::append_request_key(
|
|
st_spider_db_request_key *request_key
|
|
) {
|
|
st_spider_db_request_key *tmp_request_key;
|
|
DBUG_ENTER("spider_db_handlersocket::append_request_key");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info",("spider request_key=%p", request_key));
|
|
if (request_key)
|
|
{
|
|
DBUG_PRINT("info",("spider request_key->spider_thread_id=%llu",
|
|
request_key->spider_thread_id));
|
|
DBUG_PRINT("info",("spider request_key->query_id=%llu",
|
|
request_key->query_id));
|
|
DBUG_PRINT("info",("spider request_key->handler=%p",
|
|
request_key->handler));
|
|
DBUG_PRINT("info",("spider request_key->request_id=%llu",
|
|
request_key->request_id));
|
|
if (request_key_reuse_first)
|
|
{
|
|
tmp_request_key = request_key_reuse_first;
|
|
request_key_reuse_first = request_key_reuse_first->next;
|
|
if (!request_key_reuse_first)
|
|
request_key_reuse_last = NULL;
|
|
} else {
|
|
if (!(tmp_request_key = (st_spider_db_request_key *)
|
|
spider_malloc(spider_current_trx, 1, sizeof(st_spider_db_request_key),
|
|
MYF(MY_WME)))
|
|
)
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
*tmp_request_key = *request_key;
|
|
tmp_request_key->next = NULL;
|
|
if (request_key_req_last)
|
|
request_key_req_last->next = tmp_request_key;
|
|
else
|
|
request_key_req_first = tmp_request_key;
|
|
request_key_req_last = tmp_request_key;
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_db_handlersocket::reset_request_key_req()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::reset_request_key_req");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (request_key_req_first)
|
|
{
|
|
if (request_key_reuse_last)
|
|
request_key_reuse_last->next = request_key_req_first;
|
|
else
|
|
request_key_reuse_first = request_key_req_first;
|
|
request_key_reuse_last = request_key_req_last;
|
|
request_key_req_first = NULL;
|
|
request_key_req_last = NULL;
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
void spider_db_handlersocket::reset_request_key_snd()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::reset_request_key_snd");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (request_key_snd_first)
|
|
{
|
|
if (request_key_reuse_last)
|
|
request_key_reuse_last->next = request_key_snd_first;
|
|
else
|
|
request_key_reuse_first = request_key_snd_first;
|
|
request_key_reuse_last = request_key_snd_last;
|
|
request_key_snd_first = NULL;
|
|
request_key_snd_last = NULL;
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
void spider_db_handlersocket::move_request_key_to_snd()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket::move_request_key_to_snd");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (request_key_req_first)
|
|
{
|
|
if (request_key_snd_last)
|
|
request_key_snd_last->next = request_key_req_first;
|
|
else
|
|
request_key_snd_first = request_key_req_first;
|
|
request_key_snd_last = request_key_req_last;
|
|
request_key_req_first = NULL;
|
|
request_key_req_last = NULL;
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_handlersocket::check_request_key(
|
|
st_spider_db_request_key *request_key
|
|
) {
|
|
st_spider_db_request_key *tmp_request_key;
|
|
DBUG_ENTER("spider_db_handlersocket::check_request_key");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info",("spider request_key=%p", request_key));
|
|
DBUG_PRINT("info",("spider request_key_snd_first=%p",
|
|
request_key_snd_first));
|
|
if (!request_key_snd_first)
|
|
{
|
|
DBUG_PRINT("info",("spider -1"));
|
|
DBUG_RETURN(-1);
|
|
}
|
|
tmp_request_key = request_key_snd_first;
|
|
request_key_snd_first = request_key_snd_first->next;
|
|
if (!request_key_snd_first)
|
|
request_key_snd_last = NULL;
|
|
tmp_request_key->next = NULL;
|
|
if (request_key_reuse_last)
|
|
request_key_reuse_last->next = tmp_request_key;
|
|
else
|
|
request_key_reuse_first = tmp_request_key;
|
|
request_key_reuse_last = tmp_request_key;
|
|
|
|
DBUG_PRINT("info",("spider tmp_request_key->spider_thread_id=%llu",
|
|
tmp_request_key->spider_thread_id));
|
|
DBUG_PRINT("info",("spider request_key->spider_thread_id=%llu",
|
|
request_key->spider_thread_id));
|
|
DBUG_PRINT("info",("spider tmp_request_key->query_id=%llu",
|
|
tmp_request_key->query_id));
|
|
DBUG_PRINT("info",("spider request_key->query_id=%llu",
|
|
request_key->query_id));
|
|
DBUG_PRINT("info",("spider tmp_request_key->handler=%p",
|
|
tmp_request_key->handler));
|
|
DBUG_PRINT("info",("spider request_key->handler=%p",
|
|
request_key->handler));
|
|
DBUG_PRINT("info",("spider tmp_request_key->request_id=%llu",
|
|
tmp_request_key->request_id));
|
|
DBUG_PRINT("info",("spider request_key->request_id=%llu",
|
|
request_key->request_id));
|
|
if (
|
|
tmp_request_key->spider_thread_id != request_key->spider_thread_id ||
|
|
tmp_request_key->query_id != request_key->query_id ||
|
|
tmp_request_key->handler != request_key->handler ||
|
|
tmp_request_key->request_id != request_key->request_id
|
|
) {
|
|
DBUG_PRINT("info",("spider 1"));
|
|
DBUG_RETURN(1);
|
|
}
|
|
DBUG_PRINT("info",("spider 0"));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket::cmp_request_key_to_snd(
|
|
st_spider_db_request_key *request_key
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket::cmp_request_key_to_snd");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info",("spider request_key=%p", request_key));
|
|
if (
|
|
!request_key
|
|
) {
|
|
DBUG_PRINT("info",("spider TRUE"));
|
|
DBUG_RETURN(TRUE);
|
|
}
|
|
DBUG_PRINT("info",("spider request_key_snd_first=%p",
|
|
request_key_snd_first));
|
|
if (
|
|
!request_key_snd_first
|
|
) {
|
|
DBUG_PRINT("info",("spider FALSE"));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
DBUG_PRINT("info",("spider request_key_snd_first->spider_thread_id=%llu",
|
|
request_key_snd_first->spider_thread_id));
|
|
DBUG_PRINT("info",("spider request_key->spider_thread_id=%llu",
|
|
request_key->spider_thread_id));
|
|
DBUG_PRINT("info",("spider request_key_snd_first->query_id=%llu",
|
|
request_key_snd_first->query_id));
|
|
DBUG_PRINT("info",("spider request_key->query_id=%llu",
|
|
request_key->query_id));
|
|
DBUG_PRINT("info",("spider request_key_snd_first->handler=%p",
|
|
request_key_snd_first->handler));
|
|
DBUG_PRINT("info",("spider request_key->handler=%p",
|
|
request_key->handler));
|
|
DBUG_PRINT("info",("spider request_key_snd_first->request_id=%llu",
|
|
request_key_snd_first->request_id));
|
|
DBUG_PRINT("info",("spider request_key->request_id=%llu",
|
|
request_key->request_id));
|
|
if (
|
|
request_key_snd_first->spider_thread_id != request_key->spider_thread_id ||
|
|
request_key_snd_first->query_id != request_key->query_id ||
|
|
request_key_snd_first->handler != request_key->handler ||
|
|
request_key_snd_first->request_id != request_key->request_id
|
|
) {
|
|
DBUG_PRINT("info",("spider FALSE"));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
DBUG_PRINT("info",("spider TRUE"));
|
|
DBUG_RETURN(TRUE);
|
|
}
|
|
|
|
spider_db_handlersocket_util::spider_db_handlersocket_util() : spider_db_util()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_util::spider_db_handlersocket_util");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_db_handlersocket_util::~spider_db_handlersocket_util()
|
|
{
|
|
DBUG_ENTER("spider_db_handlersocket_util::~spider_db_handlersocket_util");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_name(
|
|
spider_string *str,
|
|
const char *name,
|
|
uint name_length
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_name");
|
|
str->q_append(name, name_length);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_name_with_charset(
|
|
spider_string *str,
|
|
const char *name,
|
|
uint name_length,
|
|
CHARSET_INFO *name_charset
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_name_with_charset");
|
|
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
|
|
str->append(name, name_length, name_charset);
|
|
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_escaped_name(
|
|
spider_string *str,
|
|
const char *name,
|
|
uint name_length
|
|
) {
|
|
int error_num;
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_name");
|
|
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
|
|
{
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
|
|
if ((error_num = spider_db_append_name_with_quote_str_internal(
|
|
str, name, name_length, dbton_id)))
|
|
{
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
|
|
{
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_escaped_name_with_charset(
|
|
spider_string *str,
|
|
const char *name,
|
|
uint name_length,
|
|
CHARSET_INFO *name_charset
|
|
) {
|
|
int error_num;
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_name_with_charset");
|
|
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
|
|
{
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
|
|
if ((error_num = spider_db_append_name_with_quote_str_internal(
|
|
str, name, name_length, name_charset, dbton_id)))
|
|
{
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
|
|
{
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_db_handlersocket_util::is_name_quote(
|
|
const char head_code
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::is_name_quote");
|
|
DBUG_RETURN(head_code == *name_quote_str);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_escaped_name_quote(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_escaped_name_quote");
|
|
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
|
|
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_column_value(
|
|
ha_spider *spider,
|
|
spider_string *str,
|
|
Field *field,
|
|
const uchar *new_ptr,
|
|
CHARSET_INFO *access_charset
|
|
) {
|
|
char buf[MAX_FIELD_WIDTH];
|
|
spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin);
|
|
String *ptr;
|
|
uint length;
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_column_value");
|
|
tmp_str.init_calc_mem(180);
|
|
|
|
if (new_ptr)
|
|
{
|
|
if (
|
|
field->type() == MYSQL_TYPE_BLOB ||
|
|
field->real_type() == MYSQL_TYPE_VARCHAR
|
|
) {
|
|
length = uint2korr(new_ptr);
|
|
tmp_str.set_quick((char *) new_ptr + HA_KEY_BLOB_LENGTH, length,
|
|
&my_charset_bin);
|
|
ptr = tmp_str.get_str();
|
|
} else if (field->type() == MYSQL_TYPE_GEOMETRY)
|
|
{
|
|
/*
|
|
uint mlength = SIZEOF_STORED_DOUBLE, lcnt;
|
|
uchar *dest = (uchar *) buf;
|
|
const uchar *source;
|
|
for (lcnt = 0; lcnt < 4; lcnt++)
|
|
{
|
|
mlength = SIZEOF_STORED_DOUBLE;
|
|
source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt;
|
|
while (mlength--)
|
|
*dest++ = *--source;
|
|
}
|
|
tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt);
|
|
*/
|
|
double xmin, xmax, ymin, ymax;
|
|
/*
|
|
float8store(buf,xmin);
|
|
float8store(buf+8,xmax);
|
|
float8store(buf+16,ymin);
|
|
float8store(buf+24,ymax);
|
|
memcpy(&xmin,new_ptr,sizeof(xmin));
|
|
memcpy(&xmax,new_ptr + 8,sizeof(xmax));
|
|
memcpy(&ymin,new_ptr + 16,sizeof(ymin));
|
|
memcpy(&ymax,new_ptr + 24,sizeof(ymax));
|
|
float8get(xmin, buf);
|
|
float8get(xmax, buf + 8);
|
|
float8get(ymin, buf + 16);
|
|
float8get(ymax, buf + 24);
|
|
DBUG_PRINT("info", ("spider geo is %f %f %f %f",
|
|
xmin, xmax, ymin, ymax));
|
|
DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g",
|
|
xmin, xmax, ymin, ymax));
|
|
*/
|
|
float8get(xmin, new_ptr);
|
|
float8get(xmax, new_ptr + 8);
|
|
float8get(ymin, new_ptr + 16);
|
|
float8get(ymax, new_ptr + 24);
|
|
DBUG_PRINT("info", ("spider geo is %f %f %f %f",
|
|
xmin, xmax, ymin, ymax));
|
|
/*
|
|
float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4);
|
|
float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5);
|
|
float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6);
|
|
float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7);
|
|
DBUG_PRINT("info", ("spider geo is %f %f %f %f",
|
|
xmin, xmax, ymin, ymax));
|
|
float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8);
|
|
float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9);
|
|
float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10);
|
|
float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11);
|
|
DBUG_PRINT("info", ("spider geo is %f %f %f %f",
|
|
xmin, xmax, ymin, ymax));
|
|
float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12);
|
|
float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13);
|
|
float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14);
|
|
float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15);
|
|
DBUG_PRINT("info", ("spider geo is %f %f %f %f",
|
|
xmin, xmax, ymin, ymax));
|
|
*/
|
|
/*
|
|
tmp_str.set_quick((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4,
|
|
&my_charset_bin);
|
|
*/
|
|
tmp_str.length(0);
|
|
tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR,
|
|
SPIDER_SQL_LINESTRING_HEAD_LEN);
|
|
tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE);
|
|
tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2,
|
|
SIZEOF_STORED_DOUBLE);
|
|
tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE,
|
|
SIZEOF_STORED_DOUBLE);
|
|
tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3,
|
|
SIZEOF_STORED_DOUBLE);
|
|
ptr = tmp_str.get_str();
|
|
} else {
|
|
ptr = field->val_str(tmp_str.get_str(), new_ptr);
|
|
tmp_str.mem_calc();
|
|
}
|
|
} else {
|
|
ptr = field->val_str(tmp_str.get_str());
|
|
tmp_str.mem_calc();
|
|
}
|
|
DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
|
|
DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
|
|
/*
|
|
if (
|
|
field->type() == MYSQL_TYPE_BIT ||
|
|
(field->type() >= MYSQL_TYPE_TINY_BLOB &&
|
|
field->type() <= MYSQL_TYPE_BLOB)
|
|
) {
|
|
uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr;
|
|
char *str_ptr;
|
|
DBUG_PRINT("info", ("spider HEX"));
|
|
if (str->reserve(SPIDER_SQL_HEX_LEN + 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 + 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() + ptr->length() * 2);
|
|
} else
|
|
*/
|
|
spider_handlersocket_handler *hs_handler = (spider_handlersocket_handler *)
|
|
spider->dbton_handler[spider_dbton_handlersocket.dbton_id];
|
|
spider_string *hs_str;
|
|
if (!(hs_str = hs_handler->hs_strs.add(
|
|
&hs_handler->hs_strs_pos, ptr->ptr(), ptr->length())))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
SPIDER_HS_STRING_REF ref =
|
|
SPIDER_HS_STRING_REF(hs_str->ptr(), hs_str->length());
|
|
if (hs_handler->hs_adding_keys)
|
|
{
|
|
DBUG_PRINT("info", ("spider add to key:%s", hs_str->c_ptr_safe()));
|
|
hs_handler->hs_keys.push_back(ref);
|
|
} else {
|
|
DBUG_PRINT("info", ("spider add to upd:%s", hs_str->c_ptr_safe()));
|
|
hs_handler->hs_upds.push_back(ref);
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_trx_isolation(
|
|
spider_string *str,
|
|
int trx_isolation
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_trx_isolation");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_autocommit(
|
|
spider_string *str,
|
|
bool autocommit
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_autocommit");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_sql_log_off(
|
|
spider_string *str,
|
|
bool sql_log_off
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_sql_log_off");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_wait_timeout(
|
|
spider_string *str,
|
|
int wait_timeout
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_wait_timeout");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_sql_mode(
|
|
spider_string *str,
|
|
sql_mode_t sql_mode
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_sql_mode");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_time_zone(
|
|
spider_string *str,
|
|
Time_zone *time_zone
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_time_zone");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_start_transaction(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_start_transaction");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_xa_start(
|
|
spider_string *str,
|
|
XID *xid
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_xa_start");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_lock_table_head(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_lock_table_head");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_lock_table_body(
|
|
spider_string *str,
|
|
const char *db_name,
|
|
uint db_name_length,
|
|
CHARSET_INFO *db_name_charset,
|
|
const char *table_name,
|
|
uint table_name_length,
|
|
CHARSET_INFO *table_name_charset,
|
|
int lock_type
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_lock_table_body");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_lock_table_tail(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_lock_table_tail");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_unlock_table(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_unlock_table");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::open_item_func(
|
|
Item_func *item_func,
|
|
ha_spider *spider,
|
|
spider_string *str,
|
|
const char *alias,
|
|
uint alias_length,
|
|
bool use_fields,
|
|
spider_fields *fields
|
|
) {
|
|
uint dbton_id = spider_dbton_handlersocket.dbton_id;
|
|
int error_num;
|
|
Item *item, **item_list = item_func->arguments();
|
|
uint roop_count, item_count = item_func->argument_count(), start_item = 0;
|
|
const char *func_name = SPIDER_SQL_NULL_CHAR_STR,
|
|
*separator_str = SPIDER_SQL_NULL_CHAR_STR,
|
|
*last_str = SPIDER_SQL_NULL_CHAR_STR;
|
|
int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
|
|
separator_str_length = SPIDER_SQL_NULL_CHAR_LEN,
|
|
last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
|
|
int use_pushdown_udf;
|
|
bool merge_func = FALSE;
|
|
DBUG_ENTER("spider_db_handlersocket_util::open_item_func");
|
|
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);
|
|
}
|
|
DBUG_PRINT("info",("spider functype = %d", item_func->functype()));
|
|
switch (item_func->functype())
|
|
{
|
|
case Item_func::ISNULL_FUNC:
|
|
last_str = SPIDER_SQL_IS_NULL_STR;
|
|
last_str_length = SPIDER_SQL_IS_NULL_LEN;
|
|
break;
|
|
case Item_func::ISNOTNULL_FUNC:
|
|
last_str = SPIDER_SQL_IS_NOT_NULL_STR;
|
|
last_str_length = SPIDER_SQL_IS_NOT_NULL_LEN;
|
|
break;
|
|
case Item_func::UNKNOWN_FUNC:
|
|
func_name = (char*) item_func->func_name();
|
|
func_name_length = strlen(func_name);
|
|
DBUG_PRINT("info",("spider func_name = %s", func_name));
|
|
DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
|
|
if (func_name_length == 1 &&
|
|
(
|
|
!strncasecmp("+", func_name, func_name_length) ||
|
|
!strncasecmp("-", func_name, func_name_length) ||
|
|
!strncasecmp("*", func_name, func_name_length) ||
|
|
!strncasecmp("/", func_name, func_name_length) ||
|
|
!strncasecmp("%", func_name, func_name_length) ||
|
|
!strncasecmp("&", func_name, func_name_length) ||
|
|
!strncasecmp("|", func_name, func_name_length) ||
|
|
!strncasecmp("^", func_name, func_name_length)
|
|
)
|
|
) {
|
|
/* no action */
|
|
break;
|
|
} else if (func_name_length == 2 &&
|
|
(
|
|
!strncasecmp("<<", func_name, func_name_length) ||
|
|
!strncasecmp(">>", func_name, func_name_length)
|
|
)
|
|
) {
|
|
/* no action */
|
|
break;
|
|
} else if (func_name_length == 3 &&
|
|
!strncasecmp("div", func_name, func_name_length)
|
|
) {
|
|
/* no action */
|
|
break;
|
|
} else if (func_name_length == 4)
|
|
{
|
|
if (
|
|
!strncasecmp("rand", func_name, func_name_length) &&
|
|
#ifdef SPIDER_Item_args_arg_count_IS_PROTECTED
|
|
!item_func->argument_count()
|
|
#else
|
|
!item_func->arg_count
|
|
#endif
|
|
) {
|
|
if (str)
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields));
|
|
} else if (
|
|
!strncasecmp("case", func_name, func_name_length)
|
|
) {
|
|
#ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC
|
|
Item_func_case *item_func_case = (Item_func_case *) item_func;
|
|
if (str)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_CASE_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN);
|
|
}
|
|
if (item_func_case->first_expr_num != -1)
|
|
{
|
|
if ((error_num = spider_db_print_item_type(
|
|
item_list[item_func_case->first_expr_num], NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields)))
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
for (roop_count = 0; roop_count < item_func_case->ncases;
|
|
roop_count += 2)
|
|
{
|
|
if (str)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_WHEN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN);
|
|
}
|
|
if ((error_num = spider_db_print_item_type(
|
|
item_list[roop_count], NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields)))
|
|
DBUG_RETURN(error_num);
|
|
if (str)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_THEN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN);
|
|
}
|
|
if ((error_num = spider_db_print_item_type(
|
|
item_list[roop_count + 1], NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields)))
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
if (item_func_case->else_expr_num != -1)
|
|
{
|
|
if (str)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_ELSE_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN);
|
|
}
|
|
if ((error_num = spider_db_print_item_type(
|
|
item_list[item_func_case->else_expr_num], NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields)))
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
if (str)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN);
|
|
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
|
|
SPIDER_SQL_CLOSE_PAREN_LEN);
|
|
}
|
|
DBUG_RETURN(0);
|
|
#else
|
|
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
|
|
#endif
|
|
}
|
|
} else if (func_name_length == 6 &&
|
|
!strncasecmp("istrue", func_name, func_name_length)
|
|
) {
|
|
last_str = SPIDER_SQL_IS_TRUE_STR;
|
|
last_str_length = SPIDER_SQL_IS_TRUE_LEN;
|
|
break;
|
|
} else if (func_name_length == 7)
|
|
{
|
|
if (!strncasecmp("isfalse", func_name, func_name_length))
|
|
{
|
|
last_str = SPIDER_SQL_IS_FALSE_STR;
|
|
last_str_length = SPIDER_SQL_IS_FALSE_LEN;
|
|
break;
|
|
} else if (
|
|
!strncasecmp("sysdate", func_name, func_name_length) ||
|
|
!strncasecmp("curdate", func_name, func_name_length) ||
|
|
!strncasecmp("curtime", func_name, func_name_length)
|
|
) {
|
|
if (str)
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields));
|
|
} else if (
|
|
!strncasecmp("convert", func_name, func_name_length)
|
|
) {
|
|
if (str)
|
|
{
|
|
if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
|
|
SPIDER_SQL_OPEN_PAREN_LEN);
|
|
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
|
|
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
}
|
|
break;
|
|
}
|
|
} else if (func_name_length == 8 &&
|
|
(
|
|
!strncasecmp("utc_date", func_name, func_name_length) ||
|
|
!strncasecmp("utc_time", func_name, func_name_length)
|
|
)
|
|
) {
|
|
if (str)
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields));
|
|
} else if (func_name_length == 9 &&
|
|
!strncasecmp("isnottrue", func_name, func_name_length)
|
|
) {
|
|
last_str = SPIDER_SQL_IS_NOT_TRUE_STR;
|
|
last_str_length = SPIDER_SQL_IS_NOT_TRUE_LEN;
|
|
break;
|
|
} else if (func_name_length == 10)
|
|
{
|
|
if (!strncasecmp("isnotfalse", func_name, func_name_length))
|
|
{
|
|
last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
|
|
last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
|
|
break;
|
|
} else if (!strncasecmp("column_get", func_name, func_name_length))
|
|
{
|
|
if (str)
|
|
{
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
|
|
}
|
|
func_name = SPIDER_SQL_COMMA_STR;
|
|
func_name_length = SPIDER_SQL_COMMA_LEN;
|
|
separator_str = SPIDER_SQL_COMMA_STR;
|
|
separator_str_length = SPIDER_SQL_COMMA_LEN;
|
|
break;
|
|
}
|
|
} else if (func_name_length == 12)
|
|
{
|
|
if (!strncasecmp("cast_as_date", func_name, func_name_length))
|
|
{
|
|
item = item_list[0];
|
|
if (item->type() == Item::FUNC_ITEM)
|
|
{
|
|
DBUG_PRINT("info",("spider child is FUNC_ITEM"));
|
|
Item_func *ifunc = (Item_func *) item;
|
|
if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
|
|
{
|
|
const char *child_func_name;
|
|
int child_func_name_length;
|
|
DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
|
|
child_func_name = (char*) ifunc->func_name();
|
|
child_func_name_length = strlen(child_func_name);
|
|
DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
|
|
if (
|
|
child_func_name_length == 10 &&
|
|
!strncasecmp("column_get", child_func_name, child_func_name_length)
|
|
) {
|
|
DBUG_PRINT("info",("spider this is merge func"));
|
|
merge_func = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (str)
|
|
{
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (!merge_func)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_CAST_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
|
|
}
|
|
}
|
|
last_str = SPIDER_SQL_AS_DATE_STR;
|
|
last_str_length = SPIDER_SQL_AS_DATE_LEN;
|
|
break;
|
|
} else if (!strncasecmp("cast_as_time", func_name, func_name_length))
|
|
{
|
|
item = item_list[0];
|
|
if (item->type() == Item::FUNC_ITEM)
|
|
{
|
|
DBUG_PRINT("info",("spider child is FUNC_ITEM"));
|
|
Item_func *ifunc = (Item_func *) item;
|
|
if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
|
|
{
|
|
const char *child_func_name;
|
|
int child_func_name_length;
|
|
DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
|
|
child_func_name = (char*) ifunc->func_name();
|
|
child_func_name_length = strlen(child_func_name);
|
|
DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
|
|
if (
|
|
child_func_name_length == 10 &&
|
|
!strncasecmp("column_get", child_func_name, child_func_name_length)
|
|
) {
|
|
DBUG_PRINT("info",("spider this is merge func"));
|
|
merge_func = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (str)
|
|
{
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (!merge_func)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_CAST_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
|
|
}
|
|
}
|
|
last_str = SPIDER_SQL_AS_TIME_STR;
|
|
last_str_length = SPIDER_SQL_AS_TIME_LEN;
|
|
break;
|
|
}
|
|
} else if (func_name_length == 13)
|
|
{
|
|
if (!strncasecmp("utc_timestamp", func_name, func_name_length))
|
|
{
|
|
if (str)
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields));
|
|
} else if (!strncasecmp("timestampdiff", func_name, func_name_length))
|
|
{
|
|
#ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
|
|
Item_func_timestamp_diff *item_func_timestamp_diff =
|
|
(Item_func_timestamp_diff *) item_func;
|
|
if (str)
|
|
{
|
|
const char *interval_str;
|
|
uint interval_len;
|
|
switch (item_func_timestamp_diff->int_type)
|
|
{
|
|
case INTERVAL_YEAR:
|
|
interval_str = SPIDER_SQL_YEAR_STR;
|
|
interval_len = SPIDER_SQL_YEAR_LEN;
|
|
break;
|
|
case INTERVAL_QUARTER:
|
|
interval_str = SPIDER_SQL_QUARTER_STR;
|
|
interval_len = SPIDER_SQL_QUARTER_LEN;
|
|
break;
|
|
case INTERVAL_MONTH:
|
|
interval_str = SPIDER_SQL_MONTH_STR;
|
|
interval_len = SPIDER_SQL_MONTH_LEN;
|
|
break;
|
|
case INTERVAL_WEEK:
|
|
interval_str = SPIDER_SQL_WEEK_STR;
|
|
interval_len = SPIDER_SQL_WEEK_LEN;
|
|
break;
|
|
case INTERVAL_DAY:
|
|
interval_str = SPIDER_SQL_DAY_STR;
|
|
interval_len = SPIDER_SQL_DAY_LEN;
|
|
break;
|
|
case INTERVAL_HOUR:
|
|
interval_str = SPIDER_SQL_HOUR_STR;
|
|
interval_len = SPIDER_SQL_HOUR_LEN;
|
|
break;
|
|
case INTERVAL_MINUTE:
|
|
interval_str = SPIDER_SQL_MINUTE_STR;
|
|
interval_len = SPIDER_SQL_MINUTE_LEN;
|
|
break;
|
|
case INTERVAL_SECOND:
|
|
interval_str = SPIDER_SQL_SECOND_STR;
|
|
interval_len = SPIDER_SQL_SECOND_LEN;
|
|
break;
|
|
case INTERVAL_MICROSECOND:
|
|
interval_str = SPIDER_SQL_MICROSECOND_STR;
|
|
interval_len = SPIDER_SQL_MICROSECOND_LEN;
|
|
break;
|
|
default:
|
|
interval_str = "";
|
|
interval_len = 0;
|
|
break;
|
|
}
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN +
|
|
interval_len + SPIDER_SQL_COMMA_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
|
|
str->q_append(interval_str, interval_len);
|
|
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
|
|
}
|
|
if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
|
|
str, alias, alias_length, dbton_id, use_fields, fields)))
|
|
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_print_item_type(item_list[1], NULL, spider,
|
|
str, alias, alias_length, dbton_id, use_fields, fields)))
|
|
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);
|
|
#else
|
|
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
|
|
#endif
|
|
}
|
|
} else if (func_name_length == 14)
|
|
{
|
|
if (!strncasecmp("cast_as_binary", func_name, func_name_length))
|
|
{
|
|
item = item_list[0];
|
|
if (item->type() == Item::FUNC_ITEM)
|
|
{
|
|
DBUG_PRINT("info",("spider child is FUNC_ITEM"));
|
|
Item_func *ifunc = (Item_func *) item;
|
|
if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
|
|
{
|
|
const char *child_func_name;
|
|
int child_func_name_length;
|
|
DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
|
|
child_func_name = (char*) ifunc->func_name();
|
|
child_func_name_length = strlen(child_func_name);
|
|
DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
|
|
if (
|
|
child_func_name_length == 10 &&
|
|
!strncasecmp("column_get", child_func_name, child_func_name_length)
|
|
) {
|
|
DBUG_PRINT("info",("spider this is merge func"));
|
|
merge_func = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (str)
|
|
{
|
|
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
|
|
spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
|
|
tmp_str.init_calc_mem(123);
|
|
tmp_str.length(0);
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (!merge_func)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_CAST_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
|
|
}
|
|
#if MYSQL_VERSION_ID < 50500
|
|
item_func->print(tmp_str.get_str(), QT_IS);
|
|
#else
|
|
item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
|
|
#endif
|
|
tmp_str.mem_calc();
|
|
if (tmp_str.reserve(1))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
tmp_ptr = tmp_str.c_ptr_quick();
|
|
DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
|
|
while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR)))
|
|
tmp_ptr = tmp_ptr2 + 1;
|
|
last_str = tmp_ptr - 1;
|
|
last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
}
|
|
break;
|
|
} else if (!strncasecmp("cast_as_signed", func_name, func_name_length))
|
|
{
|
|
item = item_list[0];
|
|
if (item->type() == Item::FUNC_ITEM)
|
|
{
|
|
DBUG_PRINT("info",("spider child is FUNC_ITEM"));
|
|
Item_func *ifunc = (Item_func *) item;
|
|
if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
|
|
{
|
|
const char *child_func_name;
|
|
int child_func_name_length;
|
|
DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
|
|
child_func_name = (char*) ifunc->func_name();
|
|
child_func_name_length = strlen(child_func_name);
|
|
DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
|
|
if (
|
|
child_func_name_length == 10 &&
|
|
!strncasecmp("column_get", child_func_name, child_func_name_length)
|
|
) {
|
|
DBUG_PRINT("info",("spider this is merge func"));
|
|
merge_func = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (str)
|
|
{
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (!merge_func)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_CAST_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
|
|
}
|
|
}
|
|
last_str = SPIDER_SQL_AS_SIGNED_STR;
|
|
last_str_length = SPIDER_SQL_AS_SIGNED_LEN;
|
|
break;
|
|
}
|
|
} else if (func_name_length == 16)
|
|
{
|
|
if (!strncasecmp("cast_as_unsigned", func_name, func_name_length))
|
|
{
|
|
item = item_list[0];
|
|
if (item->type() == Item::FUNC_ITEM)
|
|
{
|
|
DBUG_PRINT("info",("spider child is FUNC_ITEM"));
|
|
Item_func *ifunc = (Item_func *) item;
|
|
if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
|
|
{
|
|
const char *child_func_name;
|
|
int child_func_name_length;
|
|
DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
|
|
child_func_name = (char*) ifunc->func_name();
|
|
child_func_name_length = strlen(child_func_name);
|
|
DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
|
|
if (
|
|
child_func_name_length == 10 &&
|
|
!strncasecmp("column_get", child_func_name, child_func_name_length)
|
|
) {
|
|
DBUG_PRINT("info",("spider this is merge func"));
|
|
merge_func = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (str)
|
|
{
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (!merge_func)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_CAST_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
|
|
}
|
|
}
|
|
last_str = SPIDER_SQL_AS_UNSIGNED_STR;
|
|
last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN;
|
|
break;
|
|
} else if (!strncasecmp("decimal_typecast", func_name,
|
|
func_name_length))
|
|
{
|
|
item = item_list[0];
|
|
if (item->type() == Item::FUNC_ITEM)
|
|
{
|
|
DBUG_PRINT("info",("spider child is FUNC_ITEM"));
|
|
Item_func *ifunc = (Item_func *) item;
|
|
if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
|
|
{
|
|
const char *child_func_name;
|
|
int child_func_name_length;
|
|
DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
|
|
child_func_name = (char*) ifunc->func_name();
|
|
child_func_name_length = strlen(child_func_name);
|
|
DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
|
|
if (
|
|
child_func_name_length == 10 &&
|
|
!strncasecmp("column_get", child_func_name, child_func_name_length)
|
|
) {
|
|
DBUG_PRINT("info",("spider this is merge func"));
|
|
merge_func = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (str)
|
|
{
|
|
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
|
|
spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
|
|
tmp_str.init_calc_mem(124);
|
|
tmp_str.length(0);
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (!merge_func)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_CAST_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
|
|
}
|
|
#if MYSQL_VERSION_ID < 50500
|
|
item_func->print(tmp_str.get_str(), QT_IS);
|
|
#else
|
|
item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
|
|
#endif
|
|
tmp_str.mem_calc();
|
|
if (tmp_str.reserve(1))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
tmp_ptr = tmp_str.c_ptr_quick();
|
|
DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
|
|
while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR)))
|
|
tmp_ptr = tmp_ptr2 + 1;
|
|
last_str = tmp_ptr - 1;
|
|
last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
}
|
|
break;
|
|
} else if (!strncasecmp("cast_as_datetime", func_name,
|
|
func_name_length))
|
|
{
|
|
item = item_list[0];
|
|
if (item->type() == Item::FUNC_ITEM)
|
|
{
|
|
DBUG_PRINT("info",("spider child is FUNC_ITEM"));
|
|
Item_func *ifunc = (Item_func *) item;
|
|
if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
|
|
{
|
|
const char *child_func_name;
|
|
int child_func_name_length;
|
|
DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
|
|
child_func_name = (char*) ifunc->func_name();
|
|
child_func_name_length = strlen(child_func_name);
|
|
DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
|
|
if (
|
|
child_func_name_length == 10 &&
|
|
!strncasecmp("column_get", child_func_name, child_func_name_length)
|
|
) {
|
|
DBUG_PRINT("info",("spider this is merge func"));
|
|
merge_func = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (str)
|
|
{
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (!merge_func)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_CAST_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
|
|
}
|
|
}
|
|
last_str = SPIDER_SQL_AS_DATETIME_STR;
|
|
last_str_length = SPIDER_SQL_AS_DATETIME_LEN;
|
|
break;
|
|
}
|
|
} else if (func_name_length == 17)
|
|
{
|
|
if (!strncasecmp("date_add_interval", func_name, func_name_length))
|
|
{
|
|
Item_date_add_interval *item_date_add_interval =
|
|
(Item_date_add_interval *) item_func;
|
|
func_name = spider_db_timefunc_interval_str[
|
|
item_date_add_interval->int_type];
|
|
func_name_length = strlen(func_name);
|
|
if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
|
|
str, alias, alias_length, dbton_id, use_fields, fields)))
|
|
DBUG_RETURN(error_num);
|
|
if (str)
|
|
{
|
|
if (item_date_add_interval->date_sub_interval)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_NEGINTERVAL_STR,
|
|
SPIDER_SQL_NEGINTERVAL_LEN);
|
|
} else {
|
|
if (str->reserve(SPIDER_SQL_INTERVAL_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN);
|
|
}
|
|
}
|
|
if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
|
|
str, alias, alias_length, dbton_id, use_fields, fields)))
|
|
DBUG_RETURN(error_num);
|
|
if (str)
|
|
{
|
|
if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
|
|
SPIDER_SQL_CLOSE_PAREN_LEN);
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
}
|
|
if (str)
|
|
{
|
|
if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
|
|
}
|
|
func_name = SPIDER_SQL_COMMA_STR;
|
|
func_name_length = SPIDER_SQL_COMMA_LEN;
|
|
separator_str = SPIDER_SQL_COMMA_STR;
|
|
separator_str_length = SPIDER_SQL_COMMA_LEN;
|
|
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
|
|
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
break;
|
|
case Item_func::NOW_FUNC:
|
|
if (str)
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields));
|
|
case Item_func::CHAR_TYPECAST_FUNC:
|
|
DBUG_PRINT("info",("spider CHAR_TYPECAST_FUNC"));
|
|
{
|
|
item = item_list[0];
|
|
if (item->type() == Item::FUNC_ITEM)
|
|
{
|
|
DBUG_PRINT("info",("spider child is FUNC_ITEM"));
|
|
Item_func *ifunc = (Item_func *) item;
|
|
if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
|
|
{
|
|
const char *child_func_name;
|
|
int child_func_name_length;
|
|
DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
|
|
child_func_name = (char*) ifunc->func_name();
|
|
child_func_name_length = strlen(child_func_name);
|
|
DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
|
|
if (
|
|
child_func_name_length == 10 &&
|
|
!strncasecmp("column_get", child_func_name, child_func_name_length)
|
|
) {
|
|
DBUG_PRINT("info",("spider this is merge func"));
|
|
merge_func = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (str)
|
|
{
|
|
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
|
|
spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
|
|
tmp_str.init_calc_mem(125);
|
|
tmp_str.length(0);
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (!merge_func)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_CAST_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
|
|
}
|
|
#if MYSQL_VERSION_ID < 50500
|
|
item_func->print(tmp_str.get_str(), QT_IS);
|
|
#else
|
|
item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
|
|
#endif
|
|
tmp_str.mem_calc();
|
|
if (tmp_str.reserve(1))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
tmp_ptr = tmp_str.c_ptr_quick();
|
|
DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
|
|
while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR)))
|
|
tmp_ptr = tmp_ptr2 + 1;
|
|
last_str = tmp_ptr - 1;
|
|
last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
}
|
|
}
|
|
break;
|
|
case Item_func::NOT_FUNC:
|
|
DBUG_PRINT("info",("spider NOT_FUNC"));
|
|
if (item_list[0]->type() == Item::COND_ITEM)
|
|
{
|
|
DBUG_PRINT("info",("spider item_list[0] is COND_ITEM"));
|
|
Item_cond *item_cond = (Item_cond *) item_list[0];
|
|
if (item_cond->functype() == Item_func::COND_AND_FUNC)
|
|
{
|
|
DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC"));
|
|
List_iterator_fast<Item> lif(*(item_cond->argument_list()));
|
|
bool has_expr_cache_item = FALSE;
|
|
bool has_isnotnull_func = FALSE;
|
|
bool has_other_item = FALSE;
|
|
while((item = lif++))
|
|
{
|
|
#ifdef SPIDER_HAS_EXPR_CACHE_ITEM
|
|
if (
|
|
item->type() == Item::EXPR_CACHE_ITEM
|
|
) {
|
|
DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
|
|
has_expr_cache_item = TRUE;
|
|
} else
|
|
#endif
|
|
if (
|
|
item->type() == Item::FUNC_ITEM &&
|
|
((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
|
|
) {
|
|
DBUG_PRINT("info",("spider ISNOTNULL_FUNC"));
|
|
has_isnotnull_func = TRUE;
|
|
} else {
|
|
DBUG_PRINT("info",("spider has other item"));
|
|
DBUG_PRINT("info",("spider COND type=%d", item->type()));
|
|
has_other_item = TRUE;
|
|
}
|
|
}
|
|
if (has_expr_cache_item && has_isnotnull_func && !has_other_item)
|
|
{
|
|
DBUG_PRINT("info",("spider NOT EXISTS skip"));
|
|
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
|
|
}
|
|
}
|
|
}
|
|
if (str)
|
|
{
|
|
func_name = (char*) item_func->func_name();
|
|
func_name_length = strlen(func_name);
|
|
if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
|
|
}
|
|
break;
|
|
case Item_func::NEG_FUNC:
|
|
if (str)
|
|
{
|
|
func_name = (char*) item_func->func_name();
|
|
func_name_length = strlen(func_name);
|
|
if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
|
|
}
|
|
break;
|
|
case Item_func::IN_FUNC:
|
|
if (((Item_func_opt_neg *) item_func)->negated)
|
|
{
|
|
func_name = SPIDER_SQL_NOT_IN_STR;
|
|
func_name_length = SPIDER_SQL_NOT_IN_LEN;
|
|
separator_str = SPIDER_SQL_COMMA_STR;
|
|
separator_str_length = SPIDER_SQL_COMMA_LEN;
|
|
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
|
|
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
} else {
|
|
func_name = SPIDER_SQL_IN_STR;
|
|
func_name_length = SPIDER_SQL_IN_LEN;
|
|
separator_str = SPIDER_SQL_COMMA_STR;
|
|
separator_str_length = SPIDER_SQL_COMMA_LEN;
|
|
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
|
|
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
}
|
|
break;
|
|
case Item_func::BETWEEN:
|
|
if (((Item_func_opt_neg *) item_func)->negated)
|
|
{
|
|
func_name = SPIDER_SQL_NOT_BETWEEN_STR;
|
|
func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN;
|
|
separator_str = SPIDER_SQL_AND_STR;
|
|
separator_str_length = SPIDER_SQL_AND_LEN;
|
|
} else {
|
|
func_name = (char*) item_func->func_name();
|
|
func_name_length = strlen(func_name);
|
|
separator_str = SPIDER_SQL_AND_STR;
|
|
separator_str_length = SPIDER_SQL_AND_LEN;
|
|
}
|
|
break;
|
|
case Item_func::UDF_FUNC:
|
|
use_pushdown_udf = spider_param_use_pushdown_udf(spider->trx->thd,
|
|
spider->share->use_pushdown_udf);
|
|
if (!use_pushdown_udf)
|
|
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
|
|
if (str)
|
|
{
|
|
func_name = (char*) item_func->func_name();
|
|
func_name_length = strlen(func_name);
|
|
DBUG_PRINT("info",("spider func_name = %s", func_name));
|
|
DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
|
|
if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
|
|
}
|
|
func_name = SPIDER_SQL_COMMA_STR;
|
|
func_name_length = SPIDER_SQL_COMMA_LEN;
|
|
separator_str = SPIDER_SQL_COMMA_STR;
|
|
separator_str_length = SPIDER_SQL_COMMA_LEN;
|
|
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
|
|
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
break;
|
|
#ifdef MARIADB_BASE_VERSION
|
|
case Item_func::XOR_FUNC:
|
|
#else
|
|
case Item_func::COND_XOR_FUNC:
|
|
#endif
|
|
if (str)
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
DBUG_RETURN(
|
|
spider_db_open_item_cond((Item_cond *) item_func, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields));
|
|
case Item_func::TRIG_COND_FUNC:
|
|
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
|
|
case Item_func::GUSERVAR_FUNC:
|
|
if (str)
|
|
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
|
|
if (item_func->result_type() == STRING_RESULT)
|
|
DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields));
|
|
else
|
|
DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields));
|
|
case Item_func::FT_FUNC:
|
|
if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY)
|
|
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
|
|
start_item = 1;
|
|
if (str)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_MATCH_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
|
|
}
|
|
separator_str = SPIDER_SQL_COMMA_STR;
|
|
separator_str_length = SPIDER_SQL_COMMA_LEN;
|
|
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
|
|
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
break;
|
|
case Item_func::SP_EQUALS_FUNC:
|
|
if (str)
|
|
{
|
|
func_name = SPIDER_SQL_MBR_EQUAL_STR;
|
|
func_name_length = SPIDER_SQL_MBR_EQUAL_LEN;
|
|
DBUG_PRINT("info",("spider func_name = %s", func_name));
|
|
DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
|
|
if (str->reserve(func_name_length))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
}
|
|
func_name = SPIDER_SQL_COMMA_STR;
|
|
func_name_length = SPIDER_SQL_COMMA_LEN;
|
|
separator_str = SPIDER_SQL_COMMA_STR;
|
|
separator_str_length = SPIDER_SQL_COMMA_LEN;
|
|
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
|
|
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
break;
|
|
case Item_func::SP_DISJOINT_FUNC:
|
|
case Item_func::SP_INTERSECTS_FUNC:
|
|
case Item_func::SP_TOUCHES_FUNC:
|
|
case Item_func::SP_CROSSES_FUNC:
|
|
case Item_func::SP_WITHIN_FUNC:
|
|
case Item_func::SP_CONTAINS_FUNC:
|
|
case Item_func::SP_OVERLAPS_FUNC:
|
|
if (str)
|
|
{
|
|
func_name = (char*) item_func->func_name();
|
|
func_name_length = strlen(func_name);
|
|
DBUG_PRINT("info",("spider func_name = %s", func_name));
|
|
DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
|
|
if (str->reserve(
|
|
#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
|
|
SPIDER_SQL_MBR_LEN +
|
|
#endif
|
|
func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
|
|
str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN);
|
|
#endif
|
|
str->q_append(func_name, func_name_length);
|
|
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
|
|
}
|
|
func_name = SPIDER_SQL_COMMA_STR;
|
|
func_name_length = SPIDER_SQL_COMMA_LEN;
|
|
separator_str = SPIDER_SQL_COMMA_STR;
|
|
separator_str_length = SPIDER_SQL_COMMA_LEN;
|
|
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
|
|
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
|
|
break;
|
|
case Item_func::EQ_FUNC:
|
|
case Item_func::EQUAL_FUNC:
|
|
case Item_func::NE_FUNC:
|
|
case Item_func::LT_FUNC:
|
|
case Item_func::LE_FUNC:
|
|
case Item_func::GE_FUNC:
|
|
case Item_func::GT_FUNC:
|
|
case Item_func::LIKE_FUNC:
|
|
if (str)
|
|
{
|
|
func_name = (char*) item_func->func_name();
|
|
func_name_length = strlen(func_name);
|
|
}
|
|
break;
|
|
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)
|
|
{
|
|
func_name = (char*) item_func->func_name();
|
|
func_name_length = strlen(func_name);
|
|
}
|
|
break;
|
|
}
|
|
DBUG_PRINT("info",("spider func_name = %s", func_name));
|
|
DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
|
|
DBUG_PRINT("info",("spider separator_str = %s", separator_str));
|
|
DBUG_PRINT("info",("spider separator_str_length = %d", separator_str_length));
|
|
DBUG_PRINT("info",("spider last_str = %s", last_str));
|
|
DBUG_PRINT("info",("spider last_str_length = %d", last_str_length));
|
|
if (item_count)
|
|
{
|
|
item_count--;
|
|
for (roop_count = start_item; roop_count < item_count; roop_count++)
|
|
{
|
|
item = item_list[roop_count];
|
|
if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields)))
|
|
DBUG_RETURN(error_num);
|
|
if (roop_count == 1)
|
|
{
|
|
func_name = separator_str;
|
|
func_name_length = separator_str_length;
|
|
}
|
|
if (str)
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
item = item_list[roop_count];
|
|
if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields)))
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
if (item_func->functype() == Item_func::FT_FUNC)
|
|
{
|
|
Item_func_match *item_func_match = (Item_func_match *)item_func;
|
|
if (str)
|
|
{
|
|
if (str->reserve(SPIDER_SQL_AGAINST_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
|
|
}
|
|
item = item_list[0];
|
|
if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields)))
|
|
DBUG_RETURN(error_num);
|
|
if (str)
|
|
{
|
|
if (str->reserve(
|
|
((item_func_match->flags & FT_BOOL) ?
|
|
SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
|
|
((item_func_match->flags & FT_EXPAND) ?
|
|
SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
|
|
))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
if (item_func_match->flags & FT_BOOL)
|
|
str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
|
|
SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
|
|
if (item_func_match->flags & FT_EXPAND)
|
|
str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
|
|
SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
|
|
}
|
|
} else if (item_func->functype() == Item_func::UNKNOWN_FUNC)
|
|
{
|
|
if (
|
|
func_name_length == 7 &&
|
|
!strncasecmp("convert", func_name, func_name_length)
|
|
) {
|
|
if (str)
|
|
{
|
|
Item_func_conv_charset *item_func_conv_charset =
|
|
(Item_func_conv_charset *)item_func;
|
|
CHARSET_INFO *conv_charset =
|
|
item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset;
|
|
uint cset_length = strlen(conv_charset->csname);
|
|
if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
|
|
str->q_append(conv_charset->csname, cset_length);
|
|
}
|
|
}
|
|
}
|
|
if (str)
|
|
{
|
|
if (merge_func)
|
|
str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN);
|
|
if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(last_str, last_str_length);
|
|
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
|
int spider_db_handlersocket_util::open_item_sum_func(
|
|
Item_sum *item_sum,
|
|
ha_spider *spider,
|
|
spider_string *str,
|
|
const char *alias,
|
|
uint alias_length,
|
|
bool use_fields,
|
|
spider_fields *fields
|
|
) {
|
|
uint dbton_id = spider_dbton_handlersocket.dbton_id;
|
|
uint roop_count, item_count = item_sum->get_arg_count();
|
|
int error_num;
|
|
DBUG_ENTER("spider_db_handlersocket_util::open_item_sum_func");
|
|
DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
|
|
switch (item_sum->sum_func())
|
|
{
|
|
case Item_sum::COUNT_FUNC:
|
|
case Item_sum::SUM_FUNC:
|
|
case Item_sum::MIN_FUNC:
|
|
case Item_sum::MAX_FUNC:
|
|
{
|
|
const char *func_name = item_sum->func_name();
|
|
uint func_name_length = strlen(func_name);
|
|
Item *item, **args = item_sum->get_args();
|
|
if (str)
|
|
{
|
|
if (str->reserve(func_name_length))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(func_name, func_name_length);
|
|
}
|
|
if (item_count)
|
|
{
|
|
item_count--;
|
|
for (roop_count = 0; roop_count < item_count; roop_count++)
|
|
{
|
|
item = args[roop_count];
|
|
if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields)))
|
|
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 = args[roop_count];
|
|
if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
|
|
alias, alias_length, dbton_id, use_fields, fields)))
|
|
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);
|
|
}
|
|
}
|
|
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
|
|
|
|
int spider_db_handlersocket_util::append_escaped_util(
|
|
spider_string *to,
|
|
String *from
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_escaped_util");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
to->append_escape_string(from->ptr(), from->length());
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
|
|
int spider_db_handlersocket_util::append_from_and_tables(
|
|
ha_spider *spider,
|
|
spider_fields *fields,
|
|
spider_string *str,
|
|
TABLE_LIST *table_list,
|
|
uint table_count
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_from_and_tables");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::reappend_tables(
|
|
spider_fields *fields,
|
|
SPIDER_LINK_IDX_CHAIN *link_idx_chain,
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::reappend_tables");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_where(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_where");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_db_handlersocket_util::append_having(
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_db_handlersocket_util::append_having");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|
|
|
|
spider_handlersocket_share::spider_handlersocket_share(
|
|
st_spider_share *share
|
|
) : spider_db_share(
|
|
share,
|
|
spider_dbton_handlersocket.dbton_id
|
|
),
|
|
table_names_str(NULL),
|
|
db_names_str(NULL),
|
|
db_table_str(NULL),
|
|
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
|
|
db_table_str_hash_value(NULL),
|
|
#endif
|
|
table_nm_max_length(0),
|
|
db_nm_max_length(0),
|
|
column_name_str(NULL),
|
|
same_db_table_name(TRUE),
|
|
first_all_link_idx(-1)
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_share::spider_handlersocket_share");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
spider_alloc_calc_mem_init(mem_calc, 186);
|
|
spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_handlersocket_share::~spider_handlersocket_share()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_share::~spider_handlersocket_share");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
free_column_name_str();
|
|
free_table_names_str();
|
|
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
|
|
if (db_table_str_hash_value)
|
|
{
|
|
spider_free(spider_current_trx, db_table_str_hash_value, MYF(0));
|
|
}
|
|
#endif
|
|
spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_handlersocket_share::init()
|
|
{
|
|
int error_num;
|
|
DBUG_ENTER("spider_handlersocket_share::init");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
|
|
if (!(db_table_str_hash_value = (my_hash_value_type *)
|
|
spider_bulk_alloc_mem(spider_current_trx, 203,
|
|
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
|
|
&db_table_str_hash_value,
|
|
sizeof(my_hash_value_type) * spider_share->all_link_count,
|
|
NullS))
|
|
) {
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
#endif
|
|
|
|
if (
|
|
(error_num = create_table_names_str()) ||
|
|
(
|
|
spider_share->table_share &&
|
|
(error_num = create_column_name_str())
|
|
)
|
|
) {
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_share::append_table_name(
|
|
spider_string *str,
|
|
int all_link_idx
|
|
) {
|
|
const char *db_nm = db_names_str[all_link_idx].ptr();
|
|
uint db_nm_len = db_names_str[all_link_idx].length();
|
|
const char *table_nm = table_names_str[all_link_idx].ptr();
|
|
uint table_nm_len = table_names_str[all_link_idx].length();
|
|
DBUG_ENTER("spider_handlersocket_share::append_table_name");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (str->reserve(db_nm_len + SPIDER_SQL_DOT_LEN + table_nm_len +
|
|
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
|
|
{
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
spider_db_handlersocket_utility.append_name(str, db_nm, db_nm_len);
|
|
str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
|
|
spider_db_handlersocket_utility.append_name(str, table_nm, table_nm_len);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_share::create_table_names_str()
|
|
{
|
|
int error_num, roop_count;
|
|
uint table_nm_len, db_nm_len;
|
|
spider_string *str, *first_tbl_nm_str, *first_db_nm_str, *first_db_tbl_str;
|
|
char *first_tbl_nm, *first_db_nm;
|
|
uint dbton_id = spider_dbton_handlersocket.dbton_id;
|
|
DBUG_ENTER("spider_handlersocket_share::create_table_names_str");
|
|
table_names_str = NULL;
|
|
db_names_str = NULL;
|
|
db_table_str = NULL;
|
|
if (
|
|
!(table_names_str = new spider_string[spider_share->all_link_count]) ||
|
|
!(db_names_str = new spider_string[spider_share->all_link_count]) ||
|
|
!(db_table_str = new spider_string[spider_share->all_link_count])
|
|
) {
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
goto error;
|
|
}
|
|
|
|
same_db_table_name = TRUE;
|
|
first_tbl_nm = spider_share->tgt_table_names[0];
|
|
first_db_nm = spider_share->tgt_dbs[0];
|
|
table_nm_len = spider_share->tgt_table_names_lengths[0];
|
|
db_nm_len = spider_share->tgt_dbs_lengths[0];
|
|
first_tbl_nm_str = &table_names_str[0];
|
|
first_db_nm_str = &db_names_str[0];
|
|
first_db_tbl_str = &db_table_str[0];
|
|
for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
|
|
roop_count++)
|
|
{
|
|
table_names_str[roop_count].init_calc_mem(86);
|
|
db_names_str[roop_count].init_calc_mem(87);
|
|
db_table_str[roop_count].init_calc_mem(88);
|
|
if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
|
|
continue;
|
|
if (first_all_link_idx == -1)
|
|
first_all_link_idx = roop_count;
|
|
|
|
str = &table_names_str[roop_count];
|
|
if (
|
|
roop_count != 0 &&
|
|
same_db_table_name &&
|
|
spider_share->tgt_table_names_lengths[roop_count] == table_nm_len &&
|
|
!memcmp(first_tbl_nm, spider_share->tgt_table_names[roop_count],
|
|
table_nm_len)
|
|
) {
|
|
if (str->copy(*first_tbl_nm_str))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
goto error;
|
|
}
|
|
} else {
|
|
str->set_charset(spider_share->access_charset);
|
|
if ((error_num = spider_db_append_name_with_quote_str(str,
|
|
spider_share->tgt_table_names[roop_count], dbton_id)))
|
|
goto error;
|
|
if (roop_count)
|
|
{
|
|
same_db_table_name = FALSE;
|
|
DBUG_PRINT("info", ("spider found different table name %s",
|
|
spider_share->tgt_table_names[roop_count]));
|
|
if (str->length() > table_nm_max_length)
|
|
table_nm_max_length = str->length();
|
|
} else
|
|
table_nm_max_length = str->length();
|
|
}
|
|
|
|
str = &db_names_str[roop_count];
|
|
if (
|
|
roop_count != 0 &&
|
|
same_db_table_name &&
|
|
spider_share->tgt_dbs_lengths[roop_count] == db_nm_len &&
|
|
!memcmp(first_db_nm, spider_share->tgt_dbs[roop_count],
|
|
db_nm_len)
|
|
) {
|
|
if (str->copy(*first_db_nm_str))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
goto error;
|
|
}
|
|
} else {
|
|
str->set_charset(spider_share->access_charset);
|
|
if ((error_num = spider_db_append_name_with_quote_str(str,
|
|
spider_share->tgt_dbs[roop_count], dbton_id)))
|
|
goto error;
|
|
if (roop_count)
|
|
{
|
|
same_db_table_name = FALSE;
|
|
DBUG_PRINT("info", ("spider found different db name %s",
|
|
spider_share->tgt_dbs[roop_count]));
|
|
if (str->length() > db_nm_max_length)
|
|
db_nm_max_length = str->length();
|
|
} else
|
|
db_nm_max_length = str->length();
|
|
}
|
|
|
|
str = &db_table_str[roop_count];
|
|
if (
|
|
roop_count != 0 &&
|
|
same_db_table_name
|
|
) {
|
|
if (str->copy(*first_db_tbl_str))
|
|
{
|
|
error_num = HA_ERR_OUT_OF_MEM;
|
|
goto error;
|
|
}
|
|
} else {
|
|
str->set_charset(spider_share->access_charset);
|
|
if ((error_num = append_table_name(str, roop_count)))
|
|
goto error;
|
|
}
|
|
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
|
|
db_table_str_hash_value[roop_count] = my_calc_hash(
|
|
&spider_open_connections, (uchar*) str->ptr(), str->length());
|
|
#endif
|
|
}
|
|
DBUG_RETURN(0);
|
|
|
|
error:
|
|
if (db_table_str)
|
|
{
|
|
delete [] db_table_str;
|
|
db_table_str = NULL;
|
|
}
|
|
if (db_names_str)
|
|
{
|
|
delete [] db_names_str;
|
|
db_names_str = NULL;
|
|
}
|
|
if (table_names_str)
|
|
{
|
|
delete [] table_names_str;
|
|
table_names_str = NULL;
|
|
}
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
void spider_handlersocket_share::free_table_names_str()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_share::free_table_names_str");
|
|
if (db_table_str)
|
|
{
|
|
delete [] db_table_str;
|
|
db_table_str = NULL;
|
|
}
|
|
if (db_names_str)
|
|
{
|
|
delete [] db_names_str;
|
|
db_names_str = NULL;
|
|
}
|
|
if (table_names_str)
|
|
{
|
|
delete [] table_names_str;
|
|
table_names_str = NULL;
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_handlersocket_share::create_column_name_str()
|
|
{
|
|
spider_string *str;
|
|
int error_num;
|
|
Field **field;
|
|
TABLE_SHARE *table_share = spider_share->table_share;
|
|
uint dbton_id = spider_dbton_handlersocket.dbton_id;
|
|
DBUG_ENTER("spider_handlersocket_share::create_column_name_str");
|
|
if (
|
|
table_share->fields &&
|
|
!(column_name_str = new spider_string[table_share->fields])
|
|
)
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
for (field = table_share->field, str = column_name_str;
|
|
*field; field++, str++)
|
|
{
|
|
str->init_calc_mem(202);
|
|
str->set_charset(spider_share->access_charset);
|
|
if ((error_num = spider_db_append_name_with_quote_str(str,
|
|
(*field)->field_name, dbton_id)))
|
|
goto error;
|
|
}
|
|
DBUG_RETURN(0);
|
|
|
|
error:
|
|
if (column_name_str)
|
|
{
|
|
delete [] column_name_str;
|
|
column_name_str = NULL;
|
|
}
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
void spider_handlersocket_share::free_column_name_str()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_share::free_column_name_str");
|
|
if (column_name_str)
|
|
{
|
|
delete [] column_name_str;
|
|
column_name_str = NULL;
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
uint spider_handlersocket_share::get_column_name_length(
|
|
uint field_index
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_share::get_column_name_length");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(column_name_str[field_index].length());
|
|
}
|
|
|
|
int spider_handlersocket_share::append_column_name(
|
|
spider_string *str,
|
|
uint field_index
|
|
) {
|
|
int error_num;
|
|
DBUG_ENTER("spider_handlersocket_share::append_column_name");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
error_num = spider_db_handlersocket_utility.append_name(str,
|
|
column_name_str[field_index].ptr(), column_name_str[field_index].length());
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
int spider_handlersocket_share::append_column_name_with_alias(
|
|
spider_string *str,
|
|
uint field_index,
|
|
const char *alias,
|
|
uint alias_length
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_share::append_column_name_with_alias");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (str->reserve(
|
|
alias_length +
|
|
column_name_str[field_index].length() +
|
|
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(alias, alias_length);
|
|
append_column_name(str, field_index);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_handlersocket_share::need_change_db_table_name()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_share::need_change_db_table_name");
|
|
DBUG_RETURN(!same_db_table_name);
|
|
}
|
|
|
|
#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
|
|
int spider_handlersocket_share::discover_table_structure(
|
|
SPIDER_TRX *trx,
|
|
SPIDER_SHARE *spider_share,
|
|
spider_string *str
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_share::discover_table_structure");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
|
|
}
|
|
#endif
|
|
|
|
spider_handlersocket_handler::spider_handlersocket_handler(
|
|
ha_spider *spider,
|
|
spider_handlersocket_share *db_share
|
|
) : spider_db_handler(
|
|
spider,
|
|
db_share
|
|
),
|
|
handlersocket_share(db_share),
|
|
link_for_hash(NULL)
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::spider_handlersocket_handler");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
spider_alloc_calc_mem_init(mem_calc, 187);
|
|
spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
spider_handlersocket_handler::~spider_handlersocket_handler()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::~spider_handlersocket_handler");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (link_for_hash)
|
|
{
|
|
spider_free(spider_current_trx, link_for_hash, MYF(0));
|
|
}
|
|
spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_handlersocket_handler::init()
|
|
{
|
|
st_spider_share *share = spider->share;
|
|
TABLE *table = spider->get_table();
|
|
DBUG_ENTER("spider_handlersocket_handler::init");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
|
|
spider_bulk_alloc_mem(spider_current_trx, 204,
|
|
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
|
|
&link_for_hash,
|
|
sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
|
|
&minimum_select_bitmap,
|
|
table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0,
|
|
NullS))
|
|
) {
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
uint roop_count;
|
|
for (roop_count = 0; roop_count < share->link_count; roop_count++)
|
|
{
|
|
link_for_hash[roop_count].spider = spider;
|
|
link_for_hash[roop_count].link_idx = roop_count;
|
|
link_for_hash[roop_count].db_table_str =
|
|
&handlersocket_share->db_table_str[roop_count];
|
|
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
|
|
link_for_hash[roop_count].db_table_str_hash_value =
|
|
handlersocket_share->db_table_str_hash_value[roop_count];
|
|
#endif
|
|
}
|
|
hs_sql.init_calc_mem(63);
|
|
hs_sql.set_charset(share->access_charset);
|
|
hs_keys.init();
|
|
hs_upds.init();
|
|
hs_strs.init();
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_index_hint(
|
|
spider_string *str,
|
|
int link_idx,
|
|
ulong sql_type
|
|
)
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::append_index_hint");
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_table_name_with_adjusting(
|
|
spider_string *str,
|
|
int link_idx,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_table_name_with_adjusting");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_tmp_table_and_sql_for_bka(
|
|
const key_range *start_key
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_tmp_table_and_sql_for_bka");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reuse_tmp_table_and_sql_for_bka()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::reuse_tmp_table_and_sql_for_bka");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_union_table_and_sql_for_bka(
|
|
const key_range *start_key
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_union_table_and_sql_for_bka");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reuse_union_table_and_sql_for_bka()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::reuse_union_table_and_sql_for_bka");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_insert_for_recovery(
|
|
ulong sql_type,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_insert_for_recovery");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_update(
|
|
const TABLE *table,
|
|
my_ptrdiff_t ptr_diff
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_update");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_update(
|
|
const TABLE *table,
|
|
my_ptrdiff_t ptr_diff,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_update");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_delete(
|
|
const TABLE *table,
|
|
my_ptrdiff_t ptr_diff
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_delete");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_delete(
|
|
const TABLE *table,
|
|
my_ptrdiff_t ptr_diff,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_delete");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_insert_part()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::append_insert_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_update_part()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::append_update_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_delete_part()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::append_delete_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
|
|
int spider_handlersocket_handler::append_increment_update_set_part()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::append_increment_update_set_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|
|
|
|
int spider_handlersocket_handler::append_update_set_part()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::append_update_set_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
|
|
int spider_handlersocket_handler::append_direct_update_set_part()
|
|
{
|
|
SPIDER_SHARE *share = spider->share;
|
|
DBUG_ENTER("spider_handlersocket_handler::append_direct_update_set_part");
|
|
if (
|
|
spider->do_direct_update &&
|
|
(spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
|
|
) {
|
|
DBUG_PRINT("info",("spider add set for DU SPIDER_SQL_KIND_HS"));
|
|
size_t roop_count;
|
|
Field *field;
|
|
hs_adding_keys = FALSE;
|
|
for (roop_count = 0; roop_count < spider->hs_pushed_ret_fields_num;
|
|
roop_count++)
|
|
{
|
|
Field *top_table_field =
|
|
spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
|
|
if (!(field = spider->field_exchange(top_table_field)))
|
|
continue;
|
|
if (top_table_field->is_null())
|
|
{
|
|
hs_upds.push_back(spider_null_string_ref);
|
|
} else {
|
|
if (spider_db_handlersocket_utility.
|
|
append_column_value(spider, NULL, top_table_field, NULL,
|
|
share->access_charset))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
}
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|
|
|
|
int spider_handlersocket_handler::append_minimum_select_without_quote(
|
|
spider_string *str
|
|
) {
|
|
TABLE *table = spider->get_table();
|
|
Field **field;
|
|
int field_length;
|
|
bool appended = FALSE;
|
|
DBUG_ENTER("spider_handlersocket_handler::append_minimum_select_without_quote");
|
|
minimum_select_bitmap_create();
|
|
for (field = table->field; *field; field++)
|
|
{
|
|
if (minimum_select_bit_is_set((*field)->field_index))
|
|
{
|
|
/*
|
|
spider_set_bit(minimum_select_bitmap, (*field)->field_index);
|
|
*/
|
|
field_length =
|
|
handlersocket_share->column_name_str[(*field)->field_index].length();
|
|
if (str->reserve(field_length + SPIDER_SQL_COMMA_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(
|
|
handlersocket_share->column_name_str[(*field)->field_index].ptr(),
|
|
handlersocket_share->column_name_str[(*field)->field_index].length());
|
|
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
|
|
appended = TRUE;
|
|
}
|
|
}
|
|
if (appended)
|
|
str->length(str->length() - SPIDER_SQL_COMMA_LEN);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
|
|
int spider_handlersocket_handler::append_minimum_select_by_field_idx_list(
|
|
spider_string *str,
|
|
uint32 *field_idxs,
|
|
size_t field_idxs_num
|
|
) {
|
|
Field *field;
|
|
int roop_count, field_length;
|
|
bool appended = FALSE;
|
|
DBUG_ENTER("spider_handlersocket_handler::append_minimum_select_by_field_idx_list");
|
|
for (roop_count = 0; roop_count < (int) field_idxs_num; roop_count++)
|
|
{
|
|
field = spider->get_top_table_field(field_idxs[roop_count]);
|
|
if ((field = spider->field_exchange(field)))
|
|
{
|
|
field_length =
|
|
handlersocket_share->column_name_str[field->field_index].length();
|
|
if (str->reserve(field_length + SPIDER_SQL_COMMA_LEN))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
str->q_append(
|
|
handlersocket_share->column_name_str[field->field_index].ptr(),
|
|
handlersocket_share->column_name_str[field->field_index].length());
|
|
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
|
|
appended = TRUE;
|
|
}
|
|
}
|
|
if (appended)
|
|
str->length(str->length() - SPIDER_SQL_COMMA_LEN);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_dup_update_pushdown_part(
|
|
const char *alias,
|
|
uint alias_length
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_dup_update_pushdown_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_update_columns_part(
|
|
const char *alias,
|
|
uint alias_length
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_update_columns_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::check_update_columns_part()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::check_update_columns_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|
|
|
|
int spider_handlersocket_handler::append_select_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_select_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_table_select_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_table_select_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_key_select_part(
|
|
ulong sql_type,
|
|
uint idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_key_select_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_minimum_select_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_minimum_select_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_hint_after_table_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_hint_after_table_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_handlersocket_handler::set_where_pos(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::set_where_pos");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
void spider_handlersocket_handler::set_where_to_pos(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::set_where_to_pos");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_handlersocket_handler::check_item_type(
|
|
Item *item
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::check_item_type");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_values_connector_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_values_connector_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_values_terminator_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_values_terminator_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_union_table_connector_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_union_table_connector_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_union_table_terminator_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_union_table_terminator_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_key_column_values_part(
|
|
const key_range *start_key,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_key_column_values_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_key_column_values_with_name_part(
|
|
const key_range *start_key,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_key_column_values_with_name_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_key_where_part(
|
|
const key_range *start_key,
|
|
const key_range *end_key,
|
|
ulong sql_type
|
|
) {
|
|
int error_num;
|
|
spider_string *str;
|
|
bool set_order;
|
|
DBUG_ENTER("spider_handlersocket_handler::append_key_where_part");
|
|
switch (sql_type)
|
|
{
|
|
case SPIDER_SQL_TYPE_SELECT_HS:
|
|
case SPIDER_SQL_TYPE_INSERT_HS:
|
|
case SPIDER_SQL_TYPE_UPDATE_HS:
|
|
case SPIDER_SQL_TYPE_DELETE_HS:
|
|
str = &hs_sql;
|
|
str->length(0);
|
|
hs_adding_keys = TRUE;
|
|
set_order = FALSE;
|
|
break;
|
|
default:
|
|
DBUG_RETURN(0);
|
|
}
|
|
error_num = append_key_where(str, NULL, NULL, start_key, end_key,
|
|
sql_type, set_order);
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_key_where(
|
|
spider_string *str,
|
|
spider_string *str_part,
|
|
spider_string *str_part2,
|
|
const key_range *start_key,
|
|
const key_range *end_key,
|
|
ulong sql_type,
|
|
bool set_order
|
|
) {
|
|
int error_num;
|
|
DBUG_ENTER("spider_handlersocket_handler::append_key_where");
|
|
error_num = spider_db_append_key_where_internal(str, str_part, str_part2,
|
|
start_key, end_key, spider, set_order, sql_type,
|
|
spider_dbton_handlersocket.dbton_id);
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_is_null_part(
|
|
ulong sql_type,
|
|
KEY_PART_INFO *key_part,
|
|
const key_range *key,
|
|
const uchar **ptr,
|
|
bool key_eq,
|
|
bool tgt_final
|
|
) {
|
|
int error_num;
|
|
spider_string *str;
|
|
DBUG_ENTER("spider_handlersocket_handler::append_is_null_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
switch (sql_type)
|
|
{
|
|
case SPIDER_SQL_TYPE_SELECT_HS:
|
|
case SPIDER_SQL_TYPE_INSERT_HS:
|
|
case SPIDER_SQL_TYPE_UPDATE_HS:
|
|
case SPIDER_SQL_TYPE_DELETE_HS:
|
|
str = &hs_sql;
|
|
break;
|
|
default:
|
|
DBUG_RETURN(0);
|
|
}
|
|
error_num = append_is_null(sql_type, str, NULL, NULL, key_part, key, ptr,
|
|
key_eq, tgt_final);
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_is_null(
|
|
ulong sql_type,
|
|
spider_string *str,
|
|
spider_string *str_part,
|
|
spider_string *str_part2,
|
|
KEY_PART_INFO *key_part,
|
|
const key_range *key,
|
|
const uchar **ptr,
|
|
bool key_eq,
|
|
bool tgt_final
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_is_null");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (key_part->null_bit)
|
|
{
|
|
if (*(*ptr)++)
|
|
{
|
|
hs_keys.push_back(spider_null_string_ref);
|
|
DBUG_RETURN(-1);
|
|
}
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_where_terminator_part(
|
|
ulong sql_type,
|
|
bool set_order,
|
|
int key_count
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_where_terminator_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_match_where_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_match_where_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_condition_part(
|
|
const char *alias,
|
|
uint alias_length,
|
|
ulong sql_type,
|
|
bool test_flg
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_condition_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_match_select_part(
|
|
ulong sql_type,
|
|
const char *alias,
|
|
uint alias_length
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_match_select_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
|
int spider_handlersocket_handler::append_sum_select_part(
|
|
ulong sql_type,
|
|
const char *alias,
|
|
uint alias_length
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_sum_select_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|
|
|
|
void spider_handlersocket_handler::set_order_pos(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::set_order_pos");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
void spider_handlersocket_handler::set_order_to_pos(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::set_order_to_pos");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
|
|
int spider_handlersocket_handler::append_group_by_part(
|
|
const char *alias,
|
|
uint alias_length,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_group_by_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|
|
|
|
int spider_handlersocket_handler::append_key_order_for_merge_with_alias_part(
|
|
const char *alias,
|
|
uint alias_length,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_key_order_for_merge_with_alias_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_key_order_for_direct_order_limit_with_alias_part(
|
|
const char *alias,
|
|
uint alias_length,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_key_order_for_direct_order_limit_with_alias_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_key_order_with_alias_part(
|
|
const char *alias,
|
|
uint alias_length,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_key_order_with_alias_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_limit_part(
|
|
longlong offset,
|
|
longlong limit,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_limit_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_PRINT("info", ("spider offset=%lld", offset));
|
|
DBUG_PRINT("info", ("spider limit=%lld", limit));
|
|
hs_skip = (int) offset;
|
|
hs_limit = (int) limit;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reappend_limit_part(
|
|
longlong offset,
|
|
longlong limit,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::reappend_limit_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_select_lock_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_select_lock_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_union_all_start_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_union_all_start_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_union_all_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_union_all_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_union_all_end_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_union_all_end_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_multi_range_cnt_part(
|
|
ulong sql_type,
|
|
uint multi_range_cnt,
|
|
bool with_comma
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_multi_range_cnt_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_multi_range_cnt_with_name_part(
|
|
ulong sql_type,
|
|
uint multi_range_cnt
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_multi_range_cnt_with_name_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_open_handler_part(
|
|
ulong sql_type,
|
|
uint handler_id,
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
int error_num;
|
|
spider_string *str;
|
|
DBUG_ENTER("spider_handlersocket_handler::append_open_handler_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
switch (sql_type)
|
|
{
|
|
case SPIDER_SQL_TYPE_OTHER_HS:
|
|
str = &hs_sql;
|
|
break;
|
|
default:
|
|
DBUG_RETURN(0);
|
|
}
|
|
error_num = append_open_handler(str, handler_id, conn, link_idx);
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_open_handler(
|
|
spider_string *str,
|
|
uint handler_id,
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
int error_num;
|
|
DBUG_ENTER("spider_handlersocket_handler::append_open_handler");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (
|
|
str->length() == 0 &&
|
|
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
|
|
(
|
|
(
|
|
(
|
|
spider->sql_command == SQLCOM_HS_INSERT ||
|
|
spider->hs_pushed_ret_fields_num == MAX_FIELDS
|
|
) &&
|
|
#endif
|
|
(error_num = append_minimum_select_without_quote(str))
|
|
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
|
|
) ||
|
|
(
|
|
(
|
|
spider->sql_command != SQLCOM_HS_INSERT &&
|
|
spider->hs_pushed_ret_fields_num < MAX_FIELDS
|
|
) &&
|
|
(error_num = append_minimum_select_by_field_idx_list(str,
|
|
spider->hs_pushed_ret_fields, spider->hs_pushed_ret_fields_num))
|
|
)
|
|
)
|
|
#endif
|
|
) {
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
TABLE *table = spider->get_table();
|
|
SPIDER_SHARE *share = spider->share;
|
|
DBUG_PRINT("info",("spider field list=%s", str->c_ptr_safe()));
|
|
if (!spider_bit_is_set(spider->db_request_phase, link_idx))
|
|
{
|
|
spider_set_bit(spider->db_request_phase, link_idx);
|
|
++spider->db_request_id[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;
|
|
conn->db_conn->append_open_handler(
|
|
handler_id,
|
|
share->tgt_dbs[spider->conn_link_idx[link_idx]],
|
|
share->tgt_table_names[spider->conn_link_idx[link_idx]],
|
|
spider->active_index < MAX_KEY ?
|
|
table->key_info[spider->active_index].name :
|
|
"0",
|
|
str->c_ptr_safe(),
|
|
&request_key
|
|
);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_close_handler_part(
|
|
ulong sql_type,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_close_handler_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_insert_terminator_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_insert_terminator_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_insert_values_part(
|
|
ulong sql_type
|
|
) {
|
|
int error_num;
|
|
spider_string *str;
|
|
DBUG_ENTER("spider_mysql_handler::append_insert_values_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
switch (sql_type)
|
|
{
|
|
case SPIDER_SQL_TYPE_INSERT_HS:
|
|
str = &hs_sql;
|
|
break;
|
|
default:
|
|
DBUG_RETURN(0);
|
|
}
|
|
error_num = append_insert_values(str);
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_insert_values(
|
|
spider_string *str
|
|
) {
|
|
SPIDER_SHARE *share = spider->share;
|
|
TABLE *table = spider->get_table();
|
|
Field **field;
|
|
DBUG_ENTER("spider_mysql_handler::append_insert_values");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
hs_adding_keys = FALSE;
|
|
for (field = table->field; *field; field++)
|
|
{
|
|
DBUG_PRINT("info",("spider field_index=%u", (*field)->field_index));
|
|
if (
|
|
bitmap_is_set(table->write_set, (*field)->field_index) ||
|
|
bitmap_is_set(table->read_set, (*field)->field_index)
|
|
) {
|
|
#ifndef DBUG_OFF
|
|
my_bitmap_map *tmp_map =
|
|
dbug_tmp_use_all_columns(table, table->read_set);
|
|
#endif
|
|
DBUG_PRINT("info",("spider is_null()=%s",
|
|
(*field)->is_null() ? "TRUE" : "FALSE"));
|
|
DBUG_PRINT("info",("spider table->next_number_field=%p",
|
|
table->next_number_field));
|
|
DBUG_PRINT("info",("spider *field=%p", *field));
|
|
DBUG_PRINT("info",("spider force_auto_increment=%s",
|
|
(table->next_number_field && spider->force_auto_increment) ?
|
|
"TRUE" : "FALSE"));
|
|
if (
|
|
(*field)->is_null() ||
|
|
(
|
|
table->next_number_field == *field &&
|
|
!table->auto_increment_field_not_null &&
|
|
!spider->force_auto_increment
|
|
)
|
|
) {
|
|
hs_upds.push_back(spider_null_string_ref);
|
|
} else {
|
|
spider_db_handlersocket_utility.
|
|
append_column_value(spider, NULL, *field, NULL,
|
|
share->access_charset);
|
|
}
|
|
#ifndef DBUG_OFF
|
|
dbug_tmp_restore_column_map(table->read_set, tmp_map);
|
|
#endif
|
|
}
|
|
}
|
|
int error_num;
|
|
int roop_count2;
|
|
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 (spider->sql_kind[roop_count2] == SPIDER_SQL_KIND_HS)
|
|
{
|
|
SPIDER_CONN *conn = spider->hs_w_conns[roop_count2];
|
|
if (conn->dbton_id == spider_dbton_handlersocket.dbton_id)
|
|
{
|
|
if ((error_num = request_buf_insert(roop_count2)))
|
|
DBUG_RETURN(error_num);
|
|
#ifdef HA_CAN_BULK_ACCESS
|
|
if (spider->is_bulk_access_clone)
|
|
{
|
|
spider->connection_ids[roop_count2] = conn->connection_id;
|
|
spider_trx_add_bulk_access_conn(spider->trx, conn);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
hs_upds.clear();
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_into_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_into_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_handlersocket_handler::set_insert_to_pos(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::set_insert_to_pos");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_from_part(
|
|
ulong sql_type,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_from_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_delete_all_rows_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_delete_all_rows_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_explain_select_part(
|
|
key_range *start_key,
|
|
key_range *end_key,
|
|
ulong sql_type,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_explain_select_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::is_sole_projection_field(
|
|
uint16 field_index
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::is_sole_projection_field");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_handlersocket_handler::is_bulk_insert_exec_period(
|
|
bool bulk_end
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::is_bulk_insert_exec_period");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!spider->bulk_insert || bulk_end)
|
|
DBUG_RETURN(TRUE);
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
bool spider_handlersocket_handler::sql_is_filled_up(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::sql_is_filled_up");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
bool spider_handlersocket_handler::sql_is_empty(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::sql_is_empty");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
bool spider_handlersocket_handler::support_multi_split_read()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::support_multi_split_read");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
bool spider_handlersocket_handler::support_bulk_update()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::support_bulk_update");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_handlersocket_handler::bulk_tmp_table_insert()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_insert");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::bulk_tmp_table_insert(
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_insert");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::bulk_tmp_table_end_bulk_insert()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_end_bulk_insert");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::bulk_tmp_table_rnd_init()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_rnd_init");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::bulk_tmp_table_rnd_next()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_rnd_next");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::bulk_tmp_table_rnd_end()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_rnd_end");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_handlersocket_handler::need_copy_for_update(
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::need_copy_for_update");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(TRUE);
|
|
}
|
|
|
|
bool spider_handlersocket_handler::bulk_tmp_table_created()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_created");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
int spider_handlersocket_handler::mk_bulk_tmp_table_and_bulk_start()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::mk_bulk_tmp_table_and_bulk_start");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
void spider_handlersocket_handler::rm_bulk_tmp_table()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::rm_bulk_tmp_table");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_handlersocket_handler::insert_lock_tables_list(
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::insert_lock_tables_list");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_lock_tables_list(
|
|
SPIDER_CONN *conn,
|
|
int link_idx,
|
|
int *appended
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_lock_tables_list");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::realloc_sql(
|
|
ulong *realloced
|
|
) {
|
|
THD *thd = spider->trx->thd;
|
|
st_spider_share *share = spider->share;
|
|
int init_sql_alloc_size =
|
|
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
|
|
DBUG_ENTER("spider_handlersocket_handler::realloc_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if ((int) hs_sql.alloced_length() > init_sql_alloc_size * 2)
|
|
{
|
|
hs_sql.free();
|
|
if (hs_sql.real_alloc(init_sql_alloc_size))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
*realloced |= SPIDER_SQL_TYPE_FULL_HS;
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reset_sql(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::reset_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
|
|
{
|
|
hs_sql.length(0);
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reset_keys(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::reset_keys");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
|
|
{
|
|
hs_keys.clear();
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reset_upds(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::reset_upds");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
|
|
{
|
|
hs_upds.clear();
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reset_strs(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::reset_strs");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
|
|
{
|
|
hs_strs.clear();
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reset_strs_pos(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::reset_strs_pos");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
|
|
{
|
|
hs_strs_pos = 0;
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::push_back_upds(
|
|
SPIDER_HS_STRING_REF &info
|
|
) {
|
|
int error_num;
|
|
DBUG_ENTER("spider_handlersocket_handler::push_back_upds");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
error_num = hs_upds.push_back(info);
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
int spider_handlersocket_handler::request_buf_find(
|
|
int link_idx
|
|
) {
|
|
int error_num;
|
|
spider_string *hs_str;
|
|
SPIDER_CONN *conn;
|
|
uint handler_id;
|
|
DBUG_ENTER("spider_handlersocket_handler::request_buf_find");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!(hs_str = hs_strs.add(&hs_strs_pos, hs_sql.ptr(), hs_sql.length())))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_HS_READ)
|
|
{
|
|
conn = spider->hs_r_conns[link_idx];
|
|
handler_id = spider->r_handler_id[link_idx];
|
|
} else {
|
|
conn = spider->hs_w_conns[link_idx];
|
|
handler_id = spider->w_handler_id[link_idx];
|
|
}
|
|
if ((error_num = spider_db_conn_queue_action(conn)))
|
|
DBUG_RETURN(error_num);
|
|
if (!spider_bit_is_set(spider->db_request_phase, link_idx))
|
|
{
|
|
spider_set_bit(spider->db_request_phase, link_idx);
|
|
++spider->db_request_id[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;
|
|
conn->db_conn->append_select(
|
|
handler_id, hs_str, &hs_keys,
|
|
hs_limit, hs_skip, &request_key);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::request_buf_insert(
|
|
int link_idx
|
|
) {
|
|
int error_num;
|
|
DBUG_ENTER("spider_handlersocket_handler::request_buf_insert");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if ((error_num = spider_db_conn_queue_action(spider->hs_w_conns[link_idx])))
|
|
DBUG_RETURN(error_num);
|
|
if (!spider_bit_is_set(spider->db_request_phase, link_idx))
|
|
{
|
|
spider_set_bit(spider->db_request_phase, link_idx);
|
|
++spider->db_request_id[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;
|
|
spider->hs_w_conns[link_idx]->db_conn->append_insert(
|
|
spider->w_handler_id[link_idx], &hs_upds, &request_key);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::request_buf_update(
|
|
int link_idx
|
|
) {
|
|
int error_num;
|
|
spider_string *hs_str;
|
|
DBUG_ENTER("spider_handlersocket_handler::request_buf_update");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!(hs_str = hs_strs.add(&hs_strs_pos, hs_sql.ptr(), hs_sql.length())))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
if ((error_num = spider_db_conn_queue_action(spider->hs_w_conns[link_idx])))
|
|
DBUG_RETURN(error_num);
|
|
if (!spider_bit_is_set(spider->db_request_phase, link_idx))
|
|
{
|
|
spider_set_bit(spider->db_request_phase, link_idx);
|
|
++spider->db_request_id[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;
|
|
spider->hs_w_conns[link_idx]->db_conn->append_update(
|
|
spider->w_handler_id[link_idx], hs_str, &hs_keys, &hs_upds,
|
|
hs_limit, hs_skip,
|
|
spider->hs_increment, spider->hs_decrement, &request_key
|
|
);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::request_buf_delete(
|
|
int link_idx
|
|
) {
|
|
int error_num;
|
|
spider_string *hs_str;
|
|
DBUG_ENTER("spider_handlersocket_handler::request_buf_delete");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!(hs_str = hs_strs.add(&hs_strs_pos, hs_sql.ptr(), hs_sql.length())))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
if ((error_num = spider_db_conn_queue_action(spider->hs_w_conns[link_idx])))
|
|
DBUG_RETURN(error_num);
|
|
if (!spider_bit_is_set(spider->db_request_phase, link_idx))
|
|
{
|
|
spider_set_bit(spider->db_request_phase, link_idx);
|
|
++spider->db_request_id[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;
|
|
spider->hs_w_conns[link_idx]->db_conn->append_delete(
|
|
spider->w_handler_id[link_idx], hs_str, &hs_keys,
|
|
hs_limit, hs_skip, &request_key);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_handlersocket_handler::need_lock_before_set_sql_for_exec(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::need_lock_before_set_sql_for_exec");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(TRUE);
|
|
}
|
|
|
|
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
|
|
int spider_handlersocket_handler::set_sql_for_exec(
|
|
ulong sql_type,
|
|
int link_idx,
|
|
SPIDER_LINK_IDX_CHAIN *link_idx_chain
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|
|
|
|
int spider_handlersocket_handler::set_sql_for_exec(
|
|
ulong sql_type,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (sql_type & SPIDER_SQL_TYPE_SELECT_HS)
|
|
{
|
|
DBUG_RETURN(request_buf_find(link_idx));
|
|
}
|
|
if (sql_type & SPIDER_SQL_TYPE_INSERT_HS)
|
|
{
|
|
DBUG_RETURN(request_buf_insert(link_idx));
|
|
}
|
|
if (sql_type & SPIDER_SQL_TYPE_UPDATE_HS)
|
|
{
|
|
DBUG_RETURN(request_buf_update(link_idx));
|
|
}
|
|
if (sql_type & SPIDER_SQL_TYPE_DELETE_HS)
|
|
{
|
|
DBUG_RETURN(request_buf_delete(link_idx));
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::set_sql_for_exec(
|
|
spider_db_copy_table *tgt_ct,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::execute_sql(
|
|
ulong sql_type,
|
|
SPIDER_CONN *conn,
|
|
int quick_mode,
|
|
int *need_mon
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::execute_sql");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (!(sql_type & SPIDER_SQL_TYPE_FULL_HS))
|
|
{
|
|
/* nothing to do */
|
|
DBUG_RETURN(0);
|
|
}
|
|
DBUG_RETURN(spider_db_query(
|
|
conn,
|
|
NULL,
|
|
0,
|
|
quick_mode,
|
|
need_mon
|
|
));
|
|
}
|
|
|
|
int spider_handlersocket_handler::reset()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::reset");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::sts_mode_exchange(
|
|
int sts_mode
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::sts_mode_exchange");
|
|
DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
|
|
DBUG_RETURN(sts_mode);
|
|
}
|
|
|
|
int spider_handlersocket_handler::show_table_status(
|
|
int link_idx,
|
|
int sts_mode,
|
|
uint flag
|
|
) {
|
|
spider_db_handlersocket_result res(NULL);
|
|
SPIDER_SHARE *share = spider->share;
|
|
ulonglong auto_increment_value = 0;
|
|
DBUG_ENTER("spider_handlersocket_show_table_status");
|
|
res.fetch_table_status(
|
|
sts_mode,
|
|
share->stat
|
|
);
|
|
if (auto_increment_value > share->lgtm_tblhnd_share->auto_increment_value)
|
|
{
|
|
share->lgtm_tblhnd_share->auto_increment_value = auto_increment_value;
|
|
DBUG_PRINT("info",("spider auto_increment_value=%llu",
|
|
share->lgtm_tblhnd_share->auto_increment_value));
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::crd_mode_exchange(
|
|
int crd_mode
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::crd_mode_exchange");
|
|
DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
|
|
DBUG_RETURN(crd_mode);
|
|
}
|
|
|
|
int spider_handlersocket_handler::show_index(
|
|
int link_idx,
|
|
int crd_mode
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::show_index");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::show_records(
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::show_records");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::show_last_insert_id(
|
|
int link_idx,
|
|
ulonglong &last_insert_id
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::show_last_insert_id");
|
|
last_insert_id = 0;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
ha_rows spider_handlersocket_handler::explain_select(
|
|
key_range *start_key,
|
|
key_range *end_key,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::explain_select");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::lock_tables(
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::lock_tables");
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::unlock_tables(
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::unlock_tables");
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::disable_keys(
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::disable_keys");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::enable_keys(
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::enable_keys");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::check_table(
|
|
SPIDER_CONN *conn,
|
|
int link_idx,
|
|
HA_CHECK_OPT* check_opt
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::check_table");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::repair_table(
|
|
SPIDER_CONN *conn,
|
|
int link_idx,
|
|
HA_CHECK_OPT* check_opt
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::repair_table");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::analyze_table(
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::analyze_table");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::optimize_table(
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::optimize_table");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::flush_tables(
|
|
SPIDER_CONN *conn,
|
|
int link_idx,
|
|
bool lock
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::flush_tables");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::flush_logs(
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::flush_logs");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::insert_opened_handler(
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
spider_db_handlersocket *db_conn = (spider_db_handlersocket *) conn->db_conn;
|
|
SPIDER_LINK_FOR_HASH *tmp_link_for_hash = &link_for_hash[link_idx];
|
|
DBUG_ASSERT(tmp_link_for_hash->spider == spider);
|
|
DBUG_ASSERT(tmp_link_for_hash->link_idx == link_idx);
|
|
uint old_elements = db_conn->handler_open_array.max_element;
|
|
DBUG_ENTER("spider_handlersocket_handler::insert_opened_handler");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
if (insert_dynamic(&db_conn->handler_open_array,
|
|
(uchar*) &tmp_link_for_hash))
|
|
{
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
}
|
|
if (db_conn->handler_open_array.max_element > old_elements)
|
|
{
|
|
spider_alloc_calc_mem(spider_current_trx,
|
|
db_conn->handler_open_array,
|
|
(db_conn->handler_open_array.max_element - old_elements) *
|
|
db_conn->handler_open_array.size_of_element);
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::delete_opened_handler(
|
|
SPIDER_CONN *conn,
|
|
int link_idx
|
|
) {
|
|
spider_db_handlersocket *db_conn = (spider_db_handlersocket *) conn->db_conn;
|
|
uint roop_count, elements = db_conn->handler_open_array.elements;
|
|
SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
|
|
DBUG_ENTER("spider_handlersocket_handler::delete_opened_handler");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
for (roop_count = 0; roop_count < elements; roop_count++)
|
|
{
|
|
get_dynamic(&db_conn->handler_open_array, (uchar *) &tmp_link_for_hash,
|
|
roop_count);
|
|
if (tmp_link_for_hash == &link_for_hash[link_idx])
|
|
{
|
|
delete_dynamic_element(&db_conn->handler_open_array, roop_count);
|
|
break;
|
|
}
|
|
}
|
|
DBUG_ASSERT(roop_count < elements);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::sync_from_clone_source(
|
|
spider_db_handler *dbton_hdl
|
|
) {
|
|
spider_handlersocket_handler *hs_hdl =
|
|
(spider_handlersocket_handler *) dbton_hdl;
|
|
DBUG_ENTER("spider_handlersocket_handler::sync_from_clone_source");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
hs_strs_pos = hs_hdl->hs_strs_pos;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
bool spider_handlersocket_handler::support_use_handler(
|
|
int use_handler
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::support_use_handler");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_RETURN(TRUE);
|
|
}
|
|
|
|
void spider_handlersocket_handler::minimum_select_bitmap_create()
|
|
{
|
|
TABLE *table = spider->get_table();
|
|
Field **field_p;
|
|
DBUG_ENTER("spider_handlersocket_handler::minimum_select_bitmap_create");
|
|
memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
|
|
if (
|
|
spider->use_index_merge ||
|
|
#ifdef HA_CAN_BULK_ACCESS
|
|
(spider->is_clone && !spider->is_bulk_access_clone)
|
|
#else
|
|
spider->is_clone
|
|
#endif
|
|
) {
|
|
/* need preparing for cmp_ref */
|
|
TABLE_SHARE *table_share = table->s;
|
|
if (
|
|
table_share->primary_key == MAX_KEY
|
|
) {
|
|
/* need all columns */
|
|
memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set));
|
|
DBUG_VOID_RETURN;
|
|
} else {
|
|
/* need primary key columns */
|
|
uint roop_count;
|
|
KEY *key_info;
|
|
KEY_PART_INFO *key_part;
|
|
Field *field;
|
|
key_info = &table_share->key_info[table_share->primary_key];
|
|
key_part = key_info->key_part;
|
|
for (roop_count = 0;
|
|
roop_count < spider_user_defined_key_parts(key_info);
|
|
roop_count++)
|
|
{
|
|
field = key_part[roop_count].field;
|
|
spider_set_bit(minimum_select_bitmap, field->field_index);
|
|
}
|
|
}
|
|
}
|
|
for (field_p = table->field; *field_p; field_p++)
|
|
{
|
|
uint field_index = (*field_p)->field_index;
|
|
if (
|
|
spider_bit_is_set(spider->searched_bitmap, field_index) |
|
|
bitmap_is_set(table->read_set, field_index) |
|
|
bitmap_is_set(table->write_set, field_index)
|
|
) {
|
|
spider_set_bit(minimum_select_bitmap, field_index);
|
|
}
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
bool spider_handlersocket_handler::minimum_select_bit_is_set(
|
|
uint field_index
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::minimum_select_bit_is_set");
|
|
DBUG_PRINT("info",("spider field_index=%u", field_index));
|
|
DBUG_PRINT("info",("spider minimum_select_bitmap=%s",
|
|
spider_bit_is_set(minimum_select_bitmap, field_index) ?
|
|
"TRUE" : "FALSE"));
|
|
DBUG_RETURN(spider_bit_is_set(minimum_select_bitmap, field_index));
|
|
}
|
|
|
|
void spider_handlersocket_handler::copy_minimum_select_bitmap(
|
|
uchar *bitmap
|
|
) {
|
|
int roop_count;
|
|
TABLE *table = spider->get_table();
|
|
DBUG_ENTER("spider_handlersocket_handler::copy_minimum_select_bitmap");
|
|
for (roop_count = 0;
|
|
roop_count < (int) ((table->s->fields + 7) / 8);
|
|
roop_count++)
|
|
{
|
|
bitmap[roop_count] =
|
|
minimum_select_bitmap[roop_count];
|
|
DBUG_PRINT("info",("spider roop_count=%d", roop_count));
|
|
DBUG_PRINT("info",("spider bitmap=%d",
|
|
bitmap[roop_count]));
|
|
}
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int spider_handlersocket_handler::init_union_table_name_pos()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::init_union_table_name_pos");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::set_union_table_name_pos()
|
|
{
|
|
DBUG_ENTER("spider_handlersocket_handler::set_union_table_name_pos");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reset_union_table_name(
|
|
spider_string *str,
|
|
int link_idx,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::reset_union_table_name");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
|
|
int spider_handlersocket_handler::append_list_item_select_part(
|
|
List<Item> *select,
|
|
const char *alias,
|
|
uint alias_length,
|
|
bool use_fields,
|
|
spider_fields *fields,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_list_item_select_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_from_and_tables_part(
|
|
spider_fields *fields,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_from_and_tables_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::reappend_tables_part(
|
|
spider_fields *fields,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::reappend_tables_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_where_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_where_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_having_part(
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_having_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_item_type_part(
|
|
Item *item,
|
|
const char *alias,
|
|
uint alias_length,
|
|
bool use_fields,
|
|
spider_fields *fields,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_item_type_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_group_by_part(
|
|
ORDER *order,
|
|
const char *alias,
|
|
uint alias_length,
|
|
bool use_fields,
|
|
spider_fields *fields,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_group_by_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
int spider_handlersocket_handler::append_order_by_part(
|
|
ORDER *order,
|
|
const char *alias,
|
|
uint alias_length,
|
|
bool use_fields,
|
|
spider_fields *fields,
|
|
ulong sql_type
|
|
) {
|
|
DBUG_ENTER("spider_handlersocket_handler::append_order_by_part");
|
|
DBUG_PRINT("info",("spider this=%p", this));
|
|
DBUG_ASSERT(0);
|
|
DBUG_RETURN(0);
|
|
}
|
|
#endif
|
|
#endif
|