summaryrefslogtreecommitdiff
path: root/storage/spider
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2014-04-15 11:29:57 +0400
committerSergey Vojtovich <svoj@mariadb.org>2014-04-15 11:29:57 +0400
commit15b443b095f955e71bb51ac3d56057088d0bfbae (patch)
tree07ff893bf1132abaa6a3009eb0cdffba401b82d8 /storage/spider
parent244d4b532a1f0dc103192ec6f6990056124ee93d (diff)
parente105d8bcc5c86518fa23184c0d901726195026c9 (diff)
downloadmariadb-git-15b443b095f955e71bb51ac3d56057088d0bfbae.tar.gz
MDEV-6088 - Merge spider 3.2
Diffstat (limited to 'storage/spider')
-rw-r--r--storage/spider/ha_spider.cc600
-rw-r--r--storage/spider/ha_spider.h31
-rw-r--r--storage/spider/spd_conn.cc162
-rw-r--r--storage/spider/spd_conn.h21
-rw-r--r--storage/spider/spd_copy_tables.cc15
-rw-r--r--storage/spider/spd_copy_tables.h2
-rw-r--r--storage/spider/spd_db_conn.cc399
-rw-r--r--storage/spider/spd_db_conn.h5
-rw-r--r--storage/spider/spd_db_handlersocket.cc11178
-rw-r--r--storage/spider/spd_db_handlersocket.h1899
-rw-r--r--storage/spider/spd_db_include.h24
-rw-r--r--storage/spider/spd_db_mysql.cc23443
-rw-r--r--storage/spider/spd_db_mysql.h2760
-rw-r--r--storage/spider/spd_db_oracle.cc24959
-rw-r--r--storage/spider/spd_db_oracle.h2945
-rw-r--r--storage/spider/spd_direct_sql.cc14
-rw-r--r--storage/spider/spd_direct_sql.h2
-rw-r--r--storage/spider/spd_err.h4
-rw-r--r--storage/spider/spd_i_s.cc313
-rw-r--r--storage/spider/spd_include.h38
-rw-r--r--storage/spider/spd_malloc.cc2
-rw-r--r--storage/spider/spd_malloc.h2
-rw-r--r--storage/spider/spd_param.cc174
-rw-r--r--storage/spider/spd_param.h15
-rw-r--r--storage/spider/spd_ping_table.cc2912
-rw-r--r--storage/spider/spd_ping_table.h204
-rw-r--r--storage/spider/spd_sys_table.cc15
-rw-r--r--storage/spider/spd_sys_table.h2
-rw-r--r--storage/spider/spd_table.cc103
-rw-r--r--storage/spider/spd_table.h2
-rw-r--r--storage/spider/spd_trx.cc402
-rw-r--r--storage/spider/spd_trx.h6
-rw-r--r--storage/spider/spd_udf.cc2
-rw-r--r--storage/spider/spd_udf.h2
34 files changed, 37220 insertions, 35437 deletions
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc
index 9b871f59a38..664df62e586 100644
--- a/storage/spider/ha_spider.cc
+++ b/storage/spider/ha_spider.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -87,6 +87,7 @@ ha_spider::ha_spider(
mrr_key_buff = NULL;
#endif
append_tblnm_alias = NULL;
+ has_clone_for_merge = FALSE;
is_clone = FALSE;
clone_bitmap_init = FALSE;
pt_clone_source_handler = NULL;
@@ -100,6 +101,7 @@ ha_spider::ha_spider(
error_mode = 0;
use_spatial_index = FALSE;
use_pre_call = FALSE;
+ use_pre_records = FALSE;
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
do_direct_update = FALSE;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -151,6 +153,8 @@ ha_spider::ha_spider(
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
result_list.direct_aggregate = FALSE;
#endif
+ result_list.casual_read = NULL;
+ result_list.use_both_key = FALSE;
DBUG_VOID_RETURN;
}
@@ -188,6 +192,7 @@ ha_spider::ha_spider(
mrr_key_buff = NULL;
#endif
append_tblnm_alias = NULL;
+ has_clone_for_merge = FALSE;
is_clone = FALSE;
clone_bitmap_init = FALSE;
pt_clone_source_handler = NULL;
@@ -201,6 +206,7 @@ ha_spider::ha_spider(
error_mode = 0;
use_spatial_index = FALSE;
use_pre_call = FALSE;
+ use_pre_records = FALSE;
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
do_direct_update = FALSE;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -252,6 +258,8 @@ ha_spider::ha_spider(
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
result_list.direct_aggregate = FALSE;
#endif
+ result_list.casual_read = NULL;
+ result_list.use_both_key = FALSE;
ref_length = sizeof(SPIDER_POSITION);
DBUG_VOID_RETURN;
}
@@ -283,6 +291,7 @@ handler *ha_spider::clone(
HA_OPEN_IGNORE_IF_LOCKED))
DBUG_RETURN(NULL);
spider->sync_from_clone_source_base(this);
+ has_clone_for_merge = TRUE;
DBUG_RETURN((handler *) spider);
}
@@ -811,15 +820,6 @@ int ha_spider::check_access_kind(
DBUG_ENTER("ha_spider::check_access_kind");
DBUG_PRINT("info",("spider this=%p", this));
sql_command = thd_sql_command(thd);
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- do_direct_update = FALSE;
- maybe_do_hs_direct_update = FALSE;
-#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- memset(do_hs_direct_update, 0, share->link_bitmap_size);
-#endif
-#endif
conn_kinds = 0;
switch (sql_command)
{
@@ -876,24 +876,10 @@ int ha_spider::check_access_kind(
break;
case SQLCOM_HS_UPDATE:
case SQLCOM_HS_DELETE:
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- do_direct_update = TRUE;
- maybe_do_hs_direct_update = TRUE;
-#endif
+ conn_kinds |= SPIDER_CONN_KIND_MYSQL;
for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
{
- conn_kinds |= SPIDER_CONN_KIND_MYSQL;
conn_kind[roop_count] = SPIDER_CONN_KIND_MYSQL;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (spider_param_use_hs_write(thd, share->use_hs_writes[roop_count]))
- {
- DBUG_PRINT("info",("spider do_hs_direct_update[%d]=TRUE",
- roop_count));
- spider_set_bit(do_hs_direct_update, roop_count);
- } else {
- maybe_do_hs_direct_update = FALSE;
- }
-#endif
}
break;
case SQLCOM_HS_INSERT:
@@ -919,13 +905,10 @@ int ha_spider::check_access_kind(
case SQLCOM_UPDATE_MULTI:
case SQLCOM_DELETE:
case SQLCOM_DELETE_MULTI:
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- do_direct_update = TRUE;
-#endif
default:
+ conn_kinds |= SPIDER_CONN_KIND_MYSQL;
for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
{
- conn_kinds |= SPIDER_CONN_KIND_MYSQL;
conn_kind[roop_count] = SPIDER_CONN_KIND_MYSQL;
}
break;
@@ -942,16 +925,30 @@ int ha_spider::check_access_kind(
}
DBUG_PRINT("info",("spider sql_command=%u", sql_command));
DBUG_PRINT("info",("spider thd->query_id=%lld", thd->query_id));
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#ifdef HS_HAS_SQLCOM
+ if (sql_command == SQLCOM_HS_UPDATE)
+ update_request = TRUE;
+ else
+#endif
+ update_request = FALSE;
+#else
if (
#ifdef HS_HAS_SQLCOM
sql_command == SQLCOM_HS_UPDATE ||
#endif
sql_command == SQLCOM_UPDATE ||
- sql_command == SQLCOM_UPDATE_MULTI
+ sql_command == SQLCOM_UPDATE_MULTI ||
+ /* for triggers */
+ sql_command == SQLCOM_INSERT ||
+ sql_command == SQLCOM_INSERT_SELECT ||
+ sql_command == SQLCOM_DELETE ||
+ sql_command == SQLCOM_DELETE_MULTI
)
update_request = TRUE;
else
update_request = FALSE;
+#endif
DBUG_RETURN(0);
}
@@ -1115,6 +1112,8 @@ THR_LOCK_DATA **ha_spider::store_lock(
sql_command == SQLCOM_LOCK_TABLES ||
(spider_param_lock_exchange(thd) == 1 && share->semi_table_lock))
{
+ DBUG_PRINT("info",("spider lock exchange route"));
+ DBUG_PRINT("info",("spider lock_type=%u", this->lock_type));
if (
(
this->lock_type == TL_READ ||
@@ -1148,6 +1147,8 @@ THR_LOCK_DATA **ha_spider::store_lock(
}
}
} else {
+ DBUG_PRINT("info",("spider default lock route"));
+ DBUG_PRINT("info",("spider lock_type=%u", this->lock_type));
if (
this->lock_type == TL_READ ||
this->lock_type == TL_READ_NO_INSERT ||
@@ -1476,13 +1477,9 @@ int ha_spider::external_lock(
conn_kinds & SPIDER_CONN_KIND_HS_WRITE
#if defined(HS_HAS_SQLCOM) && defined(HANDLER_HAS_DIRECT_UPDATE_ROWS)
) ||
- (
- do_direct_update &&
- (
- sql_command == SQLCOM_HS_UPDATE ||
- sql_command == SQLCOM_HS_DELETE
- )
- )
+ /* for direct_update */
+ sql_command == SQLCOM_HS_UPDATE ||
+ sql_command == SQLCOM_HS_DELETE
#endif
) {
SPIDER_CONN *hs_conn;
@@ -1681,6 +1678,7 @@ int ha_spider::reset()
}
*/
memset(need_mons, 0, sizeof(int) * share->link_count);
+ memset(result_list.casual_read, 0, sizeof(int) * share->link_count);
rm_bulk_tmp_table();
for (roop_count = share->link_count - 1; roop_count >= 0; roop_count--)
{
@@ -1717,12 +1715,15 @@ int ha_spider::reset()
high_priority = FALSE;
insert_delayed = FALSE;
use_pre_call = FALSE;
+ use_pre_records = FALSE;
bulk_insert = FALSE;
clone_bitmap_init = FALSE;
result_list.tmp_table_join = FALSE;
result_list.use_union = FALSE;
+ result_list.use_both_key = FALSE;
pt_clone_last_searcher = NULL;
conn_kinds = SPIDER_CONN_KIND_MYSQL;
+ has_clone_for_merge = FALSE;
while (condition)
{
tmp_cond = condition->next;
@@ -1751,6 +1752,7 @@ int ha_spider::reset()
#endif
#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ do_direct_update = FALSE;
direct_update_fields = NULL;
#endif
#ifdef INFO_KIND_FORCE_LIMIT_BEGIN
@@ -1986,14 +1988,8 @@ int ha_spider::index_read_map_internal(
my_error(ER_QUERY_INTERRUPTED, MYF(0));
DBUG_RETURN(ER_QUERY_INTERRUPTED);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (do_direct_update)
- {
- direct_update_kinds = SPIDER_SQL_KIND_SQL;
- memset(do_hs_direct_update, 0, share->link_bitmap_size);
- }
-#endif
+ do_direct_update = FALSE;
#endif
if (
find_flag >= HA_READ_MBR_CONTAIN &&
@@ -2146,6 +2142,9 @@ int ha_spider::index_read_map_internal(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
if ((error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok))))
{
@@ -2491,6 +2490,9 @@ int ha_spider::index_read_last_map_internal(
my_error(ER_QUERY_INTERRUPTED, MYF(0));
DBUG_RETURN(ER_QUERY_INTERRUPTED);
}
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ do_direct_update = FALSE;
+#endif
if ((error_num = index_handler_init()))
DBUG_RETURN(check_error_mode_eof(error_num));
if (is_clone)
@@ -2627,6 +2629,9 @@ int ha_spider::index_read_last_map_internal(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
if ((error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok))))
{
@@ -2956,6 +2961,9 @@ int ha_spider::index_first_internal(
my_error(ER_QUERY_INTERRUPTED, MYF(0));
DBUG_RETURN(ER_QUERY_INTERRUPTED);
}
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ do_direct_update = FALSE;
+#endif
if ((error_num = index_handler_init()))
DBUG_RETURN(check_error_mode_eof(error_num));
if (is_clone)
@@ -3082,6 +3090,9 @@ int ha_spider::index_first_internal(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
if ((error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok))))
{
@@ -3329,6 +3340,9 @@ int ha_spider::index_last_internal(
my_error(ER_QUERY_INTERRUPTED, MYF(0));
DBUG_RETURN(ER_QUERY_INTERRUPTED);
}
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ do_direct_update = FALSE;
+#endif
if ((error_num = index_handler_init()))
DBUG_RETURN(check_error_mode_eof(error_num));
if (is_clone)
@@ -3455,6 +3469,9 @@ int ha_spider::index_last_internal(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
if ((error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok))))
{
@@ -3755,6 +3772,9 @@ int ha_spider::read_range_first_internal(
my_error(ER_QUERY_INTERRUPTED, MYF(0));
DBUG_RETURN(ER_QUERY_INTERRUPTED);
}
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ do_direct_update = FALSE;
+#endif
if (
start_key &&
start_key->flag >= HA_READ_MBR_CONTAIN &&
@@ -3819,6 +3839,7 @@ int ha_spider::read_range_first_internal(
result_list.limit_num =
result_list.internal_limit >= result_list.split_read ?
result_list.split_read : result_list.internal_limit;
+ DBUG_PRINT("info",("spider limit_num=%lld", result_list.limit_num));
if (
(error_num = spider_db_append_key_where(
start_key, eq_range ? NULL : end_key, this))
@@ -3887,6 +3908,9 @@ int ha_spider::read_range_first_internal(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
if ((error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok))))
{
@@ -4109,10 +4133,14 @@ int ha_spider::read_range_first(
if ((error_num = spider_bg_all_conn_pre_next(this, search_link_idx)))
DBUG_RETURN(error_num);
use_pre_call = FALSE;
- DBUG_RETURN(read_range_next());
+ if ((error_num = read_range_next()))
+ DBUG_RETURN(error_num);
+ DBUG_RETURN(check_ha_range_eof());
}
- DBUG_RETURN(read_range_first_internal(table->record[0], start_key, end_key,
- eq_range, sorted));
+ if ((error_num = read_range_first_internal(table->record[0], start_key,
+ end_key, eq_range, sorted)))
+ DBUG_RETURN(error_num);
+ DBUG_RETURN(check_ha_range_eof());
}
int ha_spider::read_range_next()
@@ -4143,7 +4171,7 @@ int ha_spider::read_range_next()
if ((error_num = spider_db_seek_next(table->record[0], this, search_link_idx,
table)))
DBUG_RETURN(check_error_mode_eof(error_num));
- DBUG_RETURN(0);
+ DBUG_RETURN(check_ha_range_eof());
}
#ifdef HA_MRR_USE_DEFAULT_IMPL
@@ -4248,28 +4276,6 @@ int ha_spider::multi_range_read_init(
)
);
}
-
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
-int ha_spider::multi_range_read_next(
- range_id_t *range_info
-)
-#else
-int ha_spider::multi_range_read_next(
- char **range_info
-)
-#endif
-{
- int error_num;
- DBUG_ENTER("ha_spider::multi_range_read_next");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!mrr_have_range)
- {
- error_num = multi_range_read_next_first(range_info);
- mrr_have_range = TRUE;
- } else
- error_num = multi_range_read_next_next(range_info);
- DBUG_RETURN(error_num);
-}
#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
@@ -4310,6 +4316,9 @@ int ha_spider::read_multi_range_first_internal(
my_error(ER_QUERY_INTERRUPTED, MYF(0));
DBUG_RETURN(ER_QUERY_INTERRUPTED);
}
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ do_direct_update = FALSE;
+#endif
if ((error_num = index_handler_init()))
DBUG_RETURN(check_error_mode_eof(error_num));
if (is_clone)
@@ -4389,16 +4398,17 @@ int ha_spider::read_multi_range_first_internal(
result_list.split_read ?
result_list.split_read :
result_list.internal_limit - result_list.record_num;
+ DBUG_PRINT("info",("spider limit_num=%lld", result_list.limit_num));
if (
#ifdef HA_MRR_USE_DEFAULT_IMPL
(error_num = spider_db_append_key_where(
&mrr_cur_range.start_key,
- MY_TEST(mrr_cur_range.range_flag & EQ_RANGE) ?
+ SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE) ?
NULL : &mrr_cur_range.end_key, this))
#else
(error_num = spider_db_append_key_where(
&multi_range_curr->start_key,
- MY_TEST(multi_range_curr->range_flag & EQ_RANGE) ?
+ SPIDER_TEST(multi_range_curr->range_flag & EQ_RANGE) ?
NULL : &multi_range_curr->end_key, this))
#endif
)
@@ -4466,6 +4476,9 @@ int ha_spider::read_multi_range_first_internal(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok));
if (
@@ -4673,6 +4686,8 @@ int ha_spider::read_multi_range_first_internal(
}
} else {
#ifdef HA_MRR_USE_DEFAULT_IMPL
+ if (!range_info)
+ DBUG_RETURN(0);
if (!(error_num = spider_db_fetch(table->record[0], this, table)))
#else
if (!buf || !(error_num = spider_db_fetch(buf, this, table)))
@@ -4683,7 +4698,7 @@ int ha_spider::read_multi_range_first_internal(
#else
*found_range_p = multi_range_curr;
#endif
- DBUG_RETURN(0);
+ DBUG_RETURN(check_ha_range_eof());
}
if (
error_num != HA_ERR_END_OF_FILE &&
@@ -4834,9 +4849,9 @@ int ha_spider::read_multi_range_first_internal(
!(sql_kinds & SPIDER_SQL_KIND_HS) &&
#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
- MY_TEST(mrr_cur_range.range_flag & EQ_RANGE)
+ SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE)
#else
- MY_TEST(multi_range_curr->range_flag & EQ_RANGE)
+ SPIDER_TEST(multi_range_curr->range_flag & EQ_RANGE)
#endif
) {
if (
@@ -4951,11 +4966,11 @@ int ha_spider::read_multi_range_first_internal(
{
if (
#ifdef HA_MRR_USE_DEFAULT_IMPL
- !MY_TEST(mrr_cur_range.range_flag & EQ_RANGE) ||
+ !SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE) ||
result_list.tmp_table_join_key_part_map !=
mrr_cur_range.start_key.keypart_map
#else
- !MY_TEST(multi_range_curr->range_flag & EQ_RANGE) ||
+ !SPIDER_TEST(multi_range_curr->range_flag & EQ_RANGE) ||
result_list.tmp_table_join_key_part_map !=
multi_range_curr->start_key.keypart_map
#endif
@@ -5072,6 +5087,7 @@ int ha_spider::read_multi_range_first_internal(
}
} else {
result_list.limit_num = result_list.internal_limit;
+ result_list.split_read = result_list.internal_limit;
if (
(error_num = init_union_table_name_pos_sql()) ||
(error_num = append_union_all_start_sql_part(
@@ -5115,16 +5131,19 @@ int ha_spider::read_multi_range_first_internal(
)
DBUG_RETURN(error_num);
set_where_pos_sql(SPIDER_SQL_TYPE_SELECT_SQL);
+ DBUG_PRINT("info",("spider internal_offset=%lld",
+ result_list.internal_offset));
+ DBUG_PRINT("info",("spider limit_num=%lld", result_list.limit_num));
if (
#ifdef HA_MRR_USE_DEFAULT_IMPL
(error_num = spider_db_append_key_where(
&mrr_cur_range.start_key,
- MY_TEST(mrr_cur_range.range_flag & EQ_RANGE) ?
+ SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE) ?
NULL : &mrr_cur_range.end_key, this))
#else
(error_num = spider_db_append_key_where(
&multi_range_curr->start_key,
- MY_TEST(multi_range_curr->range_flag & EQ_RANGE) ?
+ SPIDER_TEST(multi_range_curr->range_flag & EQ_RANGE) ?
NULL : &multi_range_curr->end_key, this))
#endif
)
@@ -5238,6 +5257,9 @@ int ha_spider::read_multi_range_first_internal(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
if ((error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok))))
{
@@ -5512,6 +5534,8 @@ int ha_spider::read_multi_range_first_internal(
DBUG_RETURN(error_num);
} else {
#ifdef HA_MRR_USE_DEFAULT_IMPL
+ if (!range_info)
+ DBUG_RETURN(0);
if (!(error_num = spider_db_fetch(table->record[0], this, table)))
#else
if (!buf || !(error_num = spider_db_fetch(buf, this, table)))
@@ -5586,6 +5610,56 @@ int ha_spider::read_multi_range_first_internal(
}
#ifdef HA_MRR_USE_DEFAULT_IMPL
+int ha_spider::pre_multi_range_read_next(
+ bool use_parallel
+) {
+ DBUG_ENTER("ha_spider::pre_multi_range_read_next");
+ DBUG_PRINT("info",("spider this=%p", this));
+ check_pre_call(use_parallel);
+ if (use_pre_call)
+ {
+ store_error_num =
+ multi_range_read_next_first(NULL);
+ DBUG_RETURN(store_error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
+int ha_spider::multi_range_read_next(
+ range_id_t *range_info
+)
+#else
+int ha_spider::multi_range_read_next(
+ char **range_info
+)
+#endif
+{
+ int error_num;
+ DBUG_ENTER("ha_spider::multi_range_read_next");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (use_pre_call)
+ {
+ if (store_error_num)
+ {
+ if (store_error_num == HA_ERR_END_OF_FILE)
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(store_error_num);
+ }
+ if ((error_num = spider_bg_all_conn_pre_next(this, search_link_idx)))
+ DBUG_RETURN(error_num);
+ use_pre_call = FALSE;
+ mrr_have_range = TRUE;
+ DBUG_RETURN(multi_range_read_next_next(range_info));
+ }
+ if (!mrr_have_range)
+ {
+ error_num = multi_range_read_next_first(range_info);
+ mrr_have_range = TRUE;
+ } else
+ error_num = multi_range_read_next_next(range_info);
+ DBUG_RETURN(error_num);
+}
#else
int ha_spider::pre_read_multi_range_first(
KEY_MULTI_RANGE **found_range_p,
@@ -5680,7 +5754,7 @@ int ha_spider::read_multi_range_next(
) {
if (!(error_num = spider_db_seek_next(table->record[0], this,
search_link_idx, table)))
- DBUG_RETURN(0);
+ DBUG_RETURN(check_ha_range_eof());
#ifdef HA_MRR_USE_DEFAULT_IMPL
range_res = mrr_funcs.next(mrr_iter, &mrr_cur_range);
DBUG_PRINT("info",("spider range_res1=%d", range_res));
@@ -5739,12 +5813,12 @@ int ha_spider::read_multi_range_next(
#ifdef HA_MRR_USE_DEFAULT_IMPL
(error_num = spider_db_append_key_where(
&mrr_cur_range.start_key,
- MY_TEST(mrr_cur_range.range_flag & EQ_RANGE) ?
+ SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE) ?
NULL : &mrr_cur_range.end_key, this))
#else
(error_num = spider_db_append_key_where(
&multi_range_curr->start_key,
- MY_TEST(multi_range_curr->range_flag & EQ_RANGE) ?
+ SPIDER_TEST(multi_range_curr->range_flag & EQ_RANGE) ?
NULL : &multi_range_curr->end_key, this))
#endif
)
@@ -5812,6 +5886,9 @@ int ha_spider::read_multi_range_next(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok));
if (
@@ -6026,7 +6103,7 @@ int ha_spider::read_multi_range_next(
#else
*found_range_p = multi_range_curr;
#endif
- DBUG_RETURN(0);
+ DBUG_RETURN(check_ha_range_eof());
}
if (
error_num != HA_ERR_END_OF_FILE &&
@@ -6193,9 +6270,9 @@ int ha_spider::read_multi_range_next(
!(sql_kinds & SPIDER_SQL_KIND_HS) &&
#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
- MY_TEST(mrr_cur_range.range_flag & EQ_RANGE)
+ SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE)
#else
- MY_TEST(multi_range_curr->range_flag & EQ_RANGE)
+ SPIDER_TEST(multi_range_curr->range_flag & EQ_RANGE)
#endif
) {
if (
@@ -6311,11 +6388,11 @@ int ha_spider::read_multi_range_next(
{
if (
#ifdef HA_MRR_USE_DEFAULT_IMPL
- !MY_TEST(mrr_cur_range.range_flag & EQ_RANGE) ||
+ !SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE) ||
result_list.tmp_table_join_key_part_map !=
mrr_cur_range.start_key.keypart_map
#else
- !MY_TEST(multi_range_curr->range_flag & EQ_RANGE) ||
+ !SPIDER_TEST(multi_range_curr->range_flag & EQ_RANGE) ||
result_list.tmp_table_join_key_part_map !=
multi_range_curr->start_key.keypart_map
#endif
@@ -6478,12 +6555,12 @@ int ha_spider::read_multi_range_next(
#ifdef HA_MRR_USE_DEFAULT_IMPL
(error_num = spider_db_append_key_where(
&mrr_cur_range.start_key,
- MY_TEST(mrr_cur_range.range_flag & EQ_RANGE) ?
+ SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE) ?
NULL : &mrr_cur_range.end_key, this))
#else
(error_num = spider_db_append_key_where(
&multi_range_curr->start_key,
- MY_TEST(multi_range_curr->range_flag & EQ_RANGE) ?
+ SPIDER_TEST(multi_range_curr->range_flag & EQ_RANGE) ?
NULL : &multi_range_curr->end_key, this))
#endif
)
@@ -6594,6 +6671,9 @@ int ha_spider::read_multi_range_next(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
if ((error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok))))
{
@@ -7104,6 +7184,9 @@ int ha_spider::rnd_next_internal(
/* do not copy table data at alter table */
if (sql_command == SQLCOM_ALTER_TABLE)
DBUG_RETURN(HA_ERR_END_OF_FILE);
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ do_direct_update = FALSE;
+#endif
if (rnd_scan_and_first)
{
@@ -7136,12 +7219,21 @@ int ha_spider::rnd_next_internal(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
set_order_pos_sql(SPIDER_SQL_TYPE_SELECT_SQL);
- if (
- result_list.direct_order_limit &&
- (error_num = append_key_order_for_direct_order_limit_with_alias_sql_part(
- NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL))
- )
- DBUG_RETURN(error_num);
+ if (result_list.direct_order_limit)
+ {
+ if ((error_num =
+ append_key_order_for_direct_order_limit_with_alias_sql_part(
+ NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL)))
+ DBUG_RETURN(error_num);
+ }
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ else if (result_list.direct_aggregate)
+ {
+ if ((error_num =
+ append_group_by_sql_part(NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL)))
+ DBUG_RETURN(error_num);
+ }
+#endif
result_list.desc_flg = FALSE;
result_list.sorted = FALSE;
result_list.key_info = NULL;
@@ -7200,6 +7292,9 @@ int ha_spider::rnd_next_internal(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
if ((error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok))))
{
@@ -7416,6 +7511,12 @@ void ha_spider::position(
pt_clone_last_searcher->position(record);
memcpy(ref, pt_clone_last_searcher->ref, ref_length);
} else {
+ if (is_clone)
+ {
+ DBUG_PRINT("info",("spider set pt_clone_last_searcher (NULL) to %p",
+ pt_clone_source_handler));
+ pt_clone_source_handler->pt_clone_last_searcher = NULL;
+ }
memset(ref, '0', sizeof(SPIDER_POSITION));
DBUG_PRINT("info",("spider self position"));
DBUG_PRINT("info",
@@ -7708,16 +7809,23 @@ int ha_spider::ft_read_internal(
result_list.limit_num =
result_list.internal_limit >= result_list.split_read ?
result_list.split_read : result_list.internal_limit;
- if (
- (error_num = spider_db_append_match_where(this)) ||
- (
- result_list.direct_order_limit &&
- (error_num =
- append_key_order_for_direct_order_limit_with_alias_sql_part(NULL, 0,
- SPIDER_SQL_TYPE_SELECT_SQL))
- )
- )
+ if ((error_num = spider_db_append_match_where(this)))
DBUG_RETURN(error_num);
+ if (result_list.direct_order_limit)
+ {
+ if ((error_num =
+ append_key_order_for_direct_order_limit_with_alias_sql_part(NULL, 0,
+ SPIDER_SQL_TYPE_SELECT_SQL)))
+ DBUG_RETURN(error_num);
+ }
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ else if (result_list.direct_aggregate)
+ {
+ if ((error_num =
+ append_group_by_sql_part(NULL, 0, SPIDER_SQL_TYPE_SELECT_SQL)))
+ DBUG_RETURN(error_num);
+ }
+#endif
if (sql_kinds & SPIDER_SQL_KIND_SQL)
{
if ((error_num = append_limit_sql_part(
@@ -7770,6 +7878,9 @@ int ha_spider::ft_read_internal(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list.bgs_phase > 0)
{
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, this,
+ roop_count)))
+ DBUG_RETURN(error_num);
if ((error_num = spider_bg_conn_search(this, roop_count, roop_start,
TRUE, FALSE, (roop_count != link_ok))))
{
@@ -7986,6 +8097,9 @@ int ha_spider::info(
DBUG_ENTER("ha_spider::info");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider flag=%x", flag));
+#ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT
+ auto_inc_temporary = FALSE;
+#endif
sql_command = thd_sql_command(thd);
if (
sql_command == SQLCOM_DROP_TABLE ||
@@ -7996,8 +8110,12 @@ int ha_spider::info(
{
if (share->auto_increment_value)
stats.auto_increment_value = share->auto_increment_value;
- else
+ else {
stats.auto_increment_value = 1;
+#ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT
+ auto_inc_temporary = TRUE;
+#endif
+ }
}
DBUG_RETURN(0);
}
@@ -8078,10 +8196,30 @@ int ha_spider::info(
pthread_mutex_lock(&share->sts_mutex);
if (difftime(tmp_time, share->sts_get_time) >= sts_interval)
{
- if (
- (error_num = spider_check_trx_and_get_conn(ha_thd(), this,
- FALSE)) ||
- (error_num = spider_get_sts(share, search_link_idx, tmp_time,
+ if ((error_num = spider_check_trx_and_get_conn(ha_thd(), this,
+ FALSE)))
+ {
+ if (!share->sts_init)
+ {
+ if (
+ spider_init_error_table ||
+ (spider_init_error_table =
+ spider_get_init_error_table(trx, share, TRUE))
+ ) {
+ spider_init_error_table->init_error = error_num;
+ if ((spider_init_error_table->init_error_with_message =
+ thd->is_error()))
+ strmov(spider_init_error_table->init_error_msg,
+ spider_stmt_da_message(thd));
+ spider_init_error_table->init_error_time =
+ (time_t) time((time_t*) 0);
+ }
+ share->init_error = TRUE;
+ share->init = TRUE;
+ }
+ DBUG_RETURN(check_error_mode(error_num));
+ }
+ if ((error_num = spider_get_sts(share, search_link_idx, tmp_time,
this, sts_interval, sts_mode,
#ifdef WITH_PARTITION_STORAGE_ENGINE
sts_sync,
@@ -8523,6 +8661,10 @@ int ha_spider::check_crd()
}
if (crd_mode == 3)
crd_mode = 1;
+ if ((error_num = spider_check_trx_and_get_conn(ha_thd(), this, FALSE)))
+ {
+ DBUG_RETURN(check_error_mode(error_num));
+ }
dbton_id = share->sql_dbton_ids[search_link_idx];
dbton_hdl = dbton_handler[dbton_id];
crd_mode = dbton_hdl->crd_mode_exchange(crd_mode);
@@ -8622,6 +8764,32 @@ int ha_spider::check_crd()
DBUG_RETURN(0);
}
+int ha_spider::pre_records()
+{
+ int error_num;
+ backup_error_status();
+ DBUG_ENTER("ha_spider::pre_records");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_command == SQLCOM_ALTER_TABLE)
+ {
+ DBUG_RETURN(0);
+ }
+ THD *thd = trx->thd;
+ if (
+ spider_param_sync_autocommit(thd) &&
+ (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
+ ) {
+ result_list.casual_read[search_link_idx] =
+ spider_param_casual_read(thd, share->casual_read);
+ }
+ if ((error_num = spider_db_show_records(this, search_link_idx, TRUE)))
+ {
+ DBUG_RETURN(check_error_mode(error_num));
+ }
+ use_pre_records = TRUE;
+ DBUG_RETURN(0);
+}
+
ha_rows ha_spider::records()
{
int error_num;
@@ -8630,14 +8798,29 @@ ha_rows ha_spider::records()
DBUG_PRINT("info",("spider this=%p", this));
if (sql_command == SQLCOM_ALTER_TABLE)
{
+ use_pre_records = FALSE;
DBUG_RETURN(0);
}
- if ((error_num = spider_db_show_records(this, search_link_idx)))
+ if (!use_pre_records)
+ {
+ THD *thd = trx->thd;
+ if (
+ spider_param_sync_autocommit(thd) &&
+ (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
+ ) {
+ result_list.casual_read[search_link_idx] =
+ spider_param_casual_read(thd, share->casual_read);
+ }
+ }
+ if ((error_num = spider_db_show_records(this, search_link_idx, FALSE)))
{
+ use_pre_records = FALSE;
check_error_mode(error_num);
DBUG_RETURN(HA_POS_ERROR);
}
- DBUG_RETURN(share->records);
+ use_pre_records = FALSE;
+ share->records = table_rows;
+ DBUG_RETURN(table_rows);
}
const char *ha_spider::table_type() const
@@ -8671,8 +8854,10 @@ ulonglong ha_spider::table_flags() const
HA_HAS_RECORDS |
HA_PARTIAL_COLUMN_READ |
#ifdef HA_CAN_BULK_ACCESS
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
(support_bulk_access_hs() ? HA_CAN_BULK_ACCESS : 0) |
#endif
+#endif
SPIDER_CAN_BG_SEARCH |
SPIDER_CAN_BG_INSERT |
SPIDER_CAN_BG_UPDATE |
@@ -8780,6 +8965,19 @@ bool ha_spider::need_info_for_auto_inc()
}
#endif
+#ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT
+bool ha_spider::can_use_for_auto_inc_init()
+{
+ DBUG_ENTER("ha_spider::can_use_for_auto_inc_init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider return=%s", (
+ !auto_inc_temporary
+ ) ? "TRUE" : "FALSE"));
+ DBUG_RETURN((
+ !auto_inc_temporary
+ ));
+}
+#endif
int ha_spider::update_auto_increment()
{
@@ -9120,6 +9318,41 @@ int ha_spider::pre_write_row(
}
#endif
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+void ha_spider::direct_update_init(
+ THD *thd,
+ bool hs_request
+) {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ uint roop_count;
+#endif
+ DBUG_ENTER("ha_spider::direct_update_init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ do_direct_update = TRUE;
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ if (hs_request)
+ {
+ maybe_do_hs_direct_update = TRUE;
+ memset(do_hs_direct_update, 0, share->link_bitmap_size);
+ for (roop_count = 0; roop_count < share->link_count; roop_count++)
+ {
+ if (spider_param_use_hs_write(thd, share->use_hs_writes[roop_count]))
+ {
+ DBUG_PRINT("info",("spider do_hs_direct_update[%d]=TRUE",
+ roop_count));
+ spider_set_bit(do_hs_direct_update, roop_count);
+ } else {
+ maybe_do_hs_direct_update = FALSE;
+ }
+ }
+ } else {
+ maybe_do_hs_direct_update = FALSE;
+ }
+#endif
+ DBUG_VOID_RETURN;
+}
+#endif
+
bool ha_spider::start_bulk_update(
) {
DBUG_ENTER("ha_spider::start_bulk_update");
@@ -9260,6 +9493,9 @@ int ha_spider::direct_update_rows_init(
bool sorted,
uchar *new_data
) {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ int error_num;
+#endif
st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
@@ -9287,6 +9523,14 @@ int ha_spider::direct_update_rows_init(
mode, ranges, range_count, sorted, new_data));
}
#endif
+ direct_update_init(
+ thd,
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ sql_command == SQLCOM_HS_UPDATE
+#else
+ FALSE
+#endif
+ );
if (!condition)
cond_check = FALSE;
spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit);
@@ -9307,6 +9551,7 @@ int ha_spider::direct_update_rows_init(
spider_db_append_condition(this, NULL, 0, TRUE)
) {
DBUG_PRINT("info",("spider FALSE by condition"));
+ do_direct_update = FALSE;
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
if (select_lex->order_list.elements)
@@ -9318,12 +9563,12 @@ int ha_spider::direct_update_rows_init(
if (check_item_type_sql((*order->item)))
{
DBUG_PRINT("info",("spider FALSE by order"));
+ do_direct_update = FALSE;
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
}
result_list.direct_order_limit = TRUE;
}
-
trx->direct_update_count++;
DBUG_PRINT("info",("spider OK"));
DBUG_RETURN(0);
@@ -9331,11 +9576,13 @@ int ha_spider::direct_update_rows_init(
DBUG_PRINT("info",("spider offset_limit=%lld", offset_limit));
DBUG_PRINT("info",("spider mode=%u", mode));
+ DBUG_PRINT("info",("spider sql_command=%u", sql_command));
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
DBUG_PRINT("info",("spider maybe_do_hs_direct_update=%s",
maybe_do_hs_direct_update ? "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider sql_command=%u", sql_command));
DBUG_PRINT("info",("spider hs_pushed_ret_fields_num=%zu",
hs_pushed_ret_fields_num));
+#endif
DBUG_PRINT("info",("spider do_direct_update=%s",
do_direct_update ? "TRUE" : "FALSE"));
if (
@@ -9357,14 +9604,20 @@ int ha_spider::direct_update_rows_init(
if (pk_update && spider_check_hs_pk_update(this, &ranges->start_key))
{
DBUG_PRINT("info",("spider FALSE by pk_update"));
+ do_direct_update = FALSE;
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
+ if ((error_num = spider_check_trx_and_get_conn(thd, this, TRUE)))
+ {
+ DBUG_RETURN(error_num);
+ }
#endif
trx->direct_update_count++;
DBUG_PRINT("info",("spider OK"));
DBUG_RETURN(0);
}
DBUG_PRINT("info",("spider FALSE by default"));
+ do_direct_update = FALSE;
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
@@ -9536,6 +9789,9 @@ int ha_spider::direct_delete_rows_init(
uint range_count,
bool sorted
) {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ int error_num;
+#endif
st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
@@ -9561,6 +9817,14 @@ int ha_spider::direct_delete_rows_init(
mode, ranges, range_count, sorted));
}
#endif
+ direct_update_init(
+ thd,
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ sql_command == SQLCOM_HS_DELETE
+#else
+ FALSE
+#endif
+ );
if (!condition)
cond_check = FALSE;
spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit);
@@ -9578,6 +9842,7 @@ int ha_spider::direct_delete_rows_init(
spider_db_append_condition(this, NULL, 0, TRUE)
) {
DBUG_PRINT("info",("spider FALSE by condition"));
+ do_direct_update = FALSE;
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
if (select_lex->order_list.elements)
@@ -9589,12 +9854,12 @@ int ha_spider::direct_delete_rows_init(
if (check_item_type_sql((*order->item)))
{
DBUG_PRINT("info",("spider FALSE by order"));
+ do_direct_update = FALSE;
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
}
result_list.direct_order_limit = TRUE;
}
-
trx->direct_delete_count++;
DBUG_PRINT("info",("spider OK"));
DBUG_RETURN(0);
@@ -9612,11 +9877,18 @@ int ha_spider::direct_delete_rows_init(
#endif
do_direct_update
) {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ if ((error_num = spider_check_trx_and_get_conn(thd, this, TRUE)))
+ {
+ DBUG_RETURN(error_num);
+ }
+#endif
trx->direct_delete_count++;
DBUG_PRINT("info",("spider OK"));
DBUG_RETURN(0);
}
DBUG_PRINT("info",("spider FALSE by default"));
+ do_direct_update = FALSE;
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
@@ -9722,6 +9994,8 @@ int ha_spider::delete_all_rows()
backup_error_status();
DBUG_ENTER("ha_spider::delete_all_rows");
DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_param_delete_all_rows_type(thd, share->delete_all_rows_type))
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
if (spider_param_read_only_mode(thd, share->read_only_mode))
{
my_printf_error(ER_SPIDER_READ_ONLY_NUM, ER_SPIDER_READ_ONLY_STR, MYF(0),
@@ -10552,10 +10826,14 @@ int ha_spider::info_push(
DBUG_PRINT("info",("spider this=%p", this));
#ifdef HA_CAN_BULK_ACCESS
if (
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ info_type != INFO_KIND_HS_RET_FIELDS &&
+#endif
+#endif
info_type != INFO_KIND_BULK_ACCESS_BEGIN &&
info_type != INFO_KIND_BULK_ACCESS_CURRENT &&
- info_type != INFO_KIND_BULK_ACCESS_END &&
- info_type != INFO_KIND_HS_RET_FIELDS
+ info_type != INFO_KIND_BULK_ACCESS_END
) {
if (!is_bulk_access_clone)
{
@@ -10681,6 +10959,11 @@ int ha_spider::info_push(
case INFO_KIND_UPDATE_FIELDS:
DBUG_PRINT("info",("spider INFO_KIND_UPDATE_FIELDS"));
direct_update_fields = (List<Item> *) info;
+ update_request = TRUE;
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ if (keyread && check_partitioned())
+ keyread = FALSE;
+#endif
break;
case INFO_KIND_UPDATE_VALUES:
DBUG_PRINT("info",("spider INFO_KIND_UPDATE_VALUES"));
@@ -10734,12 +11017,16 @@ int ha_spider::info_push(
) {
DBUG_RETURN(error_num);
}
+#ifdef HA_CAN_BULK_ACCESS
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
memset(
bulk_access_link_current->spider->result_list.hs_r_bulk_open_index, 0,
share->link_bitmap_size);
memset(
bulk_access_link_current->spider->result_list.hs_w_bulk_open_index, 0,
share->link_bitmap_size);
+#endif
+#endif
/*
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if ((error_num = bulk_access_link_current->spider->reset_hs_strs_pos(
@@ -11215,6 +11502,35 @@ void ha_spider::check_direct_order_limit()
DBUG_VOID_RETURN;
}
+int ha_spider::check_ha_range_eof()
+{
+ DBUG_ENTER("ha_spider::check_ha_range_eof");
+ DBUG_PRINT("info",("spider this=%p", this));
+ const key_range *end_key = result_list.end_key;
+ DBUG_PRINT("info",("spider use_both_key=%s",
+ result_list.use_both_key ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider sql_kind[%u]=%u",
+ search_link_idx, sql_kind[search_link_idx]));
+ DBUG_PRINT("info",("spider sql_command=%u", sql_command));
+ if (
+ result_list.use_both_key &&
+ (sql_kind[search_link_idx] & SPIDER_SQL_KIND_HANDLER) &&
+ sql_command != SQLCOM_HA_READ
+ ) {
+ int cmp_result = key_cmp(result_list.key_info->key_part,
+ end_key->key, end_key->length);
+ DBUG_PRINT("info",("spider cmp_result=%d", cmp_result));
+ if (
+ cmp_result > 0 ||
+ (end_key->flag == HA_READ_BEFORE_KEY && !cmp_result)
+ ) {
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
int ha_spider::drop_tmp_tables()
{
int error_num = 0, tmp_error_num, need_mon;
@@ -11993,15 +12309,6 @@ int ha_spider::sync_from_clone_source(
DBUG_PRINT("info",("spider synced from clone source all"));
trx = spider->trx;
sql_command = spider->sql_command;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- do_direct_update = spider->do_direct_update;
-#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- memcpy(do_hs_direct_update, spider->do_hs_direct_update,
- share->link_bitmap_size);
-#endif
-#endif
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
conn_kinds = spider->conn_kinds;
memcpy(conn_kind, spider->conn_kind, sizeof(uint) * share->link_count);
@@ -12016,10 +12323,12 @@ int ha_spider::sync_from_clone_source(
low_priority = spider->low_priority;
memcpy(conns, spider->conns,
sizeof(SPIDER_CONN *) * share->link_count);
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
memcpy(hs_r_conns, spider->hs_r_conns,
sizeof(SPIDER_CONN *) * share->link_count);
memcpy(hs_w_conns, spider->hs_w_conns,
sizeof(SPIDER_CONN *) * share->link_count);
+#endif
spider_thread_id = spider->spider_thread_id;
trx_conn_adjustment = spider->trx_conn_adjustment;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -12042,15 +12351,6 @@ int ha_spider::sync_from_clone_source(
{
DBUG_PRINT("info",("spider synced from clone source"));
sql_command = spider->sql_command;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- do_direct_update = spider->do_direct_update;
-#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- memcpy(do_hs_direct_update, spider->do_hs_direct_update,
- share->link_bitmap_size);
-#endif
-#endif
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
conn_kinds = spider->conn_kinds;
memcpy(conn_kind, spider->conn_kind, sizeof(uint) * share->link_count);
@@ -12072,6 +12372,8 @@ int ha_spider::sync_from_clone_source(
external_lock_cnt = spider->external_lock_cnt;
}
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->hs_pushed_ret_fields_num < MAX_FIELDS)
{
SPIDER_HS_UINT32_INFO tmp_info;
@@ -12082,6 +12384,8 @@ int ha_spider::sync_from_clone_source(
DBUG_RETURN(error_num);
}
}
+#endif
+#endif
DBUG_PRINT("info",("spider bulk_access_link->spider->dbton_handler=%p",
dbton_handler));
DBUG_PRINT("info",("spider ptr bulk_access_link->spider->dbton_handler=%p",
@@ -12531,7 +12835,7 @@ int ha_spider::append_direct_update_set_hs_part()
#endif
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
int ha_spider::append_dup_update_pushdown_sql_part(
const char *alias,
uint alias_length
@@ -13113,6 +13417,32 @@ void ha_spider::set_order_to_pos_sql(
DBUG_VOID_RETURN;
}
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int ha_spider::append_group_by_sql_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ int error_num;
+ uint roop_count, dbton_id;
+ spider_db_handler *dbton_hdl;
+ DBUG_ENTER("ha_spider::append_group_by_sql_part");
+ for (roop_count = 0; roop_count < share->use_sql_dbton_count; roop_count++)
+ {
+ dbton_id = share->use_sql_dbton_ids[roop_count];
+ dbton_hdl = dbton_handler[dbton_id];
+ if (
+ dbton_hdl->first_link_idx >= 0 &&
+ (error_num = dbton_hdl->append_group_by_part(
+ alias, alias_length, sql_type))
+ ) {
+ DBUG_RETURN(error_num);
+ }
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
int ha_spider::append_key_order_for_merge_with_alias_sql_part(
const char *alias,
uint alias_length,
diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h
index 4d1f6067bdc..2eb469c691a 100644
--- a/storage/spider/ha_spider.h
+++ b/storage/spider/ha_spider.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -125,6 +125,7 @@ public:
bool clone_bitmap_init;
ha_spider *pt_clone_source_handler;
ha_spider *pt_clone_last_searcher;
+ bool has_clone_for_merge;
bool init_index_handler;
bool init_rnd_handler;
@@ -165,6 +166,7 @@ public:
bool high_priority;
bool insert_delayed;
bool use_pre_call;
+ bool use_pre_records;
enum thr_lock_type lock_type;
int lock_mode;
uint sql_command;
@@ -173,6 +175,9 @@ public:
#ifdef HANDLER_HAS_NEED_INFO_FOR_AUTO_INC
bool info_auto_called;
#endif
+#ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT
+ bool auto_inc_temporary;
+#endif
int bulk_size;
int direct_dup_insert;
int store_error_num;
@@ -232,6 +237,7 @@ public:
SPIDER_ITEM_HLD *direct_aggregate_item_first;
SPIDER_ITEM_HLD *direct_aggregate_item_current;
#endif
+ ha_rows table_rows;
/* for fulltext search */
bool ft_init_and_first;
@@ -463,6 +469,9 @@ public:
bool use_parallel
);
#ifdef HA_MRR_USE_DEFAULT_IMPL
+ int pre_multi_range_read_next(
+ bool use_parallel
+ );
#else
int pre_read_multi_range_first(
KEY_MULTI_RANGE **found_range_p,
@@ -491,6 +500,7 @@ public:
key_range *end_key
);
int check_crd();
+ int pre_records();
ha_rows records();
const char *table_type() const;
ulonglong table_flags() const;
@@ -511,6 +521,9 @@ public:
#ifdef HANDLER_HAS_NEED_INFO_FOR_AUTO_INC
bool need_info_for_auto_inc();
#endif
+#ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT
+ bool can_use_for_auto_inc_init();
+#endif
int update_auto_increment();
void get_auto_increment(
ulonglong offset,
@@ -542,6 +555,12 @@ public:
uchar *buf
);
#endif
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ void direct_update_init(
+ THD *thd,
+ bool hs_request
+ );
+#endif
bool start_bulk_update();
int exec_bulk_update(
uint *dup_key_found
@@ -721,6 +740,7 @@ public:
);
uint check_partitioned();
void check_direct_order_limit();
+ int check_ha_range_eof();
int drop_tmp_tables();
bool handler_opened(
int link_idx,
@@ -845,7 +865,7 @@ public:
int append_direct_update_set_hs_part();
#endif
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
int append_dup_update_pushdown_sql_part(
const char *alias,
uint alias_length
@@ -944,6 +964,13 @@ public:
void set_order_to_pos_sql(
ulong sql_type
);
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_group_by_sql_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+#endif
int append_key_order_for_merge_with_alias_sql_part(
const char *alias,
uint alias_length,
diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc
index 842726cb1e0..5360946d482 100644
--- a/storage/spider/spd_conn.cc
+++ b/storage/spider/spd_conn.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -233,6 +233,7 @@ void spider_free_conn_from_trx(
) {
/* conn_recycle_mode == 1 */
*conn->conn_key = '0';
+ conn->casual_read_base_conn = NULL;
if (
conn->quick_target &&
spider_db_free_result((ha_spider *) conn->quick_target, FALSE)
@@ -1100,6 +1101,91 @@ int spider_free_conn(
DBUG_RETURN(0);
}
+int spider_check_and_get_casual_read_conn(
+ THD *thd,
+ ha_spider *spider,
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_check_and_get_casual_read_conn");
+ if (spider->result_list.casual_read[link_idx])
+ {
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ if (conn->casual_read_query_id != thd->query_id)
+ {
+ conn->casual_read_query_id = thd->query_id;
+ conn->casual_read_current_id = 2;
+ }
+ if (spider->result_list.casual_read[link_idx] == 1)
+ {
+ spider->result_list.casual_read[link_idx] = conn->casual_read_current_id;
+ ++conn->casual_read_current_id;
+ if (conn->casual_read_current_id > 63)
+ {
+ conn->casual_read_current_id = 2;
+ }
+ }
+ char first_byte_bak = *spider->conn_keys[link_idx];
+ *spider->conn_keys[link_idx] =
+ '0' + spider->result_list.casual_read[link_idx];
+ if (
+ !(spider->conns[link_idx] =
+ spider_get_conn(spider->share, link_idx,
+ spider->conn_keys[link_idx], spider->trx,
+ spider, FALSE, TRUE, SPIDER_CONN_KIND_MYSQL,
+ &error_num))
+ ) {
+ *spider->conn_keys[link_idx] = first_byte_bak;
+ DBUG_RETURN(error_num);
+ }
+ *spider->conn_keys[link_idx] = first_byte_bak;
+ spider->conns[link_idx]->casual_read_base_conn = conn;
+ conn = spider->conns[link_idx];
+ spider_check_and_set_autocommit(thd, conn, NULL);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_check_and_init_casual_read(
+ THD *thd,
+ ha_spider *spider,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ SPIDER_SHARE *share = spider->share;
+ DBUG_ENTER("spider_check_and_init_casual_read");
+ if (
+ spider_param_sync_autocommit(thd) &&
+ (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) &&
+ (
+ result_list->direct_order_limit
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ || result_list->direct_aggregate
+#endif
+ )
+ ) {
+ if (!result_list->casual_read[link_idx])
+ {
+ result_list->casual_read[link_idx] =
+ spider_param_casual_read(thd, share->casual_read);
+ }
+ if ((error_num = spider_check_and_get_casual_read_conn(thd, spider,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ if (
+ conn->casual_read_base_conn &&
+ (error_num = spider_create_conn_thread(conn))
+ ) {
+ DBUG_RETURN(error_num);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
void spider_conn_queue_connect(
SPIDER_SHARE *share,
SPIDER_CONN *conn,
@@ -2096,18 +2182,38 @@ int spider_bg_conn_search(
void spider_bg_conn_simple_action(
SPIDER_CONN *conn,
- uint simple_action
+ uint simple_action,
+ bool caller_wait,
+ void *target,
+ uint link_idx,
+ int *error_num
) {
DBUG_ENTER("spider_bg_conn_simple_action");
pthread_mutex_lock(&conn->bg_conn_mutex);
- conn->bg_caller_wait = TRUE;
+ conn->bg_target = target;
+ conn->link_idx = link_idx;
conn->bg_simple_action = simple_action;
- pthread_mutex_lock(&conn->bg_conn_sync_mutex);
+ conn->bg_error_num = error_num;
+ if (caller_wait)
+ {
+ conn->bg_caller_wait = TRUE;
+ pthread_mutex_lock(&conn->bg_conn_sync_mutex);
+ } else {
+ conn->bg_caller_sync_wait = TRUE;
+ pthread_mutex_lock(&conn->bg_conn_sync_mutex);
+ }
pthread_cond_signal(&conn->bg_conn_cond);
pthread_mutex_unlock(&conn->bg_conn_mutex);
- pthread_cond_wait(&conn->bg_conn_sync_cond, &conn->bg_conn_sync_mutex);
- pthread_mutex_unlock(&conn->bg_conn_sync_mutex);
- conn->bg_caller_wait = FALSE;
+ if (caller_wait)
+ {
+ pthread_cond_wait(&conn->bg_conn_sync_cond, &conn->bg_conn_sync_mutex);
+ pthread_mutex_unlock(&conn->bg_conn_sync_mutex);
+ conn->bg_caller_wait = FALSE;
+ } else {
+ pthread_cond_wait(&conn->bg_conn_sync_cond, &conn->bg_conn_sync_mutex);
+ pthread_mutex_unlock(&conn->bg_conn_sync_mutex);
+ conn->bg_caller_sync_wait = FALSE;
+ }
DBUG_VOID_RETURN;
}
@@ -2450,6 +2556,13 @@ void *spider_bg_conn_action(
case SPIDER_BG_SIMPLE_DISCONNECT:
conn->db_conn->bg_disconnect();
break;
+ case SPIDER_BG_SIMPLE_RECORDS:
+ DBUG_PRINT("info",("spider bg simple records"));
+ spider = (ha_spider*) conn->bg_target;
+ *conn->bg_error_num =
+ spider->dbton_handler[conn->dbton_id]->
+ show_records(conn->link_idx);
+ break;
default:
break;
}
@@ -2761,10 +2874,15 @@ void *spider_bg_sts_action(
if (spider.search_link_idx == -1)
{
spider_trx_set_link_idx_for_all(&spider);
+/*
spider.search_link_idx = spider_conn_next_link_idx(
thd, share->link_statuses, share->access_balances,
spider.conn_link_idx, spider.search_link_idx, share->link_count,
SPIDER_LINK_STATUS_OK);
+*/
+ spider.search_link_idx = spider_conn_first_link_idx(thd,
+ share->link_statuses, share->access_balances, spider.conn_link_idx,
+ share->link_count, SPIDER_LINK_STATUS_OK);
}
if (spider.search_link_idx >= 0)
{
@@ -2780,6 +2898,7 @@ void *spider_bg_sts_action(
&error_num);
conns[spider.search_link_idx]->error_mode = 0;
pthread_mutex_unlock(&spider_global_trx_mutex);
+/*
if (
error_num &&
share->monitoring_kind[spider.search_link_idx] &&
@@ -2802,8 +2921,10 @@ void *spider_bg_sts_action(
);
lex_end(thd->lex);
}
+*/
+ spider.search_link_idx = -1;
}
- if (conns[spider.search_link_idx])
+ if (spider.search_link_idx != -1 && conns[spider.search_link_idx])
{
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (spider_get_sts(share, spider.search_link_idx,
@@ -2818,6 +2939,7 @@ void *spider_bg_sts_action(
2, HA_STATUS_CONST | HA_STATUS_VARIABLE))
#endif
{
+/*
if (
share->monitoring_kind[spider.search_link_idx] &&
need_mons[spider.search_link_idx]
@@ -2839,6 +2961,7 @@ void *spider_bg_sts_action(
);
lex_end(thd->lex);
}
+*/
spider.search_link_idx = -1;
}
}
@@ -3143,10 +3266,15 @@ void *spider_bg_crd_action(
if (spider.search_link_idx == -1)
{
spider_trx_set_link_idx_for_all(&spider);
+/*
spider.search_link_idx = spider_conn_next_link_idx(
thd, share->link_statuses, share->access_balances,
spider.conn_link_idx, spider.search_link_idx, share->link_count,
SPIDER_LINK_STATUS_OK);
+*/
+ spider.search_link_idx = spider_conn_first_link_idx(thd,
+ share->link_statuses, share->access_balances, spider.conn_link_idx,
+ share->link_count, SPIDER_LINK_STATUS_OK);
}
if (spider.search_link_idx >= 0)
{
@@ -3162,6 +3290,7 @@ void *spider_bg_crd_action(
&error_num);
conns[spider.search_link_idx]->error_mode = 0;
pthread_mutex_unlock(&spider_global_trx_mutex);
+/*
if (
error_num &&
share->monitoring_kind[spider.search_link_idx] &&
@@ -3184,8 +3313,10 @@ void *spider_bg_crd_action(
);
lex_end(thd->lex);
}
+*/
+ spider.search_link_idx = -1;
}
- if (conns[spider.search_link_idx])
+ if (spider.search_link_idx != -1 && conns[spider.search_link_idx])
{
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (spider_get_crd(share, spider.search_link_idx,
@@ -3200,6 +3331,7 @@ void *spider_bg_crd_action(
2))
#endif
{
+/*
if (
share->monitoring_kind[spider.search_link_idx] &&
need_mons[spider.search_link_idx]
@@ -3221,6 +3353,7 @@ void *spider_bg_crd_action(
);
lex_end(thd->lex);
}
+*/
spider.search_link_idx = -1;
}
}
@@ -3718,28 +3851,35 @@ bool spider_conn_use_handler(
#endif
DBUG_RETURN(TRUE);
}
+#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
if (spider->do_direct_update)
{
spider->sql_kinds |= SPIDER_SQL_KIND_SQL;
spider->sql_kind[link_idx] = SPIDER_SQL_KIND_SQL;
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider_bit_is_set(spider->do_hs_direct_update, link_idx))
{
spider->direct_update_kinds |= SPIDER_SQL_KIND_HS;
DBUG_PRINT("info",("spider TRUE by using HS direct_update"));
DBUG_RETURN(TRUE);
- } else
+ } else {
+#endif
spider->direct_update_kinds |= SPIDER_SQL_KIND_SQL;
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ }
if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
{
+#endif
DBUG_PRINT("info",("spider FALSE by using direct_update"));
DBUG_RETURN(FALSE);
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
DBUG_PRINT("info",("spider TRUE by using BOTH"));
DBUG_RETURN(TRUE);
}
- }
#endif
+ }
#endif
if (spider->use_spatial_index)
{
diff --git a/storage/spider/spd_conn.h b/storage/spider/spd_conn.h
index 9dc8f3495fd..99a6f1a48e8 100644
--- a/storage/spider/spd_conn.h
+++ b/storage/spider/spd_conn.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -20,6 +20,7 @@
#define SPIDER_BG_SIMPLE_NO_ACTION 0
#define SPIDER_BG_SIMPLE_CONNECT 1
#define SPIDER_BG_SIMPLE_DISCONNECT 2
+#define SPIDER_BG_SIMPLE_RECORDS 3
uchar *spider_conn_get_key(
SPIDER_CONN *conn,
@@ -69,6 +70,18 @@ int spider_free_conn(
SPIDER_CONN *conn
);
+int spider_check_and_get_casual_read_conn(
+ THD *thd,
+ ha_spider *spider,
+ int link_idx
+);
+
+int spider_check_and_init_casual_read(
+ THD *thd,
+ ha_spider *spider,
+ int link_idx
+);
+
void spider_conn_queue_connect(
SPIDER_SHARE *share,
SPIDER_CONN *conn,
@@ -220,7 +233,11 @@ int spider_bg_conn_search(
void spider_bg_conn_simple_action(
SPIDER_CONN *conn,
- uint simple_action
+ uint simple_action,
+ bool caller_wait,
+ void *target,
+ uint link_idx,
+ int *error_num
);
void *spider_bg_conn_action(
diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc
index 7c7d3836a00..10fed696134 100644
--- a/storage/spider/spd_copy_tables.cc
+++ b/storage/spider/spd_copy_tables.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2013 Kentoku Shiba
+/* Copyright (C) 2009-2014 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
@@ -719,7 +719,7 @@ int spider_udf_copy_tables_create_table_list(
&copy_tables->link_idxs[1],
sizeof(int) * copy_tables->link_idx_count[1],
&tmp_name_ptr, sizeof(char) * (
- spider_table_name_length * 2 + copy_tables->database_length + 2
+ spider_table_name_length * 2 + copy_tables->database_length + 3
),
NullS))
) {
@@ -849,6 +849,7 @@ long long spider_copy_tables_body(
MEM_ROOT mem_root;
longlong bulk_insert_rows;
Reprepare_observer *reprepare_observer_backup;
+ uint tmp_conn_link_idx = 0;
DBUG_ENTER("spider_copy_tables_body");
if (
thd->open_tables != 0 ||
@@ -989,6 +990,7 @@ long long spider_copy_tables_body(
table_list->table_name_length));
reprepare_observer_backup = thd->m_reprepare_observer;
thd->m_reprepare_observer = NULL;
+ copy_tables->trx->trx_start = TRUE;
#if MYSQL_VERSION_ID < 50500
if (open_and_lock_tables(thd, table_list))
#else
@@ -1003,12 +1005,14 @@ long long spider_copy_tables_body(
#endif
{
thd->m_reprepare_observer = reprepare_observer_backup;
+ copy_tables->trx->trx_start = FALSE;
my_printf_error(ER_SPIDER_UDF_CANT_OPEN_TABLE_NUM,
ER_SPIDER_UDF_CANT_OPEN_TABLE_STR, MYF(0), table_list->db,
table_list->table_name);
goto error;
}
thd->m_reprepare_observer = reprepare_observer_backup;
+ copy_tables->trx->trx_start = FALSE;
table = table_list->table;
table_share = table->s;
@@ -1093,6 +1097,7 @@ long long spider_copy_tables_body(
for (roop_count = 0; roop_count < all_link_cnt; roop_count++)
{
spider[roop_count].conns = NULL;
+ spider[roop_count].change_table_ptr(table, table_share);
}
for (roop_count = 0, table_conn = copy_tables->table_conn[0];
table_conn; roop_count++, table_conn = table_conn->next)
@@ -1123,6 +1128,7 @@ long long spider_copy_tables_body(
tmp_spider->result_list.sqls = &tmp_sql[roop_count];
tmp_spider->need_mons = &table_conn->need_mon;
tmp_spider->lock_type = TL_READ;
+ tmp_spider->conn_link_idx = &tmp_conn_link_idx;
uint dbton_id = tmp_spider->share->use_dbton_ids[0];
if (!(tmp_spider->dbton_handler[dbton_id] =
spider_dbton[dbton_id].create_db_handler(tmp_spider,
@@ -1166,6 +1172,7 @@ long long spider_copy_tables_body(
tmp_spider->result_list.sqls = &tmp_sql[roop_count];
tmp_spider->need_mons = &table_conn->need_mon;
tmp_spider->lock_type = TL_WRITE;
+ tmp_spider->conn_link_idx = &tmp_conn_link_idx;
uint dbton_id = tmp_spider->share->use_dbton_ids[0];
if (!(tmp_spider->dbton_handler[dbton_id] =
spider_dbton[dbton_id].create_db_handler(tmp_spider,
@@ -1293,7 +1300,9 @@ error:
delete [] tmp_sql;
}
if (copy_tables)
+ {
spider_udf_free_copy_tables_alloc(copy_tables);
+ }
*error = 1;
DBUG_RETURN(0);
}
@@ -1338,6 +1347,6 @@ void spider_copy_tables_deinit_body(
!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN) &&
(trx = spider_get_trx(thd, TRUE, &error_num))
)
- spider_free_trx_conn(trx, FALSE);
+ spider_copy_table_free_trx_conn(trx);
DBUG_VOID_RETURN;
}
diff --git a/storage/spider/spd_copy_tables.h b/storage/spider/spd_copy_tables.h
index 88612d1dd12..bda7a051bc6 100644
--- a/storage/spider/spd_copy_tables.h
+++ b/storage/spider/spd_copy_tables.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010-2013 Kentoku Shiba
+/* Copyright (C) 2010-2014 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
diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc
index 459b450aacd..0e0c8f01b02 100644
--- a/storage/spider/spd_db_conn.cc
+++ b/storage/spider/spd_db_conn.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -1205,7 +1205,7 @@ void spider_db_append_xid_str(
DBUG_ENTER("spider_db_append_xid_str");
format_id_length =
- my_sprintf(format_id, (format_id, "0x%lx", xid->formatID));
+ my_sprintf(format_id, (format_id, "%lu", xid->formatID));
spider_db_append_hex_string(tmp_str, (uchar *) xid->data, xid->gtrid_length);
/*
tmp_str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
@@ -1595,9 +1595,10 @@ int spider_db_append_key_where_internal(
start_key_part_map = 0;
use_both = FALSE;
}
- if (end_key)
+ if (end_key) {
end_key_part_map = end_key->keypart_map & full_key_part_map;
- else {
+ result_list->end_key = end_key;
+ } else {
end_key_part_map = 0;
use_both = FALSE;
}
@@ -1657,6 +1658,8 @@ int spider_db_append_key_where_internal(
tgt_key_part_map = end_key_part_map;
}
DBUG_PRINT("info", ("spider tgt_key_part_map=%lu", tgt_key_part_map));
+ if (start_key_part_map == end_key_part_map)
+ result_list->use_both_key = TRUE;
if (sql_kind == SPIDER_SQL_KIND_SQL)
{
@@ -1707,6 +1710,7 @@ int spider_db_append_key_where_internal(
#endif
}
} else {
+ DBUG_PRINT("info", ("spider tgt_key_part_map=%lu", tgt_key_part_map));
if (tgt_key_part_map > 1)
key_eq = TRUE;
else
@@ -1716,10 +1720,11 @@ int spider_db_append_key_where_internal(
(key_eq && use_key == start_key) ||
(!key_eq && start_key_part_map)
) {
+ bool tgt_final = (use_key == start_key && tgt_key_part_map == 1);
ptr = start_key->key + length;
if (
(error_num = dbton_hdl->append_is_null_part(sql_type, key_part,
- start_key, &ptr, key_eq))
+ start_key, &ptr, key_eq, tgt_final))
) {
if (error_num > 0)
DBUG_RETURN(error_num);
@@ -1759,10 +1764,13 @@ int spider_db_append_key_where_internal(
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (spider_dbton[dbton_id].db_util->
- append_column_value(spider, str_part, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (use_key == start_key)
+ {
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
@@ -1807,13 +1815,19 @@ int spider_db_append_key_where_internal(
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->
- append_column_value(spider, str_part, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (use_key == start_key)
+ {
+ if (tgt_key_part_map == 1)
+ {
+ if (str->reserve(SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ }
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
@@ -1860,13 +1874,19 @@ int spider_db_append_key_where_internal(
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_GT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
- if (spider_dbton[dbton_id].db_util->
- append_column_value(spider, str_part, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (use_key == start_key)
+ {
+ if (tgt_key_part_map == 1)
+ {
+ if (str->reserve(SPIDER_SQL_GT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
+ }
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
@@ -1914,13 +1934,19 @@ int spider_db_append_key_where_internal(
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_LT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
- if (spider_dbton[dbton_id].db_util->
- append_column_value(spider, str_part, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (use_key == start_key)
+ {
+ if (tgt_key_part_map == 1)
+ {
+ if (str->reserve(SPIDER_SQL_LT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
+ }
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
@@ -1974,13 +2000,20 @@ int spider_db_append_key_where_internal(
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->
- append_column_value(spider, str_part, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (use_key == start_key)
+ {
+ if (tgt_key_part_map == 1)
+ {
+ if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LTEQUAL_STR,
+ SPIDER_SQL_LTEQUAL_LEN);
+ }
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
@@ -2116,13 +2149,20 @@ int spider_db_append_key_where_internal(
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_GTEQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->
- append_column_value(spider, str_part, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (use_key == start_key)
+ {
+ if (tgt_key_part_map == 1)
+ {
+ if (str->reserve(SPIDER_SQL_GTEQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_GTEQUAL_STR,
+ SPIDER_SQL_GTEQUAL_LEN);
+ }
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
else {
@@ -2152,9 +2192,12 @@ int spider_db_append_key_where_internal(
str_part2->q_append(SPIDER_SQL_AND_STR,
SPIDER_SQL_AND_LEN);
- if (str_part->reserve(SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str_part->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if (use_key == start_key)
+ {
+ if (str_part->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str_part->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
}
}
@@ -2166,9 +2209,10 @@ int spider_db_append_key_where_internal(
(key_eq && use_key == end_key) ||
(!key_eq && end_key_part_map)
) {
+ bool tgt_final = (use_key == end_key && tgt_key_part_map == 1);
ptr = end_key->key + length;
if ((error_num = dbton_hdl->append_is_null_part(sql_type, key_part,
- end_key, &ptr, key_eq)))
+ end_key, &ptr, key_eq, tgt_final)))
{
if (error_num > 0)
DBUG_RETURN(error_num);
@@ -2207,13 +2251,21 @@ int spider_db_append_key_where_internal(
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->
- append_column_value(spider, str_part, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (use_key == end_key)
+ {
+/*
+ if (tgt_key_part_map == 1)
+ {
+ if (str->reserve(SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ }
+*/
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
}
} else {
DBUG_PRINT("info", ("spider end_key->flag=%d", end_key->flag));
@@ -2251,13 +2303,19 @@ int spider_db_append_key_where_internal(
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_LT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
- if (spider_dbton[dbton_id].db_util->
- append_column_value(spider, str_part, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (use_key == end_key)
+ {
+ if (tgt_key_part_map == 1)
+ {
+ if (str->reserve(SPIDER_SQL_LT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
+ }
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
}
break;
default:
@@ -2291,13 +2349,20 @@ int spider_db_append_key_where_internal(
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->
- append_column_value(spider, str_part, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (use_key == end_key)
+ {
+ if (tgt_key_part_map == 1)
+ {
+ if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LTEQUAL_STR,
+ SPIDER_SQL_LTEQUAL_LEN);
+ }
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
}
break;
}
@@ -2314,9 +2379,12 @@ int spider_db_append_key_where_internal(
str_part2->q_append(SPIDER_SQL_AND_STR,
SPIDER_SQL_AND_LEN);
- if (str_part->reserve(SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str_part->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if (use_key == end_key)
+ {
+ if (str_part->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str_part->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
}
}
if (use_both && (!start_key_part_map || !end_key_part_map))
@@ -2745,6 +2813,13 @@ int spider_db_fetch_table(
{
if (!row->is_null())
spider->multi_range_hit_point = row->val_int();
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ else if (result_list->direct_aggregate)
+ {
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+#endif
else
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
@@ -2926,6 +3001,13 @@ int spider_db_fetch_key(
DBUG_PRINT("info", ("spider mrr_with_cnt"));
if (!row->is_null())
spider->multi_range_hit_point = row->val_int();
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ else if (result_list->direct_aggregate)
+ {
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+#endif
else
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
@@ -3026,6 +3108,13 @@ int spider_db_fetch_minimum_columns(
DBUG_PRINT("info", ("spider mrr_with_cnt"));
if (!row->is_null())
spider->multi_range_hit_point = row->val_int();
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ else if (result_list->direct_aggregate)
+ {
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+#endif
else
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
row->next();
@@ -3555,33 +3644,33 @@ int spider_db_store_result(
}
DBUG_RETURN(error_num);
}
- if (
- error_num != HA_ERR_END_OF_FILE &&
- (error_num = spider_db_errorno(conn))
- )
- DBUG_RETURN(error_num);
- else {
- DBUG_PRINT("info",("spider set finish_flg point 1"));
- DBUG_PRINT("info",("spider current->finish_flg = TRUE"));
- DBUG_PRINT("info",("spider result_list->finish_flg = TRUE"));
- current->finish_flg = TRUE;
- result_list->finish_flg = TRUE;
+ bool call_db_errorno = FALSE;
+ if (error_num != HA_ERR_END_OF_FILE)
+ {
+ call_db_errorno = TRUE;
+ if ((error_num = spider_db_errorno(conn)))
+ DBUG_RETURN(error_num);
+ }
+ DBUG_PRINT("info",("spider set finish_flg point 1"));
+ DBUG_PRINT("info",("spider current->finish_flg = TRUE"));
+ DBUG_PRINT("info",("spider result_list->finish_flg = TRUE"));
+ current->finish_flg = TRUE;
+ result_list->finish_flg = TRUE;
#ifndef WITHOUT_SPIDER_BG_SEARCH
- if (result_list->bgs_phase <= 1)
- {
+ if (result_list->bgs_phase <= 1)
+ {
#endif
- result_list->current_row_num = 0;
- table->status = STATUS_NOT_FOUND;
+ result_list->current_row_num = 0;
+ table->status = STATUS_NOT_FOUND;
#ifndef WITHOUT_SPIDER_BG_SEARCH
- }
+ }
#endif
- if (!conn->mta_conn_mutex_unlock_later)
- {
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- DBUG_RETURN(HA_ERR_END_OF_FILE);
+ if (!conn->mta_conn_mutex_unlock_later && !call_db_errorno)
+ {
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
}
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
} else {
if (!conn->mta_conn_mutex_unlock_later)
{
@@ -3594,14 +3683,14 @@ int spider_db_store_result(
current->record_num));
DBUG_PRINT("info",("spider result_list->record_num=%lld",
result_list->record_num));
+ DBUG_PRINT("info",("spider result_list->internal_limit=%lld",
+ result_list->internal_limit));
+ DBUG_PRINT("info",("spider result_list->split_read=%lld",
+ result_list->split_read));
if (
result_list->internal_limit <= result_list->record_num ||
result_list->split_read > current->record_num
) {
- DBUG_PRINT("info",("spider result_list->internal_limit=%lld",
- result_list->internal_limit));
- DBUG_PRINT("info",("spider result_list->split_read=%lld",
- result_list->split_read));
DBUG_PRINT("info",("spider set finish_flg point 2"));
DBUG_PRINT("info",("spider current->finish_flg = TRUE"));
DBUG_PRINT("info",("spider result_list->finish_flg = TRUE"));
@@ -4785,7 +4874,7 @@ int spider_db_seek_tmp(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
pos->row->first();
}
- if (spider->sql_kind[spider->result_link_idx] == SPIDER_SQL_KIND_SQL)
+ if (pos->sql_kind == SPIDER_SQL_KIND_SQL)
{
if (!spider->select_column_mode)
{
@@ -5087,14 +5176,55 @@ int spider_db_show_table_status(
int spider_db_show_records(
ha_spider *spider,
- int link_idx
+ int link_idx,
+ bool pre_call
) {
int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
+ THD *thd = spider->trx->thd;
+ SPIDER_CONN *conn;
DBUG_ENTER("spider_db_show_records");
- error_num = spider->dbton_handler[conn->dbton_id]->show_records(
- link_idx
- );
+ if (pre_call)
+ {
+ if (spider_param_bgs_mode(thd, spider->share->bgs_mode))
+ {
+ if ((error_num = spider_check_and_get_casual_read_conn(thd, spider,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ conn = spider->conns[link_idx];
+ if (!(error_num = spider_create_conn_thread(conn)))
+ {
+ spider_bg_conn_simple_action(conn, SPIDER_BG_SIMPLE_RECORDS, FALSE,
+ spider, link_idx, (int *) &spider->result_list.bgs_error);
+ }
+ } else {
+ conn = spider->conns[link_idx];
+ error_num = spider->dbton_handler[conn->dbton_id]->show_records(
+ link_idx
+ );
+ }
+ } else {
+ conn = spider->conns[link_idx];
+ if (spider->use_pre_records)
+ {
+ if (spider_param_bgs_mode(thd, spider->share->bgs_mode))
+ {
+ spider_bg_conn_wait(conn);
+ error_num = spider->result_list.bgs_error;
+ if (conn->casual_read_base_conn)
+ {
+ spider->conns[link_idx] = conn->casual_read_base_conn;
+ }
+ } else {
+ error_num = 0;
+ }
+ } else {
+ error_num = spider->dbton_handler[conn->dbton_id]->show_records(
+ link_idx
+ );
+ }
+ }
DBUG_RETURN(error_num);
}
@@ -5584,7 +5714,6 @@ int spider_db_bulk_bulk_insert(
) {
int error_num = 0, first_insert_link_idx = -1, tmp_error_num;
int roop_count2;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_SHARE *share = spider->share;
SPIDER_CONN *conn, *first_insert_conn = NULL;
TABLE *table = spider->get_table();
@@ -5624,6 +5753,7 @@ int spider_db_bulk_bulk_insert(
if (conn->conn_kind != SPIDER_CONN_KIND_MYSQL)
{
uint roop_count;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider result_list->hs_upd_rows=%llu",
result_list->hs_upd_rows));
@@ -6283,12 +6413,14 @@ int spider_db_direct_update(
) {
DBUG_RETURN(error_num);
}
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (
(spider->direct_update_kinds & SPIDER_SQL_KIND_HS) &&
(error_num = spider->append_direct_update_set_hs_part())
) {
DBUG_RETURN(error_num);
}
+#endif
}
#endif
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -6323,6 +6455,7 @@ int spider_db_direct_update(
DBUG_RETURN(error_num);
}
}
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
{
if (
@@ -6337,6 +6470,7 @@ int spider_db_direct_update(
DBUG_RETURN(error_num);
}
}
+#endif
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
@@ -6455,9 +6589,9 @@ int spider_db_direct_update(
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
{
+#endif
if (!counted)
{
-#endif
*update_rows = spider->conns[roop_count]->db_conn->affected_rows();
DBUG_PRINT("info", ("spider update_rows = %u", *update_rows));
counted = TRUE;
@@ -6559,9 +6693,9 @@ int spider_db_bulk_direct_update(
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
{
+#endif
if (!counted)
{
-#endif
*update_rows = spider->conns[roop_count]->db_conn->affected_rows();
DBUG_PRINT("info", ("spider update_rows = %u", *update_rows));
counted = TRUE;
@@ -6747,6 +6881,7 @@ int spider_db_direct_delete(
DBUG_RETURN(error_num);
}
}
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
{
if (
@@ -6761,6 +6896,7 @@ int spider_db_direct_delete(
DBUG_RETURN(error_num);
}
}
+#endif
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
@@ -6926,6 +7062,7 @@ int spider_db_direct_delete(
if ((error_num = spider->reset_sql_sql(SPIDER_SQL_TYPE_DELETE_SQL)))
error_num2 = error_num;
}
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
{
if ((error_num = spider->reset_hs_sql(SPIDER_SQL_TYPE_DELETE_HS)))
@@ -6933,6 +7070,7 @@ int spider_db_direct_delete(
if ((error_num = spider->reset_hs_keys(SPIDER_SQL_TYPE_DELETE_HS)))
error_num2 = error_num;
}
+#endif
DBUG_RETURN(error_num2);
}
#endif
@@ -7932,10 +8070,27 @@ int spider_db_open_item_int(
{
char tmp_buf[MAX_FIELD_WIDTH];
spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
+ String *tmp_str2;
tmp_str.init_calc_mem(127);
- if (str->append(*item->val_str(tmp_str.get_str())))
+ if (!(tmp_str2 = item->val_str(tmp_str.get_str())))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
tmp_str.mem_calc();
+#ifdef SPIDER_ITEM_HAS_CMP_TYPE
+ DBUG_PRINT("info",("spider cmp_type=%u", item->cmp_type()));
+ if (item->cmp_type() == TIME_RESULT)
+ {
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + tmp_str2->length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->append(*tmp_str2);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ } else {
+#endif
+ if (str->append(*tmp_str2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+#ifdef SPIDER_ITEM_HAS_CMP_TYPE
+ }
+#endif
}
DBUG_RETURN(0);
}
@@ -7951,6 +8106,7 @@ int spider_db_open_item_cache(
DBUG_ENTER("spider_db_open_item_cache");
if (!item_cache->const_item())
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ DBUG_PRINT("info",("spider result_type=%u", item_cache->result_type()));
switch (item_cache->result_type())
{
case STRING_RESULT:
@@ -8534,8 +8690,10 @@ int spider_db_udf_direct_sql(
}
#if MYSQL_VERSION_ID < 50500
#else
- if (table->pos_in_table_list)
- {
+ if (
+ table->s->tmp_table == NO_TMP_TABLE &&
+ table->pos_in_table_list
+ ) {
TABLE_LIST *next_tables =
table->pos_in_table_list->next_global;
while (next_tables && next_tables->parent_l)
@@ -8622,8 +8780,10 @@ int spider_db_udf_direct_sql(
table->file->ha_external_lock(table->in_use, F_UNLCK);
#if MYSQL_VERSION_ID < 50500
#else
- if (table->pos_in_table_list)
- {
+ if (
+ table->s->tmp_table == NO_TMP_TABLE &&
+ table->pos_in_table_list
+ ) {
TABLE_LIST *next_tables =
table->pos_in_table_list->next_global;
while (next_tables && next_tables->parent_l)
@@ -8865,16 +9025,19 @@ int spider_db_udf_ping_table(
bool use_where,
longlong limit
) {
- int error_num, need_mon = 0;
- uint tmp_conn_link_idx = 0;
- ha_spider spider;
+ int error_num;
DBUG_ENTER("spider_db_udf_ping_table");
if (!pthread_mutex_trylock(&table_mon_list->monitor_mutex))
{
+ int need_mon = 0;
+ uint tmp_conn_link_idx = 0;
+ ha_spider spider;
+ uchar db_request_phase = 0;
spider.share = share;
spider.trx = trx;
spider.need_mons = &need_mon;
spider.conn_link_idx = &tmp_conn_link_idx;
+ spider.db_request_phase = &db_request_phase;
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
conn->need_mon = &need_mon;
@@ -9279,6 +9442,8 @@ int spider_db_udf_copy_tables(
{
tmp_spider = &spider[roop_count];
tmp_conn = tmp_spider->conns[0];
+ /* disable transaction */
+ spider_conn_clear_queue_at_commit(tmp_conn);
if (!tmp_conn->trx_start)
{
if (spider_db_ping(tmp_spider, tmp_conn, 0))
@@ -9301,6 +9466,8 @@ int spider_db_udf_copy_tables(
{
tmp_spider = &spider[roop_count];
tmp_conn = tmp_spider->conns[0];
+ /* disable transaction */
+ spider_conn_clear_queue_at_commit(tmp_conn);
spider_db_handler *tmp_dbton_hdl =
tmp_spider->dbton_handler[tmp_conn->dbton_id];
if ((error_num = tmp_dbton_hdl->insert_lock_tables_list(tmp_conn, 0)))
@@ -9916,7 +10083,9 @@ int spider_db_bulk_open_handler(
int link_idx
) {
int error_num = 0;
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
bool opening_index = FALSE;
+#endif
DBUG_ENTER("spider_db_bulk_open_handler");
DBUG_PRINT("info",("spider spider=%p", spider));
DBUG_PRINT("info",("spider conn=%p", conn));
diff --git a/storage/spider/spd_db_conn.h b/storage/spider/spd_db_conn.h
index 3a5cc1b6181..9b37202adab 100644
--- a/storage/spider/spd_db_conn.h
+++ b/storage/spider/spd_db_conn.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -639,7 +639,8 @@ int spider_db_show_table_status(
int spider_db_show_records(
ha_spider *spider,
- int link_idx
+ int link_idx,
+ bool pre_call
);
void spider_db_set_cardinarity(
diff --git a/storage/spider/spd_db_handlersocket.cc b/storage/spider/spd_db_handlersocket.cc
index 8d5c52d6bf2..bf2a0bae419 100644
--- a/storage/spider/spd_db_handlersocket.cc
+++ b/storage/spider/spd_db_handlersocket.cc
@@ -1,5553 +1,5625 @@
-/* Copyright (C) 2012-2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-#define MYSQL_SERVER 1
-#include "mysql_version.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 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));
-}
-
-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_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), 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 row_size, i;
- DBUG_ENTER("spider_db_handlersocket_row::clone");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(clone_row = new spider_db_handlersocket_row()))
- {
- DBUG_RETURN(NULL);
- }
- row_size = 0;
- for (i = 0; i < field_count; i++)
- {
- row_size += hs_row_first[i].size();
- }
- 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;;
- 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]));
-}
-
-
-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_result(spider_dbton_handlersocket.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;
- 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;
- 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++;
- }
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-int spider_db_handlersocket_result::fetch_table_status(
- int mode,
- ha_rows &records,
- ulong &mean_rec_length,
- ulonglong &data_file_length,
- ulonglong &max_data_file_length,
- ulonglong &index_file_length,
- ulonglong &auto_increment_value,
- time_t &create_time,
- time_t &update_time,
- time_t &check_time
-) {
- 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);
-}
-#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())
- {
- if (!connect_retry_count)
- {
- 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()))
- {
- *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()))
- {
- *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));
-}
-
-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_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::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);
-}
-
-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_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
-) {
- 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,
- *separete_str = SPIDER_SQL_NULL_CHAR_STR,
- *last_str = SPIDER_SQL_NULL_CHAR_STR;
- int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
- separete_str_length = SPIDER_SQL_NULL_CHAR_LEN,
- last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
- int use_pushdown_udf;
- 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) &&
- !item_func->arg_count
- ) {
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
- } 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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, spider, str,
- alias, alias_length, dbton_id));
- } 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, spider, str,
- alias, alias_length, dbton_id));
- } 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 &&
- !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 (func_name_length == 12)
- {
- if (!strncasecmp("cast_as_date", func_name, func_name_length))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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 &&
- !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, spider, str,
- alias, alias_length, dbton_id));
- } else if (func_name_length == 14)
- {
- if (!strncasecmp("cast_as_binary", func_name, func_name_length))
- {
- 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 (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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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))
- {
- 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 (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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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, spider, str,
- alias, alias_length, dbton_id));
- case Item_func::CHAR_TYPECAST_FUNC:
- {
- 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 (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:
- 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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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;
- separete_str = SPIDER_SQL_AND_STR;
- separete_str_length = SPIDER_SQL_AND_LEN;
- } else {
- func_name = (char*) item_func->func_name();
- func_name_length = strlen(func_name);
- separete_str = SPIDER_SQL_AND_STR;
- separete_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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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));
- 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, spider, str,
- alias, alias_length, dbton_id));
- else
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
- 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);
- }
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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(SPIDER_SQL_MBR_LEN + func_name_length +
- SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN);
- 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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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 separete_str = %s", separete_str));
- DBUG_PRINT("info",("spider separete_str_length = %d", separete_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, spider, str,
- alias, alias_length, dbton_id)))
- DBUG_RETURN(error_num);
- if (roop_count == 1)
- {
- func_name = separete_str;
- func_name_length = separete_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, spider, str,
- alias, alias_length, dbton_id)))
- 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, spider, str,
- alias, alias_length, dbton_id)))
- 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->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 (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
-) {
- 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, spider, str,
- alias, alias_length, dbton_id)))
- 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, spider, str,
- alias, alias_length, dbton_id)))
- 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));
- append_escaped(to->get_str(), from);
- to->mem_calc();
- DBUG_RETURN(0);
-}
-
-spider_handlersocket_share::spider_handlersocket_share(
- st_spider_share *share
-) : spider_db_share(
- share
-),
- 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()) ||
- (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,
- (char *) (*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;
- 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,
- 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_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");
- for (field = table->field; *field; field++)
- {
- if (minimum_select_bit_is_set((*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
-) {
- 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);
- 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
-) {
- 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;
-}
-
-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->s->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);
-}
-
-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);
-}
-
-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;
- SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_handlersocket_show_table_status");
- res.fetch_table_status(
- sts_mode,
- share->records,
- share->mean_rec_length,
- share->data_file_length,
- share->max_data_file_length,
- share->index_file_length,
- share->auto_increment_value,
- share->create_time,
- share->update_time,
- share->check_time
- );
- 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);
-}
-
-bool spider_handlersocket_handler::minimum_select_bit_is_set(
- uint field_index
-) {
- TABLE *table = spider->get_table();
- DBUG_ENTER("spider_handlersocket_handler::minimum_select_bit_is_set");
- DBUG_RETURN(
- 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)
- );
-}
-
-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] =
- spider->searched_bitmap[roop_count] |
- ((uchar *) table->read_set->bitmap)[roop_count] |
- ((uchar *) table->write_set->bitmap)[roop_count];
- DBUG_PRINT("info",("spider roop_count=%d", roop_count));
- DBUG_PRINT("info",("spider bitmap=%d",
- bitmap[roop_count]));
- DBUG_PRINT("info",("spider searched_bitmap=%d",
- spider->searched_bitmap[roop_count]));
- DBUG_PRINT("info",("spider read_set=%d",
- ((uchar *) table->read_set->bitmap)[roop_count]));
- DBUG_PRINT("info",("spider write_set=%d",
- ((uchar *) table->write_set->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);
-}
-#endif
+/* Copyright (C) 2012-2014 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#define MYSQL_SERVER 1
+#include "mysql_version.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 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));
+}
+
+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_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), 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 row_size, i;
+ DBUG_ENTER("spider_db_handlersocket_row::clone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(clone_row = new spider_db_handlersocket_row()))
+ {
+ DBUG_RETURN(NULL);
+ }
+ row_size = 0;
+ for (i = 0; i < field_count; i++)
+ {
+ row_size += hs_row_first[i].size();
+ }
+ 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;;
+ 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]));
+}
+
+
+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_result(spider_dbton_handlersocket.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;
+ 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;
+ 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++;
+ }
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+int spider_db_handlersocket_result::fetch_table_status(
+ int mode,
+ ha_rows &records,
+ ulong &mean_rec_length,
+ ulonglong &data_file_length,
+ ulonglong &max_data_file_length,
+ ulonglong &index_file_length,
+ ulonglong &auto_increment_value,
+ time_t &create_time,
+ time_t &update_time,
+ time_t &check_time
+) {
+ 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);
+}
+#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())
+ {
+ if (!connect_retry_count)
+ {
+ 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()))
+ {
+ *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()))
+ {
+ *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));
+}
+
+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_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::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);
+}
+
+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_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
+) {
+ 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,
+ *separete_str = SPIDER_SQL_NULL_CHAR_STR,
+ *last_str = SPIDER_SQL_NULL_CHAR_STR;
+ int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
+ separete_str_length = SPIDER_SQL_NULL_CHAR_LEN,
+ last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
+ int use_pushdown_udf;
+ 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) &&
+ !item_func->arg_count
+ ) {
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
+ alias, alias_length, dbton_id));
+ } 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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, spider, str,
+ alias, alias_length, dbton_id));
+ } 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, spider, str,
+ alias, alias_length, dbton_id));
+ } 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 &&
+ !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 (func_name_length == 12)
+ {
+ if (!strncasecmp("cast_as_date", func_name, func_name_length))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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 &&
+ !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, spider, str,
+ alias, alias_length, dbton_id));
+ } else if (func_name_length == 14)
+ {
+ if (!strncasecmp("cast_as_binary", func_name, func_name_length))
+ {
+ 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 (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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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))
+ {
+ 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 (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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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, spider, str,
+ alias, alias_length, dbton_id));
+ case Item_func::CHAR_TYPECAST_FUNC:
+ {
+ 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 (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:
+ 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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_AND_STR;
+ separete_str_length = SPIDER_SQL_AND_LEN;
+ } else {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ separete_str = SPIDER_SQL_AND_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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));
+ 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, spider, str,
+ alias, alias_length, dbton_id));
+ else
+ DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
+ alias, alias_length, dbton_id));
+ 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);
+ }
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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 separete_str = %s", separete_str));
+ DBUG_PRINT("info",("spider separete_str_length = %d", separete_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, spider, str,
+ alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (roop_count == 1)
+ {
+ func_name = separete_str;
+ func_name_length = separete_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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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->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 (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
+) {
+ 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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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));
+ append_escaped(to->get_str(), from);
+ to->mem_calc();
+ DBUG_RETURN(0);
+}
+
+spider_handlersocket_share::spider_handlersocket_share(
+ st_spider_share *share
+) : spider_db_share(
+ share
+),
+ 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,
+ (char *) (*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_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->s->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);
+}
+
+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);
+}
+
+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;
+ SPIDER_SHARE *share = spider->share;
+ DBUG_ENTER("spider_handlersocket_show_table_status");
+ res.fetch_table_status(
+ sts_mode,
+ share->records,
+ share->mean_rec_length,
+ share->data_file_length,
+ share->max_data_file_length,
+ share->index_file_length,
+ share->auto_increment_value,
+ share->create_time,
+ share->update_time,
+ share->check_time
+ );
+ 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->has_clone_for_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);
+}
+#endif
diff --git a/storage/spider/spd_db_handlersocket.h b/storage/spider/spd_db_handlersocket.h
index 7d93598ecc8..5f359d57bd8 100644
--- a/storage/spider/spd_db_handlersocket.h
+++ b/storage/spider/spd_db_handlersocket.h
@@ -1,944 +1,955 @@
-/* Copyright (C) 2012-2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-#define SPIDER_HS_CONN dena::hstcpcli_ptr
-#define SPIDER_HS_CONN_CREATE dena::hstcpcli_i::create
-#define SPIDER_HS_RESULT dena::hstresult
-#define SPIDER_HS_SOCKARGS dena::socket_args
-
-class spider_db_handlersocket_util: public spider_db_util
-{
-public:
- spider_db_handlersocket_util();
- ~spider_db_handlersocket_util();
- int append_name(
- spider_string *str,
- const char *name,
- uint name_length
- );
- int append_name_with_charset(
- spider_string *str,
- const char *name,
- uint name_length,
- CHARSET_INFO *name_charset
- );
- bool is_name_quote(
- const char head_code
- );
- int append_escaped_name_quote(
- spider_string *str
- );
- int append_column_value(
- ha_spider *spider,
- spider_string *str,
- Field *field,
- const uchar *new_ptr,
- CHARSET_INFO *access_charset
- );
- int append_trx_isolation(
- spider_string *str,
- int trx_isolation
- );
- int append_autocommit(
- spider_string *str,
- bool autocommit
- );
- int append_sql_log_off(
- spider_string *str,
- bool sql_log_off
- );
- int append_time_zone(
- spider_string *str,
- Time_zone *time_zone
- );
- int append_start_transaction(
- spider_string *str
- );
- int append_xa_start(
- spider_string *str,
- XID *xid
- );
- int append_lock_table_head(
- spider_string *str
- );
- int 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
- );
- int append_lock_table_tail(
- spider_string *str
- );
- int append_unlock_table(
- spider_string *str
- );
- int open_item_func(
- Item_func *item_func,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int open_item_sum_func(
- Item_sum *item_sum,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#endif
- int append_escaped_util(
- spider_string *to,
- String *from
- );
-};
-
-class spider_db_handlersocket_row: public spider_db_row
-{
-public:
- SPIDER_HS_STRING_REF *hs_row;
- SPIDER_HS_STRING_REF *hs_row_first;
- uint field_count;
- bool cloned;
- spider_db_handlersocket_row();
- ~spider_db_handlersocket_row();
- int store_to_field(
- Field *field,
- CHARSET_INFO *access_charset
- );
- int append_to_str(
- spider_string *str
- );
- int append_escaped_to_str(
- spider_string *str,
- uint dbton_id
- );
- void first();
- void next();
- bool is_null();
- int val_int();
- double val_real();
- my_decimal *val_decimal(
- my_decimal *decimal_value,
- CHARSET_INFO *access_charset
- );
- SPIDER_DB_ROW *clone();
- int store_to_tmp_table(
- TABLE *tmp_table,
- spider_string *str
- );
-};
-
-class spider_db_handlersocket_result_buffer: public spider_db_result_buffer
-{
-public:
- SPIDER_HS_RESULT hs_result;
- spider_db_handlersocket_result_buffer();
- ~spider_db_handlersocket_result_buffer();
- void clear();
- bool check_size(
- longlong size
- );
-};
-
-class spider_db_handlersocket_result: public spider_db_result
-{
-public:
- SPIDER_HS_CONN *hs_conn_p;
- spider_db_handlersocket_row row;
- SPIDER_HS_STRING_REF hs_row;
- uint field_count;
- int store_error_num;
- spider_db_handlersocket_result();
- ~spider_db_handlersocket_result();
- bool has_result();
- void free_result();
- SPIDER_DB_ROW *current_row();
- SPIDER_DB_ROW *fetch_row();
- SPIDER_DB_ROW *fetch_row_from_result_buffer(
- spider_db_result_buffer *spider_res_buf
- );
- SPIDER_DB_ROW *fetch_row_from_tmp_table(
- TABLE *tmp_table
- );
- int fetch_table_status(
- int mode,
- ha_rows &records,
- ulong &mean_rec_length,
- ulonglong &data_file_length,
- ulonglong &max_data_file_length,
- ulonglong &index_file_length,
- ulonglong &auto_increment_value,
- time_t &create_time,
- time_t &update_time,
- time_t &check_time
- );
- int fetch_table_records(
- int mode,
- ha_rows &records
- );
- int fetch_table_cardinality(
- int mode,
- TABLE *table,
- longlong *cardinality,
- uchar *cardinality_upd,
- int bitmap_size
- );
- int fetch_table_mon_status(
- int &status
- );
- longlong num_rows();
- uint num_fields();
- void move_to_pos(
- longlong pos
- );
- int get_errno();
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
- int fetch_columns_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
- );
- int fetch_index_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
- );
-#endif
-};
-
-class spider_db_handlersocket: public spider_db_conn
-{
- SPIDER_HS_CONN hs_conn;
- int stored_error;
- uint field_count;
-public:
- DYNAMIC_ARRAY handler_open_array;
- bool handler_open_array_inited;
- uint handler_open_array_id;
- const char *handler_open_array_func_name;
- const char *handler_open_array_file_name;
- ulong handler_open_array_line_no;
- st_spider_db_request_key *request_key_req_first;
- st_spider_db_request_key *request_key_req_last;
- st_spider_db_request_key *request_key_snd_first;
- st_spider_db_request_key *request_key_snd_last;
- st_spider_db_request_key *request_key_reuse_first;
- st_spider_db_request_key *request_key_reuse_last;
- spider_db_handlersocket(
- SPIDER_CONN *conn
- );
- ~spider_db_handlersocket();
- int init();
- bool is_connected();
- void bg_connect();
- int 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
- );
- int ping();
- void bg_disconnect();
- void disconnect();
- int set_net_timeout();
- int exec_query(
- const char *query,
- uint length,
- int quick_mode
- );
- int get_errno();
- const char *get_error();
- bool is_server_gone_error(
- int error_num
- );
- bool is_dup_entry_error(
- int error_num
- );
- bool is_xa_nota_error(
- int error_num
- );
- spider_db_result *store_result(
- spider_db_result_buffer **spider_res_buf,
- st_spider_db_request_key *request_key,
- int *error_num
- );
- spider_db_result *use_result(
- st_spider_db_request_key *request_key,
- int *error_num
- );
- int next_result();
- uint affected_rows();
- ulonglong last_insert_id();
- int set_character_set(
- const char *csname
- );
- int select_db(
- const char *dbname
- );
- int consistent_snapshot(
- int *need_mon
- );
- bool trx_start_in_bulk_sql();
- int start_transaction(
- int *need_mon
- );
- int commit(
- int *need_mon
- );
- int rollback(
- int *need_mon
- );
- bool xa_start_in_bulk_sql();
- int xa_start(
- XID *xid,
- int *need_mon
- );
- int xa_end(
- XID *xid,
- int *need_mon
- );
- int xa_prepare(
- XID *xid,
- int *need_mon
- );
- int xa_commit(
- XID *xid,
- int *need_mon
- );
- int xa_rollback(
- XID *xid,
- int *need_mon
- );
- bool set_trx_isolation_in_bulk_sql();
- int set_trx_isolation(
- int trx_isolation,
- int *need_mon
- );
- bool set_autocommit_in_bulk_sql();
- int set_autocommit(
- bool autocommit,
- int *need_mon
- );
- bool set_sql_log_off_in_bulk_sql();
- int set_sql_log_off(
- bool sql_log_off,
- int *need_mon
- );
- bool set_time_zone_in_bulk_sql();
- int set_time_zone(
- Time_zone *time_zone,
- int *need_mon
- );
- int append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
- );
- int 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 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 append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
- );
- int 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 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
- );
- void reset_request_queue();
- size_t escape_string(
- char *to,
- const char *from,
- size_t from_length
- );
- bool have_lock_table_list();
- int append_lock_tables(
- spider_string *str
- );
- int append_unlock_tables(
- spider_string *str
- );
- uint get_lock_table_hash_count();
- void reset_lock_table_hash();
- uint get_opened_handler_count();
- void reset_opened_handler();
- void set_dup_key_idx(
- ha_spider *spider,
- int link_idx
- );
- int append_request_key(
- st_spider_db_request_key *request_key
- );
- void reset_request_key_req();
- void reset_request_key_snd();
- void move_request_key_to_snd();
- int check_request_key(
- st_spider_db_request_key *request_key
- );
- bool cmp_request_key_to_snd(
- st_spider_db_request_key *request_key
- );
-};
-
-class spider_handlersocket_share: public spider_db_share
-{
-public:
- spider_string *table_names_str;
- spider_string *db_names_str;
- spider_string *db_table_str;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- my_hash_value_type *db_table_str_hash_value;
-#endif
- uint table_nm_max_length;
- uint db_nm_max_length;
- spider_string *column_name_str;
- bool same_db_table_name;
- int first_all_link_idx;
- spider_handlersocket_share(
- st_spider_share *share
- );
- ~spider_handlersocket_share();
- int init();
- int append_table_name(
- spider_string *str,
- int all_link_idx
- );
- int create_table_names_str();
- void free_table_names_str();
- int create_column_name_str();
- void free_column_name_str();
- uint get_column_name_length(
- uint field_index
- );
- int append_column_name(
- spider_string *str,
- uint field_index
- );
- int append_column_name_with_alias(
- spider_string *str,
- uint field_index,
- const char *alias,
- uint alias_length
- );
- bool need_change_db_table_name();
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
- int discover_table_structure(
- SPIDER_TRX *trx,
- SPIDER_SHARE *spider_share,
- spider_string *str
- );
-#endif
-};
-
-class spider_handlersocket_handler: public spider_db_handler
-{
- spider_string hs_sql;
-public:
- bool hs_adding_keys;
- SPIDER_DB_HS_STRING_REF_BUFFER hs_keys;
- SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
- SPIDER_DB_HS_STR_BUFFER hs_strs;
- uint hs_strs_pos;
- int hs_limit;
- int hs_skip;
- spider_handlersocket_share *handlersocket_share;
- SPIDER_LINK_FOR_HASH *link_for_hash;
- spider_handlersocket_handler(
- ha_spider *spider,
- spider_handlersocket_share *db_share
- );
- ~spider_handlersocket_handler();
- int init();
- int append_table_name_with_adjusting(
- spider_string *str,
- int link_idx,
- ulong sql_type
- );
- int append_tmp_table_and_sql_for_bka(
- const key_range *start_key
- );
- int reuse_tmp_table_and_sql_for_bka();
- int append_union_table_and_sql_for_bka(
- const key_range *start_key
- );
- int reuse_union_table_and_sql_for_bka();
- int append_insert_for_recovery(
- ulong sql_type,
- int link_idx
- );
- int append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
- );
- int append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
- );
- int append_insert_part();
- int append_update_part();
- int append_delete_part();
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_increment_update_set_part();
-#endif
- int append_update_set_part();
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_direct_update_set_part();
-#endif
- int append_minimum_select_without_quote(
- spider_string *str
- );
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_minimum_select_by_field_idx_list(
- spider_string *str,
- uint32 *field_idxs,
- size_t field_idxs_num
- );
- int append_dup_update_pushdown_part(
- const char *alias,
- uint alias_length
- );
- int append_update_columns_part(
- const char *alias,
- uint alias_length
- );
- int check_update_columns_part();
- int append_select_part(
- ulong sql_type
- );
-#endif
- int append_table_select_part(
- ulong sql_type
- );
- int append_key_select_part(
- ulong sql_type,
- uint idx
- );
- int append_minimum_select_part(
- ulong sql_type
- );
- int append_hint_after_table_part(
- ulong sql_type
- );
- void set_where_pos(
- ulong sql_type
- );
- void set_where_to_pos(
- ulong sql_type
- );
- int check_item_type(
- Item *item
- );
- int append_values_connector_part(
- ulong sql_type
- );
- int append_values_terminator_part(
- ulong sql_type
- );
- int append_union_table_connector_part(
- ulong sql_type
- );
- int append_union_table_terminator_part(
- ulong sql_type
- );
- int append_key_column_values_part(
- const key_range *start_key,
- ulong sql_type
- );
- int append_key_column_values_with_name_part(
- const key_range *start_key,
- ulong sql_type
- );
- int append_key_where_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type
- );
- int 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 append_is_null_part(
- ulong sql_type,
- KEY_PART_INFO *key_part,
- const key_range *key,
- const uchar **ptr,
- bool key_eq
- );
- int 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
- );
- int append_where_terminator_part(
- ulong sql_type,
- bool set_order,
- int key_count
- );
- int append_match_where_part(
- ulong sql_type
- );
- int append_condition_part(
- const char *alias,
- uint alias_length,
- ulong sql_type,
- bool test_flg
- );
- int append_match_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int append_sum_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
- );
-#endif
- void set_order_pos(
- ulong sql_type
- );
- void set_order_to_pos(
- ulong sql_type
- );
- int append_key_order_for_merge_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_for_direct_order_limit_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
- );
- int reappend_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
- );
- int append_select_lock_part(
- ulong sql_type
- );
- int append_union_all_start_part(
- ulong sql_type
- );
- int append_union_all_part(
- ulong sql_type
- );
- int append_union_all_end_part(
- ulong sql_type
- );
- int append_multi_range_cnt_part(
- ulong sql_type,
- uint multi_range_cnt,
- bool with_comma
- );
- int append_multi_range_cnt_with_name_part(
- ulong sql_type,
- uint multi_range_cnt
- );
- int append_open_handler_part(
- ulong sql_type,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_open_handler(
- spider_string *str,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_close_handler_part(
- ulong sql_type,
- int link_idx
- );
- int append_insert_terminator_part(
- ulong sql_type
- );
- int append_insert_values_part(
- ulong sql_type
- );
- int append_insert_values(
- spider_string *str
- );
- int append_into_part(
- ulong sql_type
- );
- void set_insert_to_pos(
- ulong sql_type
- );
- int append_from_part(
- ulong sql_type,
- int link_idx
- );
- int append_delete_all_rows_part(
- ulong sql_type
- );
- int append_explain_select_part(
- key_range *start_key,
- key_range *end_key,
- ulong sql_type,
- int link_idx
- );
- bool is_bulk_insert_exec_period(
- bool bulk_end
- );
- bool sql_is_filled_up(
- ulong sql_type
- );
- bool sql_is_empty(
- ulong sql_type
- );
- bool support_multi_split_read();
- bool support_bulk_update();
- int bulk_tmp_table_insert();
- int bulk_tmp_table_insert(
- int link_idx
- );
- int bulk_tmp_table_end_bulk_insert();
- int bulk_tmp_table_rnd_init();
- int bulk_tmp_table_rnd_next();
- int bulk_tmp_table_rnd_end();
- bool need_copy_for_update(
- int link_idx
- );
- bool bulk_tmp_table_created();
- int mk_bulk_tmp_table_and_bulk_start();
- void rm_bulk_tmp_table();
- int insert_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx,
- int *appended
- );
- int realloc_sql(
- ulong *realloced
- );
- int reset_sql(
- ulong sql_type
- );
- int reset_keys(
- ulong sql_type
- );
- int reset_upds(
- ulong sql_type
- );
- int reset_strs(
- ulong sql_type
- );
- int reset_strs_pos(
- ulong sql_type
- );
- int push_back_upds(
- SPIDER_HS_STRING_REF &info
- );
- int request_buf_find(
- int link_idx
- );
- int request_buf_insert(
- int link_idx
- );
- int request_buf_update(
- int link_idx
- );
- int request_buf_delete(
- int link_idx
- );
- bool need_lock_before_set_sql_for_exec(
- ulong sql_type
- );
- int set_sql_for_exec(
- ulong sql_type,
- int link_idx
- );
- int set_sql_for_exec(
- spider_db_copy_table *tgt_ct,
- ulong sql_type
- );
- int execute_sql(
- ulong sql_type,
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
- );
- int reset();
- int sts_mode_exchange(
- int sts_mode
- );
- int show_table_status(
- int link_idx,
- int sts_mode,
- uint flag
- );
- int crd_mode_exchange(
- int crd_mode
- );
- int show_index(
- int link_idx,
- int crd_mode
- );
- int show_records(
- int link_idx
- );
- int show_last_insert_id(
- int link_idx,
- ulonglong &last_insert_id
- );
- ha_rows explain_select(
- key_range *start_key,
- key_range *end_key,
- int link_idx
- );
- int lock_tables(
- int link_idx
- );
- int unlock_tables(
- int link_idx
- );
- int disable_keys(
- SPIDER_CONN *conn,
- int link_idx
- );
- int enable_keys(
- SPIDER_CONN *conn,
- int link_idx
- );
- int check_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int repair_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int analyze_table(
- SPIDER_CONN *conn,
- int link_idx
- );
- int optimize_table(
- SPIDER_CONN *conn,
- int link_idx
- );
- int flush_tables(
- SPIDER_CONN *conn,
- int link_idx,
- bool lock
- );
- int flush_logs(
- SPIDER_CONN *conn,
- int link_idx
- );
- int insert_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
- );
- int delete_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
- );
- int sync_from_clone_source(
- spider_db_handler *dbton_hdl
- );
- bool support_use_handler(
- int use_handler
- );
- bool minimum_select_bit_is_set(
- uint field_index
- );
- void copy_minimum_select_bitmap(
- uchar *bitmap
- );
- int init_union_table_name_pos();
- int set_union_table_name_pos();
- int reset_union_table_name(
- spider_string *str,
- int link_idx,
- ulong sql_type
- );
-};
+/* Copyright (C) 2012-2014 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#define SPIDER_HS_CONN dena::hstcpcli_ptr
+#define SPIDER_HS_CONN_CREATE dena::hstcpcli_i::create
+#define SPIDER_HS_RESULT dena::hstresult
+#define SPIDER_HS_SOCKARGS dena::socket_args
+
+class spider_db_handlersocket_util: public spider_db_util
+{
+public:
+ spider_db_handlersocket_util();
+ ~spider_db_handlersocket_util();
+ int append_name(
+ spider_string *str,
+ const char *name,
+ uint name_length
+ );
+ int append_name_with_charset(
+ spider_string *str,
+ const char *name,
+ uint name_length,
+ CHARSET_INFO *name_charset
+ );
+ bool is_name_quote(
+ const char head_code
+ );
+ int append_escaped_name_quote(
+ spider_string *str
+ );
+ int append_column_value(
+ ha_spider *spider,
+ spider_string *str,
+ Field *field,
+ const uchar *new_ptr,
+ CHARSET_INFO *access_charset
+ );
+ int append_trx_isolation(
+ spider_string *str,
+ int trx_isolation
+ );
+ int append_autocommit(
+ spider_string *str,
+ bool autocommit
+ );
+ int append_sql_log_off(
+ spider_string *str,
+ bool sql_log_off
+ );
+ int append_time_zone(
+ spider_string *str,
+ Time_zone *time_zone
+ );
+ int append_start_transaction(
+ spider_string *str
+ );
+ int append_xa_start(
+ spider_string *str,
+ XID *xid
+ );
+ int append_lock_table_head(
+ spider_string *str
+ );
+ int 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
+ );
+ int append_lock_table_tail(
+ spider_string *str
+ );
+ int append_unlock_table(
+ spider_string *str
+ );
+ int open_item_func(
+ Item_func *item_func,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
+ int append_escaped_util(
+ spider_string *to,
+ String *from
+ );
+};
+
+class spider_db_handlersocket_row: public spider_db_row
+{
+public:
+ SPIDER_HS_STRING_REF *hs_row;
+ SPIDER_HS_STRING_REF *hs_row_first;
+ uint field_count;
+ bool cloned;
+ spider_db_handlersocket_row();
+ ~spider_db_handlersocket_row();
+ int store_to_field(
+ Field *field,
+ CHARSET_INFO *access_charset
+ );
+ int append_to_str(
+ spider_string *str
+ );
+ int append_escaped_to_str(
+ spider_string *str,
+ uint dbton_id
+ );
+ void first();
+ void next();
+ bool is_null();
+ int val_int();
+ double val_real();
+ my_decimal *val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+ );
+ SPIDER_DB_ROW *clone();
+ int store_to_tmp_table(
+ TABLE *tmp_table,
+ spider_string *str
+ );
+};
+
+class spider_db_handlersocket_result_buffer: public spider_db_result_buffer
+{
+public:
+ SPIDER_HS_RESULT hs_result;
+ spider_db_handlersocket_result_buffer();
+ ~spider_db_handlersocket_result_buffer();
+ void clear();
+ bool check_size(
+ longlong size
+ );
+};
+
+class spider_db_handlersocket_result: public spider_db_result
+{
+public:
+ SPIDER_HS_CONN *hs_conn_p;
+ spider_db_handlersocket_row row;
+ SPIDER_HS_STRING_REF hs_row;
+ uint field_count;
+ int store_error_num;
+ spider_db_handlersocket_result();
+ ~spider_db_handlersocket_result();
+ bool has_result();
+ void free_result();
+ SPIDER_DB_ROW *current_row();
+ SPIDER_DB_ROW *fetch_row();
+ SPIDER_DB_ROW *fetch_row_from_result_buffer(
+ spider_db_result_buffer *spider_res_buf
+ );
+ SPIDER_DB_ROW *fetch_row_from_tmp_table(
+ TABLE *tmp_table
+ );
+ int fetch_table_status(
+ int mode,
+ ha_rows &records,
+ ulong &mean_rec_length,
+ ulonglong &data_file_length,
+ ulonglong &max_data_file_length,
+ ulonglong &index_file_length,
+ ulonglong &auto_increment_value,
+ time_t &create_time,
+ time_t &update_time,
+ time_t &check_time
+ );
+ int fetch_table_records(
+ int mode,
+ ha_rows &records
+ );
+ int fetch_table_cardinality(
+ int mode,
+ TABLE *table,
+ longlong *cardinality,
+ uchar *cardinality_upd,
+ int bitmap_size
+ );
+ int fetch_table_mon_status(
+ int &status
+ );
+ longlong num_rows();
+ uint num_fields();
+ void move_to_pos(
+ longlong pos
+ );
+ int get_errno();
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+ int fetch_columns_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+ );
+ int fetch_index_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+ );
+#endif
+};
+
+class spider_db_handlersocket: public spider_db_conn
+{
+ SPIDER_HS_CONN hs_conn;
+ int stored_error;
+ uint field_count;
+public:
+ DYNAMIC_ARRAY handler_open_array;
+ bool handler_open_array_inited;
+ uint handler_open_array_id;
+ const char *handler_open_array_func_name;
+ const char *handler_open_array_file_name;
+ ulong handler_open_array_line_no;
+ st_spider_db_request_key *request_key_req_first;
+ st_spider_db_request_key *request_key_req_last;
+ st_spider_db_request_key *request_key_snd_first;
+ st_spider_db_request_key *request_key_snd_last;
+ st_spider_db_request_key *request_key_reuse_first;
+ st_spider_db_request_key *request_key_reuse_last;
+ spider_db_handlersocket(
+ SPIDER_CONN *conn
+ );
+ ~spider_db_handlersocket();
+ int init();
+ bool is_connected();
+ void bg_connect();
+ int 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
+ );
+ int ping();
+ void bg_disconnect();
+ void disconnect();
+ int set_net_timeout();
+ int exec_query(
+ const char *query,
+ uint length,
+ int quick_mode
+ );
+ int get_errno();
+ const char *get_error();
+ bool is_server_gone_error(
+ int error_num
+ );
+ bool is_dup_entry_error(
+ int error_num
+ );
+ bool is_xa_nota_error(
+ int error_num
+ );
+ spider_db_result *store_result(
+ spider_db_result_buffer **spider_res_buf,
+ st_spider_db_request_key *request_key,
+ int *error_num
+ );
+ spider_db_result *use_result(
+ st_spider_db_request_key *request_key,
+ int *error_num
+ );
+ int next_result();
+ uint affected_rows();
+ ulonglong last_insert_id();
+ int set_character_set(
+ const char *csname
+ );
+ int select_db(
+ const char *dbname
+ );
+ int consistent_snapshot(
+ int *need_mon
+ );
+ bool trx_start_in_bulk_sql();
+ int start_transaction(
+ int *need_mon
+ );
+ int commit(
+ int *need_mon
+ );
+ int rollback(
+ int *need_mon
+ );
+ bool xa_start_in_bulk_sql();
+ int xa_start(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_end(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_prepare(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_commit(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_rollback(
+ XID *xid,
+ int *need_mon
+ );
+ bool set_trx_isolation_in_bulk_sql();
+ int set_trx_isolation(
+ int trx_isolation,
+ int *need_mon
+ );
+ bool set_autocommit_in_bulk_sql();
+ int set_autocommit(
+ bool autocommit,
+ int *need_mon
+ );
+ bool set_sql_log_off_in_bulk_sql();
+ int set_sql_log_off(
+ bool sql_log_off,
+ int *need_mon
+ );
+ bool set_time_zone_in_bulk_sql();
+ int set_time_zone(
+ Time_zone *time_zone,
+ int *need_mon
+ );
+ int append_sql(
+ char *sql,
+ ulong sql_length,
+ st_spider_db_request_key *request_key
+ );
+ int 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 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 append_insert(
+ uint handler_id,
+ SPIDER_DB_HS_STRING_REF_BUFFER *upds,
+ st_spider_db_request_key *request_key
+ );
+ int 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 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
+ );
+ void reset_request_queue();
+ size_t escape_string(
+ char *to,
+ const char *from,
+ size_t from_length
+ );
+ bool have_lock_table_list();
+ int append_lock_tables(
+ spider_string *str
+ );
+ int append_unlock_tables(
+ spider_string *str
+ );
+ uint get_lock_table_hash_count();
+ void reset_lock_table_hash();
+ uint get_opened_handler_count();
+ void reset_opened_handler();
+ void set_dup_key_idx(
+ ha_spider *spider,
+ int link_idx
+ );
+ int append_request_key(
+ st_spider_db_request_key *request_key
+ );
+ void reset_request_key_req();
+ void reset_request_key_snd();
+ void move_request_key_to_snd();
+ int check_request_key(
+ st_spider_db_request_key *request_key
+ );
+ bool cmp_request_key_to_snd(
+ st_spider_db_request_key *request_key
+ );
+};
+
+class spider_handlersocket_share: public spider_db_share
+{
+public:
+ spider_string *table_names_str;
+ spider_string *db_names_str;
+ spider_string *db_table_str;
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ my_hash_value_type *db_table_str_hash_value;
+#endif
+ uint table_nm_max_length;
+ uint db_nm_max_length;
+ spider_string *column_name_str;
+ bool same_db_table_name;
+ int first_all_link_idx;
+ spider_handlersocket_share(
+ st_spider_share *share
+ );
+ ~spider_handlersocket_share();
+ int init();
+ int append_table_name(
+ spider_string *str,
+ int all_link_idx
+ );
+ int create_table_names_str();
+ void free_table_names_str();
+ int create_column_name_str();
+ void free_column_name_str();
+ uint get_column_name_length(
+ uint field_index
+ );
+ int append_column_name(
+ spider_string *str,
+ uint field_index
+ );
+ int append_column_name_with_alias(
+ spider_string *str,
+ uint field_index,
+ const char *alias,
+ uint alias_length
+ );
+ bool need_change_db_table_name();
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+ int discover_table_structure(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *spider_share,
+ spider_string *str
+ );
+#endif
+};
+
+class spider_handlersocket_handler: public spider_db_handler
+{
+ spider_string hs_sql;
+public:
+ bool hs_adding_keys;
+ SPIDER_DB_HS_STRING_REF_BUFFER hs_keys;
+ SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
+ SPIDER_DB_HS_STR_BUFFER hs_strs;
+ uint hs_strs_pos;
+ int hs_limit;
+ int hs_skip;
+ spider_handlersocket_share *handlersocket_share;
+ SPIDER_LINK_FOR_HASH *link_for_hash;
+ uchar *minimum_select_bitmap;
+ spider_handlersocket_handler(
+ ha_spider *spider,
+ spider_handlersocket_share *db_share
+ );
+ ~spider_handlersocket_handler();
+ int init();
+ int append_table_name_with_adjusting(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ );
+ int append_tmp_table_and_sql_for_bka(
+ const key_range *start_key
+ );
+ int reuse_tmp_table_and_sql_for_bka();
+ int append_union_table_and_sql_for_bka(
+ const key_range *start_key
+ );
+ int reuse_union_table_and_sql_for_bka();
+ int append_insert_for_recovery(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+ );
+ int append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+ );
+ int append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+ );
+ int append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+ );
+ int append_insert_part();
+ int append_update_part();
+ int append_delete_part();
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ int append_increment_update_set_part();
+#endif
+ int append_update_set_part();
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ int append_direct_update_set_part();
+#endif
+ int append_minimum_select_without_quote(
+ spider_string *str
+ );
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ int append_minimum_select_by_field_idx_list(
+ spider_string *str,
+ uint32 *field_idxs,
+ size_t field_idxs_num
+ );
+ int append_dup_update_pushdown_part(
+ const char *alias,
+ uint alias_length
+ );
+ int append_update_columns_part(
+ const char *alias,
+ uint alias_length
+ );
+ int check_update_columns_part();
+ int append_select_part(
+ ulong sql_type
+ );
+#endif
+ int append_table_select_part(
+ ulong sql_type
+ );
+ int append_key_select_part(
+ ulong sql_type,
+ uint idx
+ );
+ int append_minimum_select_part(
+ ulong sql_type
+ );
+ int append_hint_after_table_part(
+ ulong sql_type
+ );
+ void set_where_pos(
+ ulong sql_type
+ );
+ void set_where_to_pos(
+ ulong sql_type
+ );
+ int check_item_type(
+ Item *item
+ );
+ int append_values_connector_part(
+ ulong sql_type
+ );
+ int append_values_terminator_part(
+ ulong sql_type
+ );
+ int append_union_table_connector_part(
+ ulong sql_type
+ );
+ int append_union_table_terminator_part(
+ ulong sql_type
+ );
+ int append_key_column_values_part(
+ const key_range *start_key,
+ ulong sql_type
+ );
+ int append_key_column_values_with_name_part(
+ const key_range *start_key,
+ ulong sql_type
+ );
+ int append_key_where_part(
+ const key_range *start_key,
+ const key_range *end_key,
+ ulong sql_type
+ );
+ int 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 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 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
+ );
+ int append_where_terminator_part(
+ ulong sql_type,
+ bool set_order,
+ int key_count
+ );
+ int append_match_where_part(
+ ulong sql_type
+ );
+ int append_condition_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type,
+ bool test_flg
+ );
+ int append_match_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+#endif
+ void set_order_pos(
+ ulong sql_type
+ );
+ void set_order_to_pos(
+ ulong sql_type
+ );
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_group_by_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+#endif
+ int append_key_order_for_merge_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_key_order_for_direct_order_limit_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_key_order_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+ );
+ int reappend_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+ );
+ int append_select_lock_part(
+ ulong sql_type
+ );
+ int append_union_all_start_part(
+ ulong sql_type
+ );
+ int append_union_all_part(
+ ulong sql_type
+ );
+ int append_union_all_end_part(
+ ulong sql_type
+ );
+ int append_multi_range_cnt_part(
+ ulong sql_type,
+ uint multi_range_cnt,
+ bool with_comma
+ );
+ int append_multi_range_cnt_with_name_part(
+ ulong sql_type,
+ uint multi_range_cnt
+ );
+ int append_open_handler_part(
+ ulong sql_type,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int append_open_handler(
+ spider_string *str,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int append_close_handler_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_insert_terminator_part(
+ ulong sql_type
+ );
+ int append_insert_values_part(
+ ulong sql_type
+ );
+ int append_insert_values(
+ spider_string *str
+ );
+ int append_into_part(
+ ulong sql_type
+ );
+ void set_insert_to_pos(
+ ulong sql_type
+ );
+ int append_from_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_delete_all_rows_part(
+ ulong sql_type
+ );
+ int append_explain_select_part(
+ key_range *start_key,
+ key_range *end_key,
+ ulong sql_type,
+ int link_idx
+ );
+ bool is_bulk_insert_exec_period(
+ bool bulk_end
+ );
+ bool sql_is_filled_up(
+ ulong sql_type
+ );
+ bool sql_is_empty(
+ ulong sql_type
+ );
+ bool support_multi_split_read();
+ bool support_bulk_update();
+ int bulk_tmp_table_insert();
+ int bulk_tmp_table_insert(
+ int link_idx
+ );
+ int bulk_tmp_table_end_bulk_insert();
+ int bulk_tmp_table_rnd_init();
+ int bulk_tmp_table_rnd_next();
+ int bulk_tmp_table_rnd_end();
+ bool need_copy_for_update(
+ int link_idx
+ );
+ bool bulk_tmp_table_created();
+ int mk_bulk_tmp_table_and_bulk_start();
+ void rm_bulk_tmp_table();
+ int insert_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int append_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx,
+ int *appended
+ );
+ int realloc_sql(
+ ulong *realloced
+ );
+ int reset_sql(
+ ulong sql_type
+ );
+ int reset_keys(
+ ulong sql_type
+ );
+ int reset_upds(
+ ulong sql_type
+ );
+ int reset_strs(
+ ulong sql_type
+ );
+ int reset_strs_pos(
+ ulong sql_type
+ );
+ int push_back_upds(
+ SPIDER_HS_STRING_REF &info
+ );
+ int request_buf_find(
+ int link_idx
+ );
+ int request_buf_insert(
+ int link_idx
+ );
+ int request_buf_update(
+ int link_idx
+ );
+ int request_buf_delete(
+ int link_idx
+ );
+ bool need_lock_before_set_sql_for_exec(
+ ulong sql_type
+ );
+ int set_sql_for_exec(
+ ulong sql_type,
+ int link_idx
+ );
+ int set_sql_for_exec(
+ spider_db_copy_table *tgt_ct,
+ ulong sql_type
+ );
+ int execute_sql(
+ ulong sql_type,
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+ );
+ int reset();
+ int sts_mode_exchange(
+ int sts_mode
+ );
+ int show_table_status(
+ int link_idx,
+ int sts_mode,
+ uint flag
+ );
+ int crd_mode_exchange(
+ int crd_mode
+ );
+ int show_index(
+ int link_idx,
+ int crd_mode
+ );
+ int show_records(
+ int link_idx
+ );
+ int show_last_insert_id(
+ int link_idx,
+ ulonglong &last_insert_id
+ );
+ ha_rows explain_select(
+ key_range *start_key,
+ key_range *end_key,
+ int link_idx
+ );
+ int lock_tables(
+ int link_idx
+ );
+ int unlock_tables(
+ int link_idx
+ );
+ int disable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int enable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int check_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int repair_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int analyze_table(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int optimize_table(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int flush_tables(
+ SPIDER_CONN *conn,
+ int link_idx,
+ bool lock
+ );
+ int flush_logs(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int insert_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int delete_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int sync_from_clone_source(
+ spider_db_handler *dbton_hdl
+ );
+ bool support_use_handler(
+ int use_handler
+ );
+ void minimum_select_bitmap_create();
+ bool minimum_select_bit_is_set(
+ uint field_index
+ );
+ void copy_minimum_select_bitmap(
+ uchar *bitmap
+ );
+ int init_union_table_name_pos();
+ int set_union_table_name_pos();
+ int reset_union_table_name(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ );
+};
diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h
index 218358c631d..40f547df35e 100644
--- a/storage/spider/spd_db_include.h
+++ b/storage/spider/spd_db_include.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -26,11 +26,20 @@
#define SPIDER_HAS_SHOW_SIMPLE_FUNC
#endif
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100007
+#define SPIDER_HAS_DISCOVER_TABLE_STRUCTURE_COMMENT
+#define SPIDER_ITEM_HAS_CMP_TYPE
+#endif
+
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100004
#define SPIDER_HAS_TIME_STATUS
#define SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
#endif
+#if defined(MARIADB_BASE_VERSION)
+#define SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
+#endif
+
class spider_db_conn;
typedef spider_db_conn SPIDER_DB_CONN;
class spider_db_result;
@@ -1120,7 +1129,8 @@ public:
KEY_PART_INFO *key_part,
const key_range *key,
const uchar **ptr,
- bool key_eq
+ bool key_eq,
+ bool tgt_final
) = 0;
virtual int append_where_terminator_part(
ulong sql_type,
@@ -1154,6 +1164,13 @@ public:
virtual void set_order_to_pos(
ulong sql_type
) = 0;
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ virtual int append_group_by_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ ) = 0;
+#endif
virtual int append_key_order_for_merge_with_alias_part(
const char *alias,
uint alias_length,
@@ -1578,6 +1595,8 @@ typedef struct st_spider_result_list
uint *sql_kind_backup;
uint sql_kinds_backup;
bool use_union;
+ bool use_both_key;
+ const key_range *end_key;
spider_string *insert_sqls;
spider_string *update_sqls;
TABLE **upd_tmp_tbls;
@@ -1624,6 +1643,7 @@ typedef struct st_spider_result_list
longlong first_read;
longlong second_read;
int set_split_read_count;
+ int *casual_read;
#ifndef WITHOUT_SPIDER_BG_SEARCH
/* 0:nomal 1:store 2:store end */
volatile
diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc
index d9c008086f1..5f770e2b124 100644
--- a/storage/spider/spd_db_mysql.cc
+++ b/storage/spider/spd_db_mysql.cc
@@ -1,11570 +1,11873 @@
-/* Copyright (C) 2012-2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-#define MYSQL_SERVER 1
-#include "mysql_version.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_class.h"
-#include "sql_partition.h"
-#include "sql_analyse.h"
-#include "sql_base.h"
-#include "tztime.h"
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-#include "sql_select.h"
-#endif
-#endif
-#include "sql_common.h"
-#include <mysql.h>
-#include <errmsg.h>
-#include "spd_err.h"
-#include "spd_param.h"
-#include "spd_db_include.h"
-#include "spd_include.h"
-#include "spd_db_mysql.h"
-#include "ha_spider.h"
-#include "spd_conn.h"
-#include "spd_db_conn.h"
-#include "spd_malloc.h"
-#include "spd_sys_table.h"
-#include "spd_table.h"
-
-extern struct charset_info_st *spd_charset_utf8_bin;
-
-extern handlerton *spider_hton_ptr;
-extern pthread_mutex_t spider_open_conn_mutex;
-extern HASH spider_open_connections;
-extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
-extern const char spider_dig_upper[];
-
-#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_ISO_READ_UNCOMMITTED_STR "set session transaction isolation level read uncommitted"
-#define SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR) - 1
-#define SPIDER_SQL_ISO_READ_COMMITTED_STR "set session transaction isolation level read committed"
-#define SPIDER_SQL_ISO_READ_COMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_COMMITTED_STR) - 1
-#define SPIDER_SQL_ISO_REPEATABLE_READ_STR "set session transaction isolation level repeatable read"
-#define SPIDER_SQL_ISO_REPEATABLE_READ_LEN sizeof(SPIDER_SQL_ISO_REPEATABLE_READ_STR) - 1
-#define SPIDER_SQL_ISO_SERIALIZABLE_STR "set session transaction isolation level serializable"
-#define SPIDER_SQL_ISO_SERIALIZABLE_LEN sizeof(SPIDER_SQL_ISO_SERIALIZABLE_STR) - 1
-
-#define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR "start transaction with consistent snapshot"
-#define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN sizeof(SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR) - 1
-#define SPIDER_SQL_START_TRANSACTION_STR "start transaction"
-#define SPIDER_SQL_START_TRANSACTION_LEN sizeof(SPIDER_SQL_START_TRANSACTION_STR) - 1
-
-#define SPIDER_SQL_AUTOCOMMIT_OFF_STR "set session autocommit = 0"
-#define SPIDER_SQL_AUTOCOMMIT_OFF_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_OFF_STR) - 1
-#define SPIDER_SQL_AUTOCOMMIT_ON_STR "set session autocommit = 1"
-#define SPIDER_SQL_AUTOCOMMIT_ON_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_ON_STR) - 1
-
-#define SPIDER_SQL_SQL_LOG_OFF_STR "set session sql_log_off = 0"
-#define SPIDER_SQL_SQL_LOG_OFF_LEN sizeof(SPIDER_SQL_SQL_LOG_OFF_STR) - 1
-#define SPIDER_SQL_SQL_LOG_ON_STR "set session sql_log_off = 1"
-#define SPIDER_SQL_SQL_LOG_ON_LEN sizeof(SPIDER_SQL_SQL_LOG_ON_STR) - 1
-
-#define SPIDER_SQL_TIME_ZONE_STR "set session time_zone = '"
-#define SPIDER_SQL_TIME_ZONE_LEN sizeof(SPIDER_SQL_TIME_ZONE_STR) - 1
-
-#define SPIDER_SQL_COMMIT_STR "commit"
-#define SPIDER_SQL_COMMIT_LEN sizeof(SPIDER_SQL_COMMIT_STR) - 1
-#define SPIDER_SQL_ROLLBACK_STR "rollback"
-#define SPIDER_SQL_ROLLBACK_LEN sizeof(SPIDER_SQL_ROLLBACK_STR) - 1
-
-#define SPIDER_SQL_XA_START_STR "xa start "
-#define SPIDER_SQL_XA_START_LEN sizeof(SPIDER_SQL_XA_START_STR) - 1
-#define SPIDER_SQL_XA_END_STR "xa end "
-#define SPIDER_SQL_XA_END_LEN sizeof(SPIDER_SQL_XA_END_STR) - 1
-#define SPIDER_SQL_XA_PREPARE_STR "xa prepare "
-#define SPIDER_SQL_XA_PREPARE_LEN sizeof(SPIDER_SQL_XA_PREPARE_STR) - 1
-#define SPIDER_SQL_XA_COMMIT_STR "xa commit "
-#define SPIDER_SQL_XA_COMMIT_LEN sizeof(SPIDER_SQL_XA_COMMIT_STR) - 1
-#define SPIDER_SQL_XA_ROLLBACK_STR "xa rollback "
-#define SPIDER_SQL_XA_ROLLBACK_LEN sizeof(SPIDER_SQL_XA_ROLLBACK_STR) - 1
-
-#define SPIDER_SQL_LOCK_TABLE_STR "lock tables "
-#define SPIDER_SQL_LOCK_TABLE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_STR) - 1)
-#define SPIDER_SQL_UNLOCK_TABLE_STR "unlock tables"
-#define SPIDER_SQL_UNLOCK_TABLE_LEN (sizeof(SPIDER_SQL_UNLOCK_TABLE_STR) - 1)
-
-#define SPIDER_SQL_SHOW_TABLE_STATUS_STR "show table status from "
-#define SPIDER_SQL_SHOW_TABLE_STATUS_LEN sizeof(SPIDER_SQL_SHOW_TABLE_STATUS_STR) - 1
-#define SPIDER_SQL_SELECT_TABLES_STATUS_STR "select `table_rows`,`avg_row_length`,`data_length`,`max_data_length`,`index_length`,`auto_increment`,`create_time`,`update_time`,`check_time` from `information_schema`.`tables` where `table_schema` = "
-#define SPIDER_SQL_SELECT_TABLES_STATUS_LEN sizeof(SPIDER_SQL_SELECT_TABLES_STATUS_STR) - 1
-
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
-#define SPIDER_SQL_SHOW_COLUMNS_STR "show columns from "
-#define SPIDER_SQL_SHOW_COLUMNS_LEN sizeof(SPIDER_SQL_SHOW_COLUMNS_STR) - 1
-#endif
-
-#define SPIDER_SQL_LIKE_STR " like "
-#define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1)
-#define SPIDER_SQL_LIMIT1_STR " limit 1"
-#define SPIDER_SQL_LIMIT1_LEN (sizeof(SPIDER_SQL_LIMIT1_STR) - 1)
-#define SPIDER_SQL_COLLATE_STR " collate "
-#define SPIDER_SQL_COLLATE_LEN (sizeof(SPIDER_SQL_COLLATE_STR) - 1)
-
-#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)
-
-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_table_lock_str[] =
-{
- " read local,",
- " read,",
- " low_priority write,",
- " write,"
-};
-static const int spider_db_table_lock_len[] =
-{
- sizeof(" read local,") - 1,
- sizeof(" read,") - 1,
- sizeof(" low_priority write,") - 1,
- sizeof(" write,") - 1
-};
-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"
-};
-
-int spider_mysql_init()
-{
- DBUG_ENTER("spider_mysql_init");
- DBUG_RETURN(0);
-}
-
-int spider_mysql_deinit()
-{
- DBUG_ENTER("spider_mysql_deinit");
- DBUG_RETURN(0);
-}
-
-spider_db_share *spider_mysql_create_share(
- SPIDER_SHARE *share
-) {
- DBUG_ENTER("spider_mysql_create_share");
- DBUG_RETURN(new spider_mysql_share(share));
-}
-
-spider_db_handler *spider_mysql_create_handler(
- ha_spider *spider,
- spider_db_share *db_share
-) {
- DBUG_ENTER("spider_mysql_create_handler");
- DBUG_RETURN(new spider_mysql_handler(spider,
- (spider_mysql_share *) db_share));
-}
-
-spider_db_copy_table *spider_mysql_create_copy_table(
- spider_db_share *db_share
-) {
- DBUG_ENTER("spider_mysql_create_copy_table");
- DBUG_RETURN(new spider_mysql_copy_table(
- (spider_mysql_share *) db_share));
-}
-
-SPIDER_DB_CONN *spider_mysql_create_conn(
- SPIDER_CONN *conn
-) {
- DBUG_ENTER("spider_mysql_create_conn");
- DBUG_RETURN(new spider_db_mysql(conn));
-}
-
-spider_db_mysql_util spider_db_mysql_utility;
-
-SPIDER_DBTON spider_dbton_mysql = {
- 0,
- SPIDER_DB_WRAPPER_MYSQL,
- SPIDER_DB_ACCESS_TYPE_SQL,
- spider_mysql_init,
- spider_mysql_deinit,
- spider_mysql_create_share,
- spider_mysql_create_handler,
- spider_mysql_create_copy_table,
- spider_mysql_create_conn,
- &spider_db_mysql_utility
-};
-
-spider_db_mysql_row::spider_db_mysql_row() :
- spider_db_row(spider_dbton_mysql.dbton_id),
- row(NULL), lengths(NULL), cloned(FALSE)
-{
- DBUG_ENTER("spider_db_mysql_row::spider_db_mysql_row");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_mysql_row::~spider_db_mysql_row()
-{
- DBUG_ENTER("spider_db_mysql_row::~spider_db_mysql_row");
- DBUG_PRINT("info",("spider this=%p", this));
- if (cloned)
- {
- spider_free(spider_current_trx, row_first, MYF(0));
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_mysql_row::store_to_field(
- Field *field,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_mysql_row::store_to_field");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!*row)
- {
- DBUG_PRINT("info", ("spider field is null"));
- field->set_null();
- field->reset();
- } else {
- field->set_notnull();
- if (field->flags & BLOB_FLAG)
- {
- DBUG_PRINT("info", ("spider blob field"));
- if (
- field->charset() == &my_charset_bin ||
- field->charset()->cset == access_charset->cset
- )
- ((Field_blob *)field)->set_ptr(*lengths, (uchar *) *row);
- else {
- DBUG_PRINT("info", ("spider blob convert"));
- if (field->table->file->ht == spider_hton_ptr)
- {
- ha_spider *spider = (ha_spider *) field->table->file;
- spider_string *str = &spider->blob_buff[field->field_index];
- str->length(0);
- if (str->append(*row, *lengths, access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- ((Field_blob *)field)->set_ptr(str->length(), (uchar *) str->ptr());
- } else {
- field->store(*row, *lengths, access_charset);
- }
- }
- } else
- field->store(*row, *lengths, access_charset);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_row::append_to_str(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_mysql_row::append_to_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(*lengths))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(*row, *lengths);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_row::append_escaped_to_str(
- spider_string *str,
- uint dbton_id
-) {
- DBUG_ENTER("spider_db_mysql_row::append_escaped_to_str");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_string tmp_str(*row, *lengths + 1, str->charset());
- tmp_str.init_calc_mem(133);
- tmp_str.length(*lengths);
- if (str->reserve(*lengths * 2 + 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- spider_dbton[dbton_id].db_util->append_escaped_util(str, tmp_str.get_str());
- DBUG_RETURN(0);
-}
-
-void spider_db_mysql_row::first()
-{
- DBUG_ENTER("spider_db_mysql_row::first");
- DBUG_PRINT("info",("spider this=%p", this));
- row = row_first;
- lengths = lengths_first;
- DBUG_VOID_RETURN;
-}
-
-void spider_db_mysql_row::next()
-{
- DBUG_ENTER("spider_db_mysql_row::next");
- DBUG_PRINT("info",("spider this=%p", this));
- row++;
- lengths++;
- DBUG_VOID_RETURN;
-}
-
-bool spider_db_mysql_row::is_null()
-{
- DBUG_ENTER("spider_db_mysql_row::is_null");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(!(*row));
-}
-
-int spider_db_mysql_row::val_int()
-{
- DBUG_ENTER("spider_db_mysql_row::val_int");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(*row ? atoi(*row) : 0);
-}
-
-double spider_db_mysql_row::val_real()
-{
- DBUG_ENTER("spider_db_mysql_row::val_real");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(*row ? my_atof(*row) : 0.0);
-}
-
-my_decimal *spider_db_mysql_row::val_decimal(
- my_decimal *decimal_value,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_mysql_row::val_decimal");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!*row)
- DBUG_RETURN(NULL);
-
-#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
- decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
- decimal_value), "", "");
-#else
- decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
- decimal_value));
-#endif
-
- DBUG_RETURN(decimal_value);
-}
-
-SPIDER_DB_ROW *spider_db_mysql_row::clone()
-{
- spider_db_mysql_row *clone_row;
- char *tmp_char;
- MYSQL_ROW tmp_row = row_first, ctmp_row;
- ulong *tmp_lengths = lengths_first;
- uint row_size, i;
- DBUG_ENTER("spider_db_mysql_row::clone");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(clone_row = new spider_db_mysql_row()))
- {
- DBUG_RETURN(NULL);
- }
- row_size = field_count;
- for (i = 0; i < field_count; i++)
- {
- row_size += *tmp_lengths;
- tmp_lengths++;
- }
- if (!spider_bulk_malloc(spider_current_trx, 29, MYF(MY_WME),
- &clone_row->row, sizeof(char*) * field_count,
- &tmp_char, row_size,
- &clone_row->lengths, sizeof(ulong) * field_count,
- NullS)
- ) {
- delete clone_row;
- DBUG_RETURN(NULL);
- }
- memcpy(clone_row->lengths, lengths_first, sizeof(ulong) * field_count);
- tmp_lengths = lengths_first;
- ctmp_row = clone_row->row;
- for (i = 0; i < field_count; i++)
- {
- DBUG_PRINT("info",("spider *lengths=%lu", *tmp_lengths));
- if (*tmp_row == NULL)
- {
- *ctmp_row = NULL;
- *tmp_char = 0;
- tmp_char++;
- } else {
- *ctmp_row = tmp_char;
- memcpy(tmp_char, *tmp_row, *tmp_lengths + 1);
- tmp_char += *tmp_lengths + 1;
- }
- ctmp_row++;
- tmp_lengths++;
- tmp_row++;
- }
- clone_row->field_count = field_count;
- clone_row->row_first = clone_row->row;
- clone_row->lengths_first = clone_row->lengths;
- clone_row->cloned = TRUE;
- DBUG_RETURN((SPIDER_DB_ROW *) clone_row);
-}
-
-int spider_db_mysql_row::store_to_tmp_table(
- TABLE *tmp_table,
- spider_string *str
-) {
- uint i;
- MYSQL_ROW tmp_row = row;
- ulong *tmp_lengths = lengths;
- DBUG_ENTER("spider_db_mysql_row::store_to_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- for (i = 0; i < field_count; i++)
- {
- if (*tmp_row)
- {
- if (str->reserve(*tmp_lengths + 1))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(*tmp_row, *tmp_lengths + 1);
- }
- tmp_lengths++;
- tmp_row++;
- }
- tmp_table->field[0]->set_notnull();
- tmp_table->field[0]->store(
- (const char *) lengths,
- sizeof(ulong) * 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_notnull();
- tmp_table->field[2]->store(
- (char *) row, (uint) (sizeof(char *) * field_count), &my_charset_bin);
- DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
-}
-
-spider_db_mysql_result::spider_db_mysql_result() :
- spider_db_result(spider_dbton_mysql.dbton_id),
- db_result(NULL)
-{
- DBUG_ENTER("spider_db_mysql_result::spider_db_mysql_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_mysql_result::~spider_db_mysql_result()
-{
- DBUG_ENTER("spider_db_mysql_result::~spider_db_mysql_result");
- DBUG_PRINT("info",("spider this=%p", this));
- if (db_result)
- {
- free_result();
- }
- DBUG_VOID_RETURN;
-}
-
-bool spider_db_mysql_result::has_result()
-{
- DBUG_ENTER("spider_db_mysql_result::has_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(db_result);
-}
-
-void spider_db_mysql_result::free_result()
-{
- DBUG_ENTER("spider_db_mysql_result::free_result");
- DBUG_PRINT("info",("spider this=%p", this));
- /* need 2 times execution design */
- if (db_result)
- {
- mysql_free_result(db_result);
- db_result = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-SPIDER_DB_ROW *spider_db_mysql_result::current_row()
-{
- DBUG_ENTER("spider_db_mysql_result::current_row");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
-}
-
-SPIDER_DB_ROW *spider_db_mysql_result::fetch_row()
-{
- DBUG_ENTER("spider_db_mysql_result::fetch_row");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(row.row = mysql_fetch_row(db_result)))
- {
- store_error_num = HA_ERR_END_OF_FILE;
- DBUG_RETURN(NULL);
- }
- row.lengths = mysql_fetch_lengths(db_result);
- row.field_count = mysql_num_fields(db_result);
- row.row_first = row.row;
- row.lengths_first = row.lengths;
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-SPIDER_DB_ROW *spider_db_mysql_result::fetch_row_from_result_buffer(
- spider_db_result_buffer *spider_res_buf
-) {
- DBUG_ENTER("spider_db_mysql_result::fetch_row_from_result_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(row.row = mysql_fetch_row(db_result)))
- {
- store_error_num = HA_ERR_END_OF_FILE;
- DBUG_RETURN(NULL);
- }
- row.lengths = mysql_fetch_lengths(db_result);
- row.field_count = mysql_num_fields(db_result);
- row.row_first = row.row;
- row.lengths_first = row.lengths;
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-SPIDER_DB_ROW *spider_db_mysql_result::fetch_row_from_tmp_table(
- TABLE *tmp_table
-) {
- uint i;
- spider_string tmp_str1, tmp_str2, tmp_str3;
- const char *row_ptr;
- MYSQL_ROW tmp_row;
- ulong *tmp_lengths;
- uint field_count;
- DBUG_ENTER("spider_db_mysql_result::fetch_row_from_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_str1.init_calc_mem(117);
- tmp_str2.init_calc_mem(118);
- tmp_str3.init_calc_mem(170);
- tmp_table->field[0]->val_str(tmp_str1.get_str());
- tmp_table->field[1]->val_str(tmp_str2.get_str());
- tmp_table->field[2]->val_str(tmp_str3.get_str());
- tmp_str1.mem_calc();
- tmp_str2.mem_calc();
- tmp_str3.mem_calc();
- row_ptr = tmp_str2.ptr();
- tmp_lengths = (ulong *) tmp_str1.ptr();
- tmp_row = (MYSQL_ROW) tmp_str3.ptr();
- field_count = tmp_str1.length() / sizeof(ulong);
- row.row = tmp_row;
- row.lengths = tmp_lengths;
- row.field_count = field_count;
- row.row_first = row.row;
- row.lengths_first = row.lengths;
- for (i = 0; i < field_count; i++)
- {
- if (*tmp_row)
- {
- *tmp_row = (char *) row_ptr;
- row_ptr += *tmp_lengths + 1;
- }
- tmp_row++;
- tmp_lengths++;
- }
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-int spider_db_mysql_result::fetch_table_status(
- int mode,
- ha_rows &records,
- ulong &mean_rec_length,
- ulonglong &data_file_length,
- ulonglong &max_data_file_length,
- ulonglong &index_file_length,
- ulonglong &auto_increment_value,
- time_t &create_time,
- time_t &update_time,
- time_t &check_time
-) {
- int error_num;
- MYSQL_ROW mysql_row;
- MYSQL_TIME mysql_time;
-#ifdef MARIADB_BASE_VERSION
- uint not_used_uint;
-#else
- my_bool not_used_my_bool;
-#endif
-#ifdef SPIDER_HAS_TIME_STATUS
- MYSQL_TIME_STATUS time_status;
-#else
- int time_status;
-#endif
- long not_used_long;
- DBUG_ENTER("spider_db_mysql_result::fetch_table_status");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(mysql_row = mysql_fetch_row(db_result)))
- {
- DBUG_PRINT("info",("spider fetch row is null"));
- DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
- }
- if (mode == 1)
- {
- if (num_fields() != 18)
- {
- DBUG_PRINT("info",("spider field_count != 18"));
- DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
- }
-
- if (mysql_row[4])
- records =
- (ha_rows) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
- else
- records = (ha_rows) 0;
- DBUG_PRINT("info",
- ("spider records=%lld", records));
- if (mysql_row[5])
- mean_rec_length =
- (ulong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
- else
- mean_rec_length = 0;
- DBUG_PRINT("info",
- ("spider mean_rec_length=%lu", mean_rec_length));
- if (mysql_row[6])
- data_file_length =
- (ulonglong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num);
- else
- data_file_length = 0;
- DBUG_PRINT("info",
- ("spider data_file_length=%lld", data_file_length));
- if (mysql_row[7])
- max_data_file_length =
- (ulonglong) my_strtoll10(mysql_row[7], (char**) NULL, &error_num);
- else
- max_data_file_length = 0;
- DBUG_PRINT("info",
- ("spider max_data_file_length=%lld", max_data_file_length));
- if (mysql_row[8])
- index_file_length =
- (ulonglong) my_strtoll10(mysql_row[8], (char**) NULL, &error_num);
- else
- index_file_length = 0;
- DBUG_PRINT("info",
- ("spider index_file_length=%lld", index_file_length));
- if (mysql_row[10])
- auto_increment_value =
- (ulonglong) my_strtoll10(mysql_row[10], (char**) NULL, &error_num);
- else
- auto_increment_value = 1;
- DBUG_PRINT("info",
- ("spider auto_increment_value=%lld", auto_increment_value));
- if (mysql_row[11])
- {
-#ifdef SPIDER_HAS_TIME_STATUS
- my_time_status_init(&time_status);
-#endif
- str_to_datetime(mysql_row[11], strlen(mysql_row[11]), &mysql_time, 0,
- &time_status);
-#ifdef MARIADB_BASE_VERSION
- create_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_uint);
-#else
- create_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_my_bool);
-#endif
- } else
- create_time = (time_t) 0;
-#ifndef DBUG_OFF
- {
- struct tm *ts, tmp_ts;
- char buf[80];
- ts = localtime_r(&create_time, &tmp_ts);
- strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
- DBUG_PRINT("info",("spider create_time=%s", buf));
- }
-#endif
- if (mysql_row[12])
- {
-#ifdef SPIDER_HAS_TIME_STATUS
- my_time_status_init(&time_status);
-#endif
- str_to_datetime(mysql_row[12], strlen(mysql_row[12]), &mysql_time, 0,
- &time_status);
-#ifdef MARIADB_BASE_VERSION
- update_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_uint);
-#else
- update_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_my_bool);
-#endif
- } else
- update_time = (time_t) 0;
-#ifndef DBUG_OFF
- {
- struct tm *ts, tmp_ts;
- char buf[80];
- ts = localtime_r(&update_time, &tmp_ts);
- strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
- DBUG_PRINT("info",("spider update_time=%s", buf));
- }
-#endif
- if (mysql_row[13])
- {
-#ifdef SPIDER_HAS_TIME_STATUS
- my_time_status_init(&time_status);
-#endif
- str_to_datetime(mysql_row[13], strlen(mysql_row[13]), &mysql_time, 0,
- &time_status);
-#ifdef MARIADB_BASE_VERSION
- check_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_uint);
-#else
- check_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_my_bool);
-#endif
- } else
- check_time = (time_t) 0;
-#ifndef DBUG_OFF
- {
- struct tm *ts, tmp_ts;
- char buf[80];
- ts = localtime_r(&check_time, &tmp_ts);
- strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
- DBUG_PRINT("info",("spider check_time=%s", buf));
- }
-#endif
- } else {
- if (mysql_row[0])
- records =
- (ha_rows) my_strtoll10(mysql_row[0], (char**) NULL, &error_num);
- else
- records = (ha_rows) 0;
- DBUG_PRINT("info",
- ("spider records=%lld", records));
- if (mysql_row[1])
- mean_rec_length =
- (ulong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num);
- else
- mean_rec_length = 0;
- DBUG_PRINT("info",
- ("spider mean_rec_length=%lu", mean_rec_length));
- if (mysql_row[2])
- data_file_length =
- (ulonglong) my_strtoll10(mysql_row[2], (char**) NULL, &error_num);
- else
- data_file_length = 0;
- DBUG_PRINT("info",
- ("spider data_file_length=%lld", data_file_length));
- if (mysql_row[3])
- max_data_file_length =
- (ulonglong) my_strtoll10(mysql_row[3], (char**) NULL, &error_num);
- else
- max_data_file_length = 0;
- DBUG_PRINT("info",
- ("spider max_data_file_length=%lld", max_data_file_length));
- if (mysql_row[4])
- index_file_length =
- (ulonglong) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
- else
- index_file_length = 0;
- DBUG_PRINT("info",
- ("spider index_file_length=%lld", index_file_length));
- if (mysql_row[5])
- auto_increment_value =
- (ulonglong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
- else
- auto_increment_value = 1;
- DBUG_PRINT("info",
- ("spider auto_increment_value=%lld", auto_increment_value));
- if (mysql_row[6])
- {
-#ifdef SPIDER_HAS_TIME_STATUS
- my_time_status_init(&time_status);
-#endif
- str_to_datetime(mysql_row[6], strlen(mysql_row[6]), &mysql_time, 0,
- &time_status);
-#ifdef MARIADB_BASE_VERSION
- create_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_uint);
-#else
- create_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_my_bool);
-#endif
- } else
- create_time = (time_t) 0;
-#ifndef DBUG_OFF
- {
- struct tm *ts, tmp_ts;
- char buf[80];
- ts = localtime_r(&create_time, &tmp_ts);
- strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
- DBUG_PRINT("info",("spider create_time=%s", buf));
- }
-#endif
- if (mysql_row[7])
- {
-#ifdef SPIDER_HAS_TIME_STATUS
- my_time_status_init(&time_status);
-#endif
- str_to_datetime(mysql_row[7], strlen(mysql_row[7]), &mysql_time, 0,
- &time_status);
-#ifdef MARIADB_BASE_VERSION
- update_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_uint);
-#else
- update_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_my_bool);
-#endif
- } else
- update_time = (time_t) 0;
-#ifndef DBUG_OFF
- {
- struct tm *ts, tmp_ts;
- char buf[80];
- ts = localtime_r(&update_time, &tmp_ts);
- strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
- DBUG_PRINT("info",("spider update_time=%s", buf));
- }
-#endif
- if (mysql_row[8])
- {
-#ifdef SPIDER_HAS_TIME_STATUS
- my_time_status_init(&time_status);
-#endif
- str_to_datetime(mysql_row[8], strlen(mysql_row[8]), &mysql_time, 0,
- &time_status);
-#ifdef MARIADB_BASE_VERSION
- check_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_uint);
-#else
- check_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_my_bool);
-#endif
- } else
- check_time = (time_t) 0;
-#ifndef DBUG_OFF
- {
- struct tm *ts, tmp_ts;
- char buf[80];
- ts = localtime_r(&check_time, &tmp_ts);
- strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
- DBUG_PRINT("info",("spider check_time=%s", buf));
- }
-#endif
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_result::fetch_table_records(
- int mode,
- ha_rows &records
-) {
- int error_num;
- MYSQL_ROW mysql_row;
- DBUG_ENTER("spider_db_mysql_result::fetch_table_records");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(mysql_row = mysql_fetch_row(db_result)))
- {
- DBUG_PRINT("info",("spider fetch row is null"));
- DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
- }
- if (mode == 1)
- {
- if (mysql_row[0])
- {
- records =
- (ha_rows) my_strtoll10(mysql_row[0], (char**) NULL, &error_num);
- } else
- records = (ha_rows) 0;
- DBUG_PRINT("info",
- ("spider records=%lld", records));
- } else {
- if (num_fields() != 10)
- {
- DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
- }
-
- if (mysql_row[8])
- {
- records =
- (ha_rows) my_strtoll10(mysql_row[8], (char**) NULL, &error_num);
- } else
- records = 0;
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_result::fetch_table_cardinality(
- int mode,
- TABLE *table,
- longlong *cardinality,
- uchar *cardinality_upd,
- int bitmap_size
-) {
- int error_num;
- MYSQL_ROW mysql_row;
- Field *field;
- DBUG_ENTER("spider_db_mysql_result::fetch_table_cardinality");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(mysql_row = mysql_fetch_row(db_result)))
- {
- DBUG_PRINT("info",("spider fetch row is null"));
- /* no index */
- DBUG_RETURN(0);
- }
- memset((uchar *) cardinality_upd, 0, sizeof(uchar) * bitmap_size);
- if (mode == 1)
- {
- uint num_fields = this->num_fields();
- if (num_fields < 12 || num_fields > 13)
- {
- DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 13"));
- DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
- }
-
- while (mysql_row)
- {
- if (
- mysql_row[4] &&
- mysql_row[6] &&
- (field = find_field_in_table_sef(table, mysql_row[4]))
- ) {
- if ((cardinality[field->field_index] =
- (longlong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num))
- <= 0)
- cardinality[field->field_index] = 1;
- spider_set_bit(cardinality_upd, field->field_index);
- DBUG_PRINT("info",
- ("spider col_name=%s", mysql_row[4]));
- DBUG_PRINT("info",
- ("spider cardinality=%lld",
- cardinality[field->field_index]));
- } else if (mysql_row[4])
- {
- DBUG_PRINT("info",
- ("spider skip col_name=%s", mysql_row[4]));
- } else {
- DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
- }
- mysql_row = mysql_fetch_row(db_result);
- }
- } else {
- while (mysql_row)
- {
- if (
- mysql_row[0] &&
- mysql_row[1] &&
- (field = find_field_in_table_sef(table, mysql_row[0]))
- ) {
- if ((cardinality[field->field_index] =
- (longlong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num))
- <= 0)
- cardinality[field->field_index] = 1;
- spider_set_bit(cardinality_upd, field->field_index);
- DBUG_PRINT("info",
- ("spider col_name=%s", mysql_row[0]));
- DBUG_PRINT("info",
- ("spider cardinality=%lld",
- cardinality[field->field_index]));
- } else if (mysql_row[0])
- {
- DBUG_PRINT("info",
- ("spider skip col_name=%s", mysql_row[0]));
- } else {
- DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
- }
- mysql_row = mysql_fetch_row(db_result);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_result::fetch_table_mon_status(
- int &status
-) {
- MYSQL_ROW mysql_row;
- DBUG_ENTER("spider_db_mysql_result::fetch_table_mon_status");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(mysql_row = mysql_fetch_row(db_result)))
- {
- DBUG_PRINT("info",("spider fetch row is null"));
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (num_fields() != 1)
- {
- DBUG_PRINT("info",("spider num_fields != 1"));
- my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
- DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
- }
- if (mysql_row[0])
- status = atoi(mysql_row[0]);
- else
- status = SPIDER_LINK_MON_OK;
- DBUG_PRINT("info", ("spider status=%d", status));
- DBUG_RETURN(0);
-}
-
-longlong spider_db_mysql_result::num_rows()
-{
- DBUG_ENTER("spider_db_mysql_result::num_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((longlong) mysql_num_rows(db_result));
-}
-
-uint spider_db_mysql_result::num_fields()
-{
- DBUG_ENTER("spider_db_mysql_result::num_fields");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(mysql_num_fields(db_result));
-}
-
-void spider_db_mysql_result::move_to_pos(
- longlong pos
-) {
- DBUG_ENTER("spider_db_mysql_result::move_to_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider pos=%lld", pos));
-/*
- DBUG_ASSERT(first_row);
-*/
- db_result->data_cursor = first_row + pos;
- DBUG_VOID_RETURN;
-}
-
-int spider_db_mysql_result::get_errno()
-{
- DBUG_ENTER("spider_db_mysql_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_mysql_result::fetch_columns_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
-) {
- MYSQL_ROW mysql_row;
- DBUG_ENTER("spider_db_mysql_result::fetch_columns_for_discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(mysql_row = mysql_fetch_row(db_result)))
- {
- DBUG_PRINT("info",("spider fetch row is null"));
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (num_fields() != 6)
- {
- DBUG_PRINT("info",("spider num_fields != 6"));
- my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
- DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
- }
- do {
- 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);
- if (str->append(mysql_row[0], strlen(mysql_row[0]), access_charset))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_SPACE_LEN))
- {
- 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_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (!strcmp(mysql_row[2], "NO"))
- {
- if (str->reserve(SPIDER_SQL_NOT_NULL_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NOT_NULL_STR, SPIDER_SQL_NOT_NULL_LEN);
- if (mysql_row[4])
- {
- if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- }
- } else {
- if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
- if (mysql_row[4])
- {
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_NULL_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- }
- }
- 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);
- } while ((mysql_row = mysql_fetch_row(db_result)));
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_result::fetch_index_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
-) {
- MYSQL_ROW mysql_row;
- DBUG_ENTER("spider_db_mysql_result::fetch_index_for_discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(mysql_row = mysql_fetch_row(db_result)))
- {
- DBUG_PRINT("info",("spider fetch row is null"));
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (num_fields() != 13)
- {
- DBUG_PRINT("info",("spider num_fields != 13"));
- my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
- DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
- }
- bool first = TRUE;
- do {
- if (!strcmp(mysql_row[3], "1"))
- {
- if (first)
- {
- first = FALSE;
- } else {
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- /* new index */
- if (!strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
- {
- /* primary key */
- if (str->reserve(SPIDER_DB_PK_NAME_LEN + SPIDER_SQL_SPACE_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_DB_PK_NAME_STR, SPIDER_DB_PK_NAME_LEN);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- } else if (!strcmp(mysql_row[1], "0"))
- {
- /* unique key */
- if (str->reserve(SPIDER_DB_UNIQUE_NAME_LEN + SPIDER_SQL_SPACE_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_DB_UNIQUE_NAME_STR, SPIDER_DB_UNIQUE_NAME_LEN);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- }
- if (str->reserve(SPIDER_DB_KEY_NAME_LEN + SPIDER_SQL_SPACE_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_DB_KEY_NAME_STR, SPIDER_DB_KEY_NAME_LEN);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- if (strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
- {
- 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);
- if (str->append(mysql_row[2], strlen(mysql_row[2]), access_charset))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- 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);
- }
- 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);
- 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);
- if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- 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);
- if (mysql_row[7])
- {
- 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);
- if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- 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);
- }
- } else {
- if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_NAME_QUOTE_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- 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);
- if (mysql_row[7])
- {
- 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);
- if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- 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);
- }
- }
- } while ((mysql_row = mysql_fetch_row(db_result)));
- if (!first)
- {
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- DBUG_RETURN(0);
-}
-#endif
-
-spider_db_mysql::spider_db_mysql(
- SPIDER_CONN *conn
-) : spider_db_conn(conn), lock_table_hash_inited(FALSE),
- handler_open_array_inited(FALSE)
-{
- DBUG_ENTER("spider_db_mysql::spider_db_mysql");
- DBUG_PRINT("info",("spider this=%p", this));
- db_conn = NULL;
- DBUG_VOID_RETURN;
-}
-
-spider_db_mysql::~spider_db_mysql()
-{
- DBUG_ENTER("spider_db_mysql::~spider_db_mysql");
- 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);
- }
- if (lock_table_hash_inited)
- {
- spider_free_mem_calc(spider_current_trx,
- lock_table_hash_id,
- lock_table_hash.array.max_element *
- lock_table_hash.array.size_of_element);
- my_hash_free(&lock_table_hash);
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_mysql::init()
-{
- DBUG_ENTER("spider_db_mysql::init");
- DBUG_PRINT("info",("spider this=%p", this));
- if (
- my_hash_init(&lock_table_hash, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_link_get_key, 0, 0)
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- spider_alloc_calc_mem_init(lock_table_hash, 140);
- spider_alloc_calc_mem(spider_current_trx,
- lock_table_hash,
- lock_table_hash.array.max_element *
- lock_table_hash.array.size_of_element);
- lock_table_hash_inited = TRUE;
-
- 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, 162);
- 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_mysql::is_connected()
-{
- DBUG_ENTER("spider_db_mysql::is_connected");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(db_conn);
-}
-
-void spider_db_mysql::bg_connect()
-{
- DBUG_ENTER("spider_db_mysql::bg_connect");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-int spider_db_mysql::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
-) {
- int error_num;
- my_bool connect_mutex = spider_param_connect_mutex();
- DBUG_ENTER("spider_db_mysql::connect");
- DBUG_PRINT("info",("spider this=%p", this));
- while (TRUE)
- {
- if (!db_conn)
- {
- if (!(db_conn = mysql_init(NULL)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- mysql_options(db_conn, MYSQL_OPT_READ_TIMEOUT,
- &conn->net_read_timeout);
- mysql_options(db_conn, MYSQL_OPT_WRITE_TIMEOUT,
- &conn->net_write_timeout);
- mysql_options(db_conn, MYSQL_OPT_CONNECT_TIMEOUT,
- &conn->connect_timeout);
- mysql_options(db_conn, MYSQL_OPT_USE_REMOTE_CONNECTION,
- NULL);
-
- if (
- conn->tgt_ssl_ca_length |
- conn->tgt_ssl_capath_length |
- conn->tgt_ssl_cert_length |
- conn->tgt_ssl_key_length
- ) {
- mysql_ssl_set(db_conn, conn->tgt_ssl_key, conn->tgt_ssl_cert,
- conn->tgt_ssl_ca, conn->tgt_ssl_capath, conn->tgt_ssl_cipher);
- if (conn->tgt_ssl_vsc)
- {
- my_bool verify_flg = TRUE;
- mysql_options(db_conn, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
- &verify_flg);
- }
- }
-
- if (conn->tgt_default_file)
- {
- DBUG_PRINT("info",("spider tgt_default_file=%s",
- conn->tgt_default_file));
- mysql_options(db_conn, MYSQL_READ_DEFAULT_FILE,
- conn->tgt_default_file);
- }
- if (conn->tgt_default_group)
- {
- DBUG_PRINT("info",("spider tgt_default_group=%s",
- conn->tgt_default_group));
- mysql_options(db_conn, MYSQL_READ_DEFAULT_GROUP,
- conn->tgt_default_group);
- }
-
- if (connect_mutex)
- pthread_mutex_lock(&spider_open_conn_mutex);
- /* tgt_db not use */
- if (!mysql_real_connect(
- db_conn,
- tgt_host,
- tgt_username,
- tgt_password,
- NULL,
- tgt_port,
- tgt_socket,
- CLIENT_MULTI_STATEMENTS
- )) {
- if (connect_mutex)
- pthread_mutex_unlock(&spider_open_conn_mutex);
- error_num = mysql_errno(db_conn);
- disconnect();
- if (
- (
- error_num != CR_CONN_HOST_ERROR &&
- error_num != CR_CONNECTION_ERROR
- ) ||
- !connect_retry_count
- ) {
- *conn->need_mon = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
- my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
- server_name ? server_name : tgt_host);
- DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
- }
- connect_retry_count--;
- my_sleep((ulong) connect_retry_interval);
- } else {
- if (connect_mutex)
- pthread_mutex_unlock(&spider_open_conn_mutex);
- break;
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::ping(
-) {
- DBUG_ENTER("spider_db_mysql::ping");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(simple_command(db_conn, COM_PING, 0, 0, 0));
-}
-
-void spider_db_mysql::bg_disconnect()
-{
- DBUG_ENTER("spider_db_mysql::bg_disconnect");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-void spider_db_mysql::disconnect()
-{
- DBUG_ENTER("spider_db_mysql::disconnect");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider db_conn=%p", db_conn));
- if (db_conn)
- {
- mysql_close(db_conn);
- db_conn = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_mysql::set_net_timeout()
-{
- DBUG_ENTER("spider_db_mysql::set_net_timeout");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider conn=%p", conn));
- my_net_set_read_timeout(&db_conn->net, conn->net_read_timeout);
- my_net_set_write_timeout(&db_conn->net, conn->net_write_timeout);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::exec_query(
- const char *query,
- uint length,
- int quick_mode
-) {
- int error_num;
- DBUG_ENTER("spider_db_mysql::exec_query");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider_param_general_log())
- {
- const char *tgt_str = conn->tgt_host;
- uint32 tgt_len = conn->tgt_host_length;
- spider_string tmp_query_str(length + conn->tgt_wrapper_length +
- tgt_len + (SPIDER_SQL_SPACE_LEN * 2));
- tmp_query_str.init_calc_mem(230);
- 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(query, length);
- general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
- tmp_query_str.length());
- }
- error_num = mysql_real_query(db_conn, query, length);
- if (spider_param_log_result_errors() >= 2 && db_conn->warning_count > 0)
- {
- time_t cur_time = (time_t) time((time_t*) 0);
- struct tm lt;
- struct tm *l_time = localtime_r(&cur_time, &lt);
- fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
- "from [%s] %ld to %ld: "
- "affected_rows: %llu id: %llu status: %u warning_count: %u\n",
- l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
- l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- conn->tgt_host, db_conn->thread_id, current_thd->thread_id,
- db_conn->affected_rows, db_conn->insert_id,
- db_conn->server_status, db_conn->warning_count);
- } else if (spider_param_log_result_errors() >= 4)
- {
- time_t cur_time = (time_t) time((time_t*) 0);
- struct tm lt;
- struct tm *l_time = localtime_r(&cur_time, &lt);
- fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [INFO SPIDER RESULT] "
- "from [%s] %ld to %ld: "
- "affected_rows: %llu id: %llu status: %u warning_count: %u\n",
- l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
- l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- conn->tgt_host, db_conn->thread_id, current_thd->thread_id,
- db_conn->affected_rows, db_conn->insert_id,
- db_conn->server_status, db_conn->warning_count);
- }
- DBUG_RETURN(error_num);
-}
-
-int spider_db_mysql::get_errno()
-{
- DBUG_ENTER("spider_db_mysql::get_errno");
- DBUG_PRINT("info",("spider this=%p", this));
- stored_error = mysql_errno(db_conn);
- DBUG_PRINT("info",("spider stored_error=%d", stored_error));
- DBUG_RETURN(stored_error);
-}
-
-const char *spider_db_mysql::get_error()
-{
- const char *error_ptr;
- DBUG_ENTER("spider_db_mysql::get_error");
- DBUG_PRINT("info",("spider this=%p", this));
- error_ptr = mysql_error(db_conn);
- DBUG_PRINT("info",("spider error=%s", error_ptr));
- DBUG_RETURN(error_ptr);
-}
-
-bool spider_db_mysql::is_server_gone_error(
- int error_num
-) {
- bool server_gone;
- DBUG_ENTER("spider_db_mysql::is_server_gone_error");
- DBUG_PRINT("info",("spider this=%p", this));
- server_gone =
- (error_num == CR_SERVER_GONE_ERROR || error_num == CR_SERVER_LOST);
- DBUG_PRINT("info",("spider server_gone=%s", server_gone ? "TRUE" : "FALSE"));
- DBUG_RETURN(server_gone);
-}
-
-bool spider_db_mysql::is_dup_entry_error(
- int error_num
-) {
- bool dup_entry;
- DBUG_ENTER("spider_db_mysql::is_dup_entry_error");
- DBUG_PRINT("info",("spider this=%p", this));
- dup_entry =
- (
- error_num == ER_DUP_ENTRY ||
- error_num == ER_DUP_KEY ||
- error_num == HA_ERR_FOUND_DUPP_KEY
- );
- DBUG_PRINT("info",("spider dup_entry=%s", dup_entry ? "TRUE" : "FALSE"));
- DBUG_RETURN(dup_entry);
-}
-
-bool spider_db_mysql::is_xa_nota_error(
- int error_num
-) {
- bool xa_nota;
- DBUG_ENTER("spider_db_mysql::is_xa_nota_error");
- DBUG_PRINT("info",("spider this=%p", this));
- xa_nota =
- (
- error_num == ER_XAER_NOTA ||
- error_num == ER_XA_RBTIMEOUT ||
- error_num == ER_XA_RBDEADLOCK
- );
- DBUG_PRINT("info",("spider xa_nota=%s", xa_nota ? "TRUE" : "FALSE"));
- DBUG_RETURN(xa_nota);
-}
-
-spider_db_result *spider_db_mysql::store_result(
- spider_db_result_buffer **spider_res_buf,
- st_spider_db_request_key *request_key,
- int *error_num
-) {
- spider_db_mysql_result *result;
- DBUG_ENTER("spider_db_mysql::store_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(!spider_res_buf);
- if ((result = new spider_db_mysql_result()))
- {
- *error_num = 0;
- if (!(result->db_result = mysql_store_result(db_conn)))
- {
- delete result;
- result = NULL;
- } else {
- result->first_row = result->db_result->data_cursor;
- DBUG_PRINT("info",("spider result->first_row=%p", result->first_row));
- }
- } else {
- *error_num = HA_ERR_OUT_OF_MEM;
- }
- DBUG_RETURN(result);
-}
-
-spider_db_result *spider_db_mysql::use_result(
- st_spider_db_request_key *request_key,
- int *error_num
-) {
- spider_db_mysql_result *result;
- DBUG_ENTER("spider_db_mysql::use_result");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((result = new spider_db_mysql_result()))
- {
- *error_num = 0;
- if (!(result->db_result = db_conn->methods->use_result(db_conn)))
- {
- delete result;
- result = NULL;
- } else {
- result->first_row = NULL;
- }
- } else {
- *error_num = HA_ERR_OUT_OF_MEM;
- }
- DBUG_RETURN(result);
-}
-
-int spider_db_mysql::next_result()
-{
- int status;
- DBUG_ENTER("spider_db_mysql::next_result");
- DBUG_PRINT("info",("spider this=%p", this));
- if (db_conn->status != MYSQL_STATUS_READY)
- {
- my_message(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
- DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
- }
-
- db_conn->net.last_errno = 0;
- db_conn->net.last_error[0] = '\0';
- strmov(db_conn->net.sqlstate, "00000");
- db_conn->affected_rows = ~(my_ulonglong) 0;
-
-#if MYSQL_VERSION_ID < 50500
- if (db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS)
-#else
- if (db_conn->server_status & SERVER_MORE_RESULTS_EXISTS)
-#endif
- {
- if ((status = db_conn->methods->read_query_result(db_conn)) > 0)
- DBUG_RETURN(spider_db_errorno(conn));
- DBUG_RETURN(status);
- }
- DBUG_RETURN(-1);
-}
-
-uint spider_db_mysql::affected_rows()
-{
- MYSQL *last_used_con;
- DBUG_ENTER("spider_db_mysql::affected_rows");
- DBUG_PRINT("info",("spider this=%p", this));
-#if MYSQL_VERSION_ID < 50500
- last_used_con = db_conn->last_used_con;
-#else
- last_used_con = db_conn;
-#endif
- DBUG_RETURN((uint) last_used_con->affected_rows);
-}
-
-ulonglong spider_db_mysql::last_insert_id()
-{
- MYSQL *last_used_con;
- DBUG_ENTER("spider_db_mysql::last_insert_id");
- DBUG_PRINT("info",("spider this=%p", this));
-#if MYSQL_VERSION_ID < 50500
- last_used_con = db_conn->last_used_con;
-#else
- last_used_con = db_conn;
-#endif
- DBUG_RETURN((uint) last_used_con->insert_id);
-}
-
-int spider_db_mysql::set_character_set(
- const char *csname
-) {
- DBUG_ENTER("spider_db_mysql::set_character_set");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(mysql_set_character_set(db_conn, csname));
-}
-
-int spider_db_mysql::select_db(
- const char *dbname
-) {
- DBUG_ENTER("spider_db_mysql::select_db");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(mysql_select_db(db_conn, dbname));
-}
-
-int spider_db_mysql::consistent_snapshot(
- int *need_mon
-) {
- DBUG_ENTER("spider_db_mysql::consistent_snapshot");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider_db_query(
- conn,
- SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR,
- SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-bool spider_db_mysql::trx_start_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_mysql::trx_start_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-int spider_db_mysql::start_transaction(
- int *need_mon
-) {
- DBUG_ENTER("spider_db_mysql::start_transaction");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider_db_query(
- conn,
- SPIDER_SQL_START_TRANSACTION_STR,
- SPIDER_SQL_START_TRANSACTION_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::commit(
- int *need_mon
-) {
- DBUG_ENTER("spider_db_mysql::commit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider_db_query(
- conn,
- SPIDER_SQL_COMMIT_STR,
- SPIDER_SQL_COMMIT_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::rollback(
- int *need_mon
-) {
- bool is_error;
- int error_num;
- DBUG_ENTER("spider_db_mysql::rollback");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider_db_query(
- conn,
- SPIDER_SQL_ROLLBACK_STR,
- SPIDER_SQL_ROLLBACK_LEN,
- -1,
- need_mon)
- ) {
- is_error = conn->thd->is_error();
- conn->mta_conn_mutex_unlock_later = TRUE;
- error_num = spider_db_errorno(conn);
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !is_error
- )
- conn->thd->clear_error();
- else {
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::xa_start(
- XID *xid,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_mysql::xa_start");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-bool spider_db_mysql::xa_start_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_mysql::xa_start_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-int spider_db_mysql::xa_end(
- XID *xid,
- int *need_mon
-) {
- char sql_buf[SPIDER_SQL_XA_END_LEN + XIDDATASIZE + sizeof(long) + 9];
- spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::xa_end");
- DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(108);
-
- sql_str.length(0);
- sql_str.q_append(SPIDER_SQL_XA_END_STR, SPIDER_SQL_XA_END_LEN);
- spider_db_append_xid_str(&sql_str, xid);
- if (spider_db_query(
- conn,
- sql_str.ptr(),
- sql_str.length(),
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::xa_prepare(
- XID *xid,
- int *need_mon
-) {
- char sql_buf[SPIDER_SQL_XA_PREPARE_LEN + XIDDATASIZE + sizeof(long) + 9];
- spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::xa_prepare");
- DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(109);
-
- sql_str.length(0);
- sql_str.q_append(SPIDER_SQL_XA_PREPARE_STR, SPIDER_SQL_XA_PREPARE_LEN);
- spider_db_append_xid_str(&sql_str, xid);
- if (spider_db_query(
- conn,
- sql_str.ptr(),
- sql_str.length(),
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::xa_commit(
- XID *xid,
- int *need_mon
-) {
- char sql_buf[SPIDER_SQL_XA_COMMIT_LEN + XIDDATASIZE + sizeof(long) + 9];
- spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::xa_commit");
- DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(110);
-
- sql_str.length(0);
- sql_str.q_append(SPIDER_SQL_XA_COMMIT_STR, SPIDER_SQL_XA_COMMIT_LEN);
- spider_db_append_xid_str(&sql_str, xid);
- if (spider_db_query(
- conn,
- sql_str.ptr(),
- sql_str.length(),
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::xa_rollback(
- XID *xid,
- int *need_mon
-) {
- char sql_buf[SPIDER_SQL_XA_ROLLBACK_LEN + XIDDATASIZE + sizeof(long) + 9];
- spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::xa_rollback");
- DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(111);
-
- sql_str.length(0);
- sql_str.q_append(SPIDER_SQL_XA_ROLLBACK_STR, SPIDER_SQL_XA_ROLLBACK_LEN);
- spider_db_append_xid_str(&sql_str, xid);
- if (spider_db_query(
- conn,
- sql_str.ptr(),
- sql_str.length(),
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-bool spider_db_mysql::set_trx_isolation_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_mysql::set_trx_isolation_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-int spider_db_mysql::set_trx_isolation(
- int trx_isolation,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_mysql::set_trx_isolation");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (trx_isolation)
- {
- case ISO_READ_UNCOMMITTED:
- if (spider_db_query(
- conn,
- SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
- SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- break;
- case ISO_READ_COMMITTED:
- if (spider_db_query(
- conn,
- SPIDER_SQL_ISO_READ_COMMITTED_STR,
- SPIDER_SQL_ISO_READ_COMMITTED_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- break;
- case ISO_REPEATABLE_READ:
- if (spider_db_query(
- conn,
- SPIDER_SQL_ISO_REPEATABLE_READ_STR,
- SPIDER_SQL_ISO_REPEATABLE_READ_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- break;
- case ISO_SERIALIZABLE:
- if (spider_db_query(
- conn,
- SPIDER_SQL_ISO_SERIALIZABLE_STR,
- SPIDER_SQL_ISO_SERIALIZABLE_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- break;
- default:
- DBUG_RETURN(HA_ERR_UNSUPPORTED);
- }
- DBUG_RETURN(0);
-}
-
-bool spider_db_mysql::set_autocommit_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_mysql::set_autocommit_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-int spider_db_mysql::set_autocommit(
- bool autocommit,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_mysql::set_autocommit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (autocommit)
- {
- if (spider_db_query(
- conn,
- SPIDER_SQL_AUTOCOMMIT_ON_STR,
- SPIDER_SQL_AUTOCOMMIT_ON_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- } else {
- if (spider_db_query(
- conn,
- SPIDER_SQL_AUTOCOMMIT_OFF_STR,
- SPIDER_SQL_AUTOCOMMIT_OFF_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- DBUG_RETURN(0);
-}
-
-bool spider_db_mysql::set_sql_log_off_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_mysql::set_sql_log_off_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-int spider_db_mysql::set_sql_log_off(
- bool sql_log_off,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_mysql::set_sql_log_off");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_log_off)
- {
- if (spider_db_query(
- conn,
- SPIDER_SQL_SQL_LOG_ON_STR,
- SPIDER_SQL_SQL_LOG_ON_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- } else {
- if (spider_db_query(
- conn,
- SPIDER_SQL_SQL_LOG_OFF_STR,
- SPIDER_SQL_SQL_LOG_OFF_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- DBUG_RETURN(0);
-}
-
-bool spider_db_mysql::set_time_zone_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_mysql::set_time_zone_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-int spider_db_mysql::set_time_zone(
- Time_zone *time_zone,
- int *need_mon
-) {
- const String *tz_str = time_zone->get_name();
- char sql_buf[MAX_FIELD_WIDTH];
- spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::set_time_zone");
- DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(214);
- sql_str.length(0);
- if (sql_str.reserve(SPIDER_SQL_TIME_ZONE_LEN +
- tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_str.q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
- sql_str.q_append(tz_str->ptr(), tz_str->length());
- sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- if (spider_db_query(
- conn,
- sql_str.ptr(),
- sql_str.length(),
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_db_mysql::append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_mysql::append_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::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
-) {
- DBUG_ENTER("spider_db_mysql::append_open_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::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
-) {
- DBUG_ENTER("spider_db_mysql::append_select");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_mysql::append_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::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
-) {
- DBUG_ENTER("spider_db_mysql::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::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
-) {
- DBUG_ENTER("spider_db_mysql::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-void spider_db_mysql::reset_request_queue()
-{
- DBUG_ENTER("spider_db_mysql::reset_request_queue");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-#endif
-
-size_t spider_db_mysql::escape_string(
- char *to,
- const char *from,
- size_t from_length
-) {
- DBUG_ENTER("spider_db_mysql::escape_string");
- DBUG_PRINT("info",("spider this=%p", this));
- if (db_conn->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
- DBUG_RETURN(escape_quotes_for_mysql(db_conn->charset, to, 0,
- from, from_length));
- DBUG_RETURN(escape_string_for_mysql(db_conn->charset, to, 0,
- from, from_length));
-}
-
-bool spider_db_mysql::have_lock_table_list()
-{
- DBUG_ENTER("spider_db_mysql::have_lock_table_list");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(lock_table_hash.records);
-}
-
-int spider_db_mysql::append_lock_tables(
- spider_string *str
-) {
- int error_num;
- ha_spider *tmp_spider;
- int lock_type;
- uint conn_link_idx;
- int tmp_link_idx;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
- 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;
- DBUG_ENTER("spider_db_mysql::lock_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = spider_db_mysql_utility.append_lock_table_head(str)))
- {
- DBUG_RETURN(error_num);
- }
- while ((tmp_link_for_hash =
- (SPIDER_LINK_FOR_HASH *) my_hash_element(&lock_table_hash, 0)))
- {
- tmp_spider = tmp_link_for_hash->spider;
- tmp_link_idx = tmp_link_for_hash->link_idx;
- switch (tmp_spider->lock_type)
- {
- case TL_READ:
- lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL;
- break;
- case TL_READ_NO_INSERT:
- lock_type = SPIDER_DB_TABLE_LOCK_READ;
- break;
- case TL_WRITE_LOW_PRIORITY:
- lock_type = SPIDER_DB_TABLE_LOCK_LOW_PRIORITY_WRITE;
- break;
- case TL_WRITE:
- lock_type = SPIDER_DB_TABLE_LOCK_WRITE;
- break;
- default:
- // no lock
- DBUG_PRINT("info",("spider lock_type=%d", tmp_spider->lock_type));
- DBUG_RETURN(0);
- }
- conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx];
- spider_mysql_share *db_share = (spider_mysql_share *)
- tmp_spider->share->dbton_share[conn->dbton_id];
- if (&db_share->db_names_str[conn_link_idx])
- {
- db_name = db_share->db_names_str[conn_link_idx].ptr();
- db_name_length = db_share->db_names_str[conn_link_idx].length();
- db_name_charset = tmp_spider->share->access_charset;
- } else {
- db_name = tmp_spider->share->tgt_dbs[conn_link_idx];
- db_name_length = tmp_spider->share->tgt_dbs_lengths[conn_link_idx];
- db_name_charset = system_charset_info;
- }
- if (&db_share->table_names_str[conn_link_idx])
- {
- table_name = db_share->table_names_str[conn_link_idx].ptr();
- table_name_length = db_share->table_names_str[conn_link_idx].length();
- table_name_charset = tmp_spider->share->access_charset;
- } else {
- table_name = tmp_spider->share->tgt_table_names[conn_link_idx];
- table_name_length =
- tmp_spider->share->tgt_table_names_lengths[conn_link_idx];
- table_name_charset = system_charset_info;
- }
- if ((error_num = spider_db_mysql_utility.
- append_lock_table_body(
- str,
- db_name,
- db_name_length,
- db_name_charset,
- table_name,
- table_name_length,
- table_name_charset,
- lock_type
- )
- )) {
- my_hash_reset(&lock_table_hash);
- DBUG_RETURN(error_num);
- }
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&lock_table_hash,
- tmp_link_for_hash->db_table_str_hash_value, (uchar*) tmp_link_for_hash);
-#else
- my_hash_delete(&lock_table_hash, (uchar*) tmp_link_for_hash);
-#endif
- }
- if ((error_num = spider_db_mysql_utility.append_lock_table_tail(str)))
- {
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql::append_unlock_tables(
- spider_string *str
-) {
- int error_num;
- DBUG_ENTER("spider_db_mysql::append_unlock_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = spider_db_mysql_utility.append_unlock_table(str)))
- {
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-uint spider_db_mysql::get_lock_table_hash_count()
-{
- DBUG_ENTER("spider_db_mysql::get_lock_table_hash_count");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(lock_table_hash.records);
-}
-
-void spider_db_mysql::reset_lock_table_hash()
-{
- DBUG_ENTER("spider_db_mysql::reset_lock_table_hash");
- DBUG_PRINT("info",("spider this=%p", this));
- my_hash_reset(&lock_table_hash);
- DBUG_VOID_RETURN;
-}
-
-uint spider_db_mysql::get_opened_handler_count()
-{
- DBUG_ENTER("spider_db_mysql::get_opened_handler_count");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(handler_open_array.elements);
-}
-
-void spider_db_mysql::reset_opened_handler()
-{
- ha_spider *tmp_spider;
- int tmp_link_idx;
- SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
- DBUG_ENTER("spider_db_mysql::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_mysql::set_dup_key_idx(
- ha_spider *spider,
- int link_idx
-) {
- TABLE *table = spider->get_table();
- uint roop_count, pk_idx = table->s->primary_key;
- int key_name_length;
- int max_length = 0;
- char *key_name;
- DBUG_ENTER("spider_db_mysql::set_dup_key_idx");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider error_str=%s", conn->error_str));
- for (roop_count = 0; roop_count < table->s->keys; roop_count++)
- {
- if (roop_count == pk_idx)
- {
- DBUG_PRINT("info",("spider pk_idx=%u", roop_count));
- int all_link_idx = spider->conn_link_idx[link_idx];
- key_name = spider->share->tgt_pk_names[all_link_idx];
- key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx];
- } else {
- key_name = table->s->key_info[roop_count].name;
- key_name_length = strlen(key_name);
- }
- DBUG_PRINT("info",("spider key_name=%s", key_name));
- if (
- max_length < key_name_length &&
- conn->error_length - 1 >= key_name_length &&
- *(conn->error_str + conn->error_length - 2 -
- key_name_length) == '\'' &&
- !strncasecmp(conn->error_str +
- conn->error_length - 1 - key_name_length,
- key_name, key_name_length)
- ) {
- max_length = key_name_length;
- spider->dup_key_idx = roop_count;
- }
- }
- if (max_length == 0)
- spider->dup_key_idx = (uint) -1;
- DBUG_PRINT("info",("spider dup_key_idx=%d", spider->dup_key_idx));
- DBUG_VOID_RETURN;
-}
-
-bool spider_db_mysql::cmp_request_key_to_snd(
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_mysql::cmp_request_key_to_snd");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-spider_db_mysql_util::spider_db_mysql_util() : spider_db_util()
-{
- DBUG_ENTER("spider_db_mysql_util::spider_db_mysql_util");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_mysql_util::~spider_db_mysql_util()
-{
- DBUG_ENTER("spider_db_mysql_util::~spider_db_mysql_util");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-int spider_db_mysql_util::append_name(
- spider_string *str,
- const char *name,
- uint name_length
-) {
- DBUG_ENTER("spider_db_mysql_util::append_name");
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->q_append(name, name_length);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_name_with_charset(
- spider_string *str,
- const char *name,
- uint name_length,
- CHARSET_INFO *name_charset
-) {
- DBUG_ENTER("spider_db_mysql_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);
-}
-
-bool spider_db_mysql_util::is_name_quote(
- const char head_code
-) {
- DBUG_ENTER("spider_db_mysql_util::is_name_quote");
- DBUG_RETURN(head_code == *name_quote_str);
-}
-
-int spider_db_mysql_util::append_escaped_name_quote(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_mysql_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_mysql_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_mysql_util::append_column_value");
- tmp_str.init_calc_mem(113);
-
- 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);
-*/
-#ifndef DBUG_OFF
- 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));
-*/
-#endif
-/*
- 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
-*/
- if (field->result_type() == STRING_RESULT)
- {
- DBUG_PRINT("info", ("spider STRING_RESULT"));
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- if (
- field->type() == MYSQL_TYPE_VARCHAR ||
- (field->type() >= MYSQL_TYPE_ENUM &&
- field->type() <= MYSQL_TYPE_GEOMETRY)
- ) {
- DBUG_PRINT("info", ("spider append_escaped"));
- char buf2[MAX_FIELD_WIDTH];
- spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, access_charset);
- tmp_str2.init_calc_mem(114);
- tmp_str2.length(0);
- if (
- tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
- str->reserve(tmp_str2.length() * 2) ||
- append_escaped_util(str, tmp_str2.get_str())
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- } else if (str->append(*ptr))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- } else if (field->str_needs_quotes())
- {
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- append_escaped_util(str, ptr);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- } else if (str->append(*ptr))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_from_with_alias(
- spider_string *str,
- const char **table_names,
- uint *table_name_lengths,
- const char **table_aliases,
- uint *table_alias_lengths,
- uint table_count,
- int *table_name_pos,
- bool over_write
-) {
- uint roop_count, length = 0;
- DBUG_ENTER("spider_db_mysql_util::append_from_with_alias");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!over_write)
- {
- for (roop_count = 0; roop_count < table_count; roop_count++)
- length += table_name_lengths[roop_count] + SPIDER_SQL_SPACE_LEN +
- table_alias_lengths[roop_count] + SPIDER_SQL_COMMA_LEN;
- if (str->reserve(SPIDER_SQL_FROM_LEN + length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- *table_name_pos = str->length();
- }
- for (roop_count = 0; roop_count < table_count; roop_count++)
- {
- str->q_append(table_names[roop_count], table_name_lengths[roop_count]);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(table_aliases[roop_count], table_alias_lengths[roop_count]);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_trx_isolation(
- spider_string *str,
- int trx_isolation
-) {
- DBUG_ENTER("spider_db_mysql_util::append_trx_isolation");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
- SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- {
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
- switch (trx_isolation)
- {
- case ISO_READ_UNCOMMITTED:
- str->q_append(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
- SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN);
- break;
- case ISO_READ_COMMITTED:
- str->q_append(SPIDER_SQL_ISO_READ_COMMITTED_STR,
- SPIDER_SQL_ISO_READ_COMMITTED_LEN);
- break;
- case ISO_REPEATABLE_READ:
- str->q_append(SPIDER_SQL_ISO_REPEATABLE_READ_STR,
- SPIDER_SQL_ISO_REPEATABLE_READ_LEN);
- break;
- case ISO_SERIALIZABLE:
- str->q_append(SPIDER_SQL_ISO_SERIALIZABLE_STR,
- SPIDER_SQL_ISO_SERIALIZABLE_LEN);
- break;
- default:
- DBUG_RETURN(HA_ERR_UNSUPPORTED);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_autocommit(
- spider_string *str,
- bool autocommit
-) {
- DBUG_ENTER("spider_db_mysql_util::append_autocommit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_AUTOCOMMIT_OFF_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- {
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
- if (autocommit)
- {
- str->q_append(SPIDER_SQL_AUTOCOMMIT_ON_STR,
- SPIDER_SQL_AUTOCOMMIT_ON_LEN);
- } else {
- str->q_append(SPIDER_SQL_AUTOCOMMIT_OFF_STR,
- SPIDER_SQL_AUTOCOMMIT_OFF_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_sql_log_off(
- spider_string *str,
- bool sql_log_off
-) {
- DBUG_ENTER("spider_db_mysql_util::append_sql_log_off");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_LOG_OFF_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- {
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
- if (sql_log_off)
- {
- str->q_append(SPIDER_SQL_SQL_LOG_ON_STR, SPIDER_SQL_SQL_LOG_ON_LEN);
- } else {
- str->q_append(SPIDER_SQL_SQL_LOG_OFF_STR, SPIDER_SQL_SQL_LOG_OFF_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_time_zone(
- spider_string *str,
- Time_zone *time_zone
-) {
- const String *tz_str = time_zone->get_name();
- DBUG_ENTER("spider_db_mysql_util::append_time_zone");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_TIME_ZONE_LEN +
- tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- str->q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
- str->q_append(tz_str->ptr(), tz_str->length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_start_transaction(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_mysql_util::append_start_transaction");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
- SPIDER_SQL_START_TRANSACTION_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- {
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
- str->q_append(SPIDER_SQL_START_TRANSACTION_STR,
- SPIDER_SQL_START_TRANSACTION_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_xa_start(
- spider_string *str,
- XID *xid
-) {
- DBUG_ENTER("spider_db_mysql_util::append_xa_start");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
- SPIDER_SQL_XA_START_LEN + XIDDATASIZE + sizeof(long) + 9))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- {
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
- str->q_append(SPIDER_SQL_XA_START_STR, SPIDER_SQL_XA_START_LEN);
- spider_db_append_xid_str(str, xid);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_lock_table_head(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_mysql_util::append_lock_table_head");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_LOCK_TABLE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_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_mysql_util::append_lock_table_body");
- DBUG_PRINT("info",("spider this=%p", this));
- 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);
- if (
- str->append(db_name, db_name_length, db_name_charset) ||
- str->reserve((SPIDER_SQL_NAME_QUOTE_LEN) * 2 + SPIDER_SQL_DOT_LEN)
- ) {
- 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_DOT_STR, SPIDER_SQL_DOT_LEN);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if (
- str->append(table_name, table_name_length, table_name_charset) ||
- str->reserve(SPIDER_SQL_NAME_QUOTE_LEN +
- spider_db_table_lock_len[lock_type])
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->q_append(spider_db_table_lock_str[lock_type],
- spider_db_table_lock_len[lock_type]);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_lock_table_tail(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_mysql_util::append_lock_table_tail");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::append_unlock_table(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_mysql_util::append_unlock_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_UNLOCK_TABLE_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_UNLOCK_TABLE_STR, SPIDER_SQL_UNLOCK_TABLE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_mysql_util::open_item_func(
- Item_func *item_func,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- uint dbton_id = spider_dbton_mysql.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,
- *separete_str = SPIDER_SQL_NULL_CHAR_STR,
- *last_str = SPIDER_SQL_NULL_CHAR_STR;
- int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
- separete_str_length = SPIDER_SQL_NULL_CHAR_LEN,
- last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
- int use_pushdown_udf;
- DBUG_ENTER("spider_db_mysql_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) &&
- !item_func->arg_count
- ) {
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
- } 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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, spider, str,
- alias, alias_length, dbton_id));
- } 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, spider, str,
- alias, alias_length, dbton_id));
- } 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 &&
- !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 (func_name_length == 12)
- {
- if (!strncasecmp("cast_as_date", func_name, func_name_length))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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 &&
- !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, spider, str,
- alias, alias_length, dbton_id));
- } else if (func_name_length == 14)
- {
- if (!strncasecmp("cast_as_binary", func_name, func_name_length))
- {
- 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 (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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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))
- {
- 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 (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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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, spider, str,
- alias, alias_length, dbton_id));
- case Item_func::CHAR_TYPECAST_FUNC:
- {
- 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 (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:
- 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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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;
- separete_str = SPIDER_SQL_AND_STR;
- separete_str_length = SPIDER_SQL_AND_LEN;
- } else {
- func_name = (char*) item_func->func_name();
- func_name_length = strlen(func_name);
- separete_str = SPIDER_SQL_AND_STR;
- separete_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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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));
- 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, spider, str,
- alias, alias_length, dbton_id));
- else
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
- 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);
- }
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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(SPIDER_SQL_MBR_LEN + func_name_length +
- SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN);
- 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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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 separete_str = %s", separete_str));
- DBUG_PRINT("info",("spider separete_str_length = %d", separete_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, spider, str,
- alias, alias_length, dbton_id)))
- DBUG_RETURN(error_num);
- if (roop_count == 1)
- {
- func_name = separete_str;
- func_name_length = separete_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, spider, str,
- alias, alias_length, dbton_id)))
- 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, spider, str,
- alias, alias_length, dbton_id)))
- 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->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 (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_mysql_util::open_item_sum_func(
- Item_sum *item_sum,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- uint dbton_id = spider_dbton_mysql.dbton_id;
- uint roop_count, item_count = item_sum->get_arg_count();
- int error_num;
- DBUG_ENTER("spider_db_mysql_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, spider, str,
- alias, alias_length, dbton_id)))
- 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, spider, str,
- alias, alias_length, dbton_id)))
- 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_mysql_util::append_escaped_util(
- spider_string *to,
- String *from
-) {
- DBUG_ENTER("spider_db_mysql_util::append_escaped_util");
- DBUG_PRINT("info",("spider this=%p", this));
- to->get_str()->append_for_single_quote(from);
- to->mem_calc();
- DBUG_RETURN(0);
-}
-
-spider_mysql_share::spider_mysql_share(
- st_spider_share *share
-) : spider_db_share(
- share
-),
- table_select(NULL),
- table_select_pos(0),
- key_select(NULL),
- key_select_pos(NULL),
- key_hint(NULL),
- show_table_status(NULL),
- show_records(NULL),
- show_index(NULL),
- 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_mysql_share::spider_mysql_share");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 71);
- spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-spider_mysql_share::~spider_mysql_share()
-{
- DBUG_ENTER("spider_mysql_share::~spider_mysql_share");
- DBUG_PRINT("info",("spider this=%p", this));
- if (table_select)
- delete [] table_select;
- if (key_select)
- delete [] key_select;
- if (key_hint)
- delete [] key_hint;
- free_show_table_status();
- free_show_records();
- free_show_index();
- free_column_name_str();
- free_table_names_str();
- if (key_select_pos)
- {
- spider_free(spider_current_trx, key_select_pos, MYF(0));
- }
- spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_share::init()
-{
- int error_num;
- uint roop_count;
- TABLE_SHARE *table_share = spider_share->table_share;
- uint keys = table_share ? table_share->keys : 0;
- DBUG_ENTER("spider_mysql_share::init");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(key_select_pos = (int *)
- spider_bulk_alloc_mem(spider_current_trx, 112,
- __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
- &key_select_pos,
- sizeof(int) * keys,
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- &db_table_str_hash_value,
- sizeof(my_hash_value_type) * spider_share->all_link_count,
-#endif
- NullS))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- if (keys > 0 &&
- !(key_hint = new spider_string[keys])
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- for (roop_count = 0; roop_count < keys; roop_count++)
- {
- key_hint[roop_count].init_calc_mem(189);
- key_hint[roop_count].set_charset(spider_share->access_charset);
- }
- DBUG_PRINT("info",("spider key_hint=%p", key_hint));
-
- if (
- !(table_select = new spider_string[1]) ||
- (keys > 0 &&
- !(key_select = new spider_string[keys])
- ) ||
- (error_num = create_table_names_str()) ||
- (table_share &&
- (
- (error_num = create_column_name_str()) ||
- (error_num = convert_key_hint_str()) ||
- (error_num = append_show_table_status()) ||
- (error_num = append_show_records()) ||
- (error_num = append_show_index())
- )
- )
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- table_select->init_calc_mem(96);
- if (table_share && (error_num = append_table_select()))
- DBUG_RETURN(error_num);
-
- for (roop_count = 0; roop_count < keys; roop_count++)
- {
- key_select[roop_count].init_calc_mem(97);
- if ((error_num = append_key_select(roop_count)))
- DBUG_RETURN(error_num);
- }
-
- DBUG_RETURN(error_num);
-}
-
-uint spider_mysql_share::get_column_name_length(
- uint field_index
-) {
- DBUG_ENTER("spider_mysql_share::get_column_name_length");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(column_name_str[field_index].length());
-}
-
-int spider_mysql_share::append_column_name(
- spider_string *str,
- uint field_index
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_share::append_column_name");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = spider_db_mysql_utility.append_name(str,
- column_name_str[field_index].ptr(), column_name_str[field_index].length());
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_share::append_column_name_with_alias(
- spider_string *str,
- uint field_index,
- const char *alias,
- uint alias_length
-) {
- DBUG_ENTER("spider_mysql_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);
-}
-
-int spider_mysql_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_mysql_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_mysql_utility.append_name(str, db_nm, db_nm_len);
- str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_mysql_utility.append_name(str, table_nm, table_nm_len);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_share::append_table_name_with_adjusting(
- 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();
- uint db_nm_max_len = db_nm_max_length;
- const char *table_nm = table_names_str[all_link_idx].ptr();
- uint table_nm_len = table_names_str[all_link_idx].length();
- uint table_nm_max_len = table_nm_max_length;
- DBUG_ENTER("spider_mysql_share::append_table_name_with_adjusting");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_db_mysql_utility.append_name(str, db_nm, db_nm_len);
- str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_mysql_utility.append_name(str, table_nm, table_nm_len);
- uint length =
- db_nm_max_len - db_nm_len +
- table_nm_max_len - table_nm_len;
- memset((char *) str->ptr() + str->length(), ' ', length);
- str->length(str->length() + length);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_share::append_from_with_adjusted_table_name(
- spider_string *str,
- int *table_name_pos
-) {
- const char *db_nm = db_names_str[0].ptr();
- uint db_nm_len = db_names_str[0].length();
- uint db_nm_max_len = db_nm_max_length;
- const char *table_nm = table_names_str[0].ptr();
- uint table_nm_len = table_names_str[0].length();
- uint table_nm_max_len = table_nm_max_length;
- DBUG_ENTER("spider_mysql_share::append_from_with_adjusted_table_name");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_FROM_LEN + db_nm_max_length +
- SPIDER_SQL_DOT_LEN + table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- *table_name_pos = str->length();
- spider_db_mysql_utility.append_name(str, db_nm, db_nm_len);
- str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_mysql_utility.append_name(str, table_nm, table_nm_len);
- uint length =
- db_nm_max_len - db_nm_len +
- table_nm_max_len - table_nm_len;
- memset((char *) str->ptr() + str->length(), ' ', length);
- str->length(str->length() + length);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_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_mysql.dbton_id;
- DBUG_ENTER("spider_mysql_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_mysql_share::free_table_names_str()
-{
- DBUG_ENTER("spider_mysql_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_mysql_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_mysql.dbton_id;
- DBUG_ENTER("spider_mysql_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(89);
- str->set_charset(spider_share->access_charset);
- if ((error_num = spider_db_append_name_with_quote_str(str,
- (char *) (*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_mysql_share::free_column_name_str()
-{
- DBUG_ENTER("spider_mysql_share::free_column_name_str");
- if (column_name_str)
- {
- delete [] column_name_str;
- column_name_str = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_share::convert_key_hint_str()
-{
- spider_string *tmp_key_hint;
- int roop_count;
- TABLE_SHARE *table_share = spider_share->table_share;
- DBUG_ENTER("spider_mysql_share::convert_key_hint_str");
- if (spider_share->access_charset->cset != system_charset_info->cset)
- {
- /* need convertion */
- for (roop_count = 0, tmp_key_hint = key_hint;
- roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
- {
- tmp_key_hint->length(0);
- if (tmp_key_hint->append(spider_share->key_hint->ptr(),
- spider_share->key_hint->length(), system_charset_info))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- } else {
- for (roop_count = 0, tmp_key_hint = key_hint;
- roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
- {
- if (tmp_key_hint->copy(spider_share->key_hint[roop_count]))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_share::append_show_table_status()
-{
- int roop_count;
- spider_string *str;
- uint dbton_id = spider_dbton_mysql.dbton_id;
- DBUG_ENTER("spider_mysql_append_show_table_status");
- if (!(show_table_status =
- new spider_string[2 * spider_share->all_link_count]))
- goto error;
-
- for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
- roop_count++)
- {
- show_table_status[0 + (2 * roop_count)].init_calc_mem(90);
- show_table_status[1 + (2 * roop_count)].init_calc_mem(91);
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
-
- if (
- show_table_status[0 + (2 * roop_count)].reserve(
- SPIDER_SQL_SHOW_TABLE_STATUS_LEN +
- db_names_str[roop_count].length() +
- SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
- ((SPIDER_SQL_NAME_QUOTE_LEN) * 2) +
- ((SPIDER_SQL_VALUE_QUOTE_LEN) * 2)) ||
- show_table_status[1 + (2 * roop_count)].reserve(
- SPIDER_SQL_SELECT_TABLES_STATUS_LEN +
- db_names_str[roop_count].length() +
- SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
- table_names_str[roop_count].length() +
- ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4))
- )
- goto error;
- str = &show_table_status[0 + (2 * roop_count)];
- str->q_append(
- SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->q_append(db_names_str[roop_count].ptr(),
- db_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(table_names_str[roop_count].ptr(),
- table_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str = &show_table_status[1 + (2 * roop_count)];
- str->q_append(
- SPIDER_SQL_SELECT_TABLES_STATUS_STR,
- SPIDER_SQL_SELECT_TABLES_STATUS_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(db_names_str[roop_count].ptr(),
- db_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(table_names_str[roop_count].ptr(),
- table_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- }
- DBUG_RETURN(0);
-
-error:
- if (show_table_status)
- {
- delete [] show_table_status;
- show_table_status = NULL;
- }
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-}
-
-void spider_mysql_share::free_show_table_status()
-{
- DBUG_ENTER("spider_mysql_free_show_table_status");
- if (show_table_status)
- {
- delete [] show_table_status;
- show_table_status = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_share::append_show_records()
-{
- int roop_count;
- spider_string *str;
- uint dbton_id = spider_dbton_mysql.dbton_id;
- DBUG_ENTER("spider_mysql_share::append_show_records");
- if (!(show_records = new spider_string[spider_share->all_link_count]))
- goto error;
-
- for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
- roop_count++)
- {
- show_records[roop_count].init_calc_mem(92);
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
-
- if (
- show_records[roop_count].reserve(
- SPIDER_SQL_SHOW_RECORDS_LEN +
- db_names_str[roop_count].length() +
- SPIDER_SQL_DOT_LEN +
- table_names_str[roop_count].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)
- )
- goto error;
- str = &show_records[roop_count];
- str->q_append(SPIDER_SQL_SHOW_RECORDS_STR, SPIDER_SQL_SHOW_RECORDS_LEN);
- append_table_name(str, roop_count);
- }
- DBUG_RETURN(0);
-
-error:
- if (show_records)
- {
- delete [] show_records;
- show_records = NULL;
- }
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-}
-
-void spider_mysql_share::free_show_records()
-{
- DBUG_ENTER("spider_mysql_share::free_show_records");
- if (show_records)
- {
- delete [] show_records;
- show_records = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_share::append_show_index()
-{
- int roop_count;
- spider_string *str;
- uint dbton_id = spider_dbton_mysql.dbton_id;
- DBUG_ENTER("spider_mysql_share::append_show_index");
- if (!(show_index = new spider_string[2 * spider_share->all_link_count]))
- goto error;
-
- for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
- roop_count++)
- {
- show_index[0 + (2 * roop_count)].init_calc_mem(93);
- show_index[1 + (2 * roop_count)].init_calc_mem(94);
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
-
- if (
- show_index[0 + (2 * roop_count)].reserve(
- SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
- SPIDER_SQL_DOT_LEN +
- table_names_str[roop_count].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4) ||
- show_index[1 + (2 * roop_count)].reserve(
- SPIDER_SQL_SELECT_STATISTICS_LEN +
- db_names_str[roop_count].length() +
- SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
- table_names_str[roop_count].length() +
- ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4) +
- SPIDER_SQL_GROUP_LEN + SPIDER_SQL_COLUMN_NAME_LEN)
- )
- goto error;
- str = &show_index[0 + (2 * roop_count)];
- str->q_append(
- SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
- append_table_name(str, roop_count);
- str = &show_index[1 + (2 * roop_count)];
- str->q_append(
- SPIDER_SQL_SELECT_STATISTICS_STR, SPIDER_SQL_SELECT_STATISTICS_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(db_names_str[roop_count].ptr(),
- db_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(table_names_str[roop_count].ptr(),
- table_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
- str->q_append(SPIDER_SQL_COLUMN_NAME_STR, SPIDER_SQL_COLUMN_NAME_LEN);
- }
- DBUG_RETURN(0);
-
-error:
- if (show_index)
- {
- delete [] show_index;
- show_index = NULL;
- }
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-}
-
-void spider_mysql_share::free_show_index()
-{
- DBUG_ENTER("spider_mysql_share::free_show_index");
- if (show_index)
- {
- delete [] show_index;
- show_index = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_share::append_table_select()
-{
- Field **field;
- uint field_length;
- spider_string *str = table_select;
- TABLE_SHARE *table_share = spider_share->table_share;
- DBUG_ENTER("spider_mysql_share::append_table_select");
- for (field = table_share->field; *field; field++)
- {
- field_length = column_name_str[(*field)->field_index].length();
- if (str->reserve(field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(append_from_with_adjusted_table_name(str, &table_select_pos));
-}
-
-int spider_mysql_share::append_key_select(
- uint idx
-) {
- KEY_PART_INFO *key_part;
- Field *field;
- uint part_num;
- uint field_length;
- spider_string *str = &key_select[idx];
- TABLE_SHARE *table_share = spider_share->table_share;
- const KEY *key_info = &table_share->key_info[idx];
- DBUG_ENTER("spider_mysql_share::append_key_select");
- for (key_part = key_info->key_part, part_num = 0;
- part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
- {
- field = key_part->field;
- field_length = column_name_str[field->field_index].length();
- if (str->reserve(field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(append_from_with_adjusted_table_name(str, &key_select_pos[idx]));
-}
-
-bool spider_mysql_share::need_change_db_table_name()
-{
- DBUG_ENTER("spider_mysql_share::need_change_db_table_name");
- DBUG_RETURN(!same_db_table_name);
-}
-
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
-int spider_mysql_share::discover_table_structure(
- SPIDER_TRX *trx,
- SPIDER_SHARE *spider_share,
- spider_string *str
-) {
- int roop_count, error_num = HA_ERR_WRONG_COMMAND;
- char sql_buf[MAX_FIELD_WIDTH];
- spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info);
- uint dbton_id = spider_dbton_mysql.dbton_id;
- uint strlen = str->length();
- DBUG_ENTER("spider_mysql_share::discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(228);
- for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
- roop_count++)
- {
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- {
- DBUG_PRINT("info",("spider spider_share->sql_dbton_ids[%d]=%u",
- roop_count, spider_share->sql_dbton_ids[roop_count]));
- DBUG_PRINT("info",("spider dbton_id=%u", dbton_id));
- continue;
- }
-
- str->length(strlen);
- sql_str.length(0);
- if (sql_str.reserve(
- SPIDER_SQL_SHOW_COLUMNS_LEN + db_names_str[roop_count].length() +
- SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
- SPIDER_SQL_SEMICOLON_LEN +
- SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
- SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4
- )) {
- DBUG_PRINT("info",("spider alloc sql_str error"));
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql_str.q_append(SPIDER_SQL_SHOW_COLUMNS_STR, SPIDER_SQL_SHOW_COLUMNS_LEN);
- append_table_name(&sql_str, roop_count);
- sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- sql_str.q_append(SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
- append_table_name(&sql_str, roop_count);
-
- SPIDER_CONN *conn;
- int need_mon;
- if (!(conn = spider_get_conn(
- spider_share, 0, spider_share->conn_keys[roop_count], trx, NULL, FALSE,
- FALSE, SPIDER_CONN_KIND_MYSQL, &error_num))
- ) {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &need_mon;
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(spider_share, conn, roop_count);
- spider_conn_set_timeout_from_share(conn, roop_count, trx->thd,
- spider_share);
- if (
- (error_num = spider_db_set_names_internal(trx, spider_share, conn,
- roop_count, &need_mon)) ||
- (
- spider_db_query(
- conn,
- sql_str.ptr(),
- sql_str.length(),
- -1,
- &need_mon) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- DBUG_PRINT("info",("spider spider_get_trx error"));
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- continue;
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id = trx->spider_thread_id;
- request_key.query_id = trx->thd->query_id;
- request_key.handler = NULL;
- request_key.request_id = 1;
- request_key.next = NULL;
- spider_db_result *res;
- /* get column list */
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- DBUG_PRINT("info",("spider column store error"));
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- continue;
- }
- /* no record */
- DBUG_PRINT("info",("spider column no record error"));
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- continue;
- }
- if ((error_num = res->fetch_columns_for_discover_table_structure(str,
- spider_share->access_charset)))
- {
- DBUG_PRINT("info",("spider column fetch error"));
- res->free_result();
- delete res;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- continue;
- }
- res->free_result();
- delete res;
- if (conn->db_conn->next_result())
- {
- DBUG_PRINT("info",("spider single result error"));
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- continue;
- }
- /* get index list */
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- DBUG_PRINT("info",("spider index store error"));
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- continue;
- }
- /* no record */
- DBUG_PRINT("info",("spider index no record error"));
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- continue;
- }
- if ((error_num = res->fetch_index_for_discover_table_structure(str,
- spider_share->access_charset)))
- {
- DBUG_PRINT("info",("spider index fetch error"));
- res->free_result();
- delete res;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- continue;
- }
- res->free_result();
- delete res;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- if (!error_num)
- break;
- }
- DBUG_RETURN(error_num);
-}
-#endif
-
-spider_mysql_handler::spider_mysql_handler(
- ha_spider *spider,
- spider_mysql_share *db_share
-) : spider_db_handler(
- spider,
- db_share
-),
- where_pos(0),
- order_pos(0),
- limit_pos(0),
- table_name_pos(0),
- ha_read_pos(0),
- ha_next_pos(0),
- ha_where_pos(0),
- ha_limit_pos(0),
- ha_table_name_pos(0),
- insert_pos(0),
- insert_table_name_pos(0),
- upd_tmp_tbl(NULL),
- tmp_sql_pos1(0),
- tmp_sql_pos2(0),
- tmp_sql_pos3(0),
- tmp_sql_pos4(0),
- tmp_sql_pos5(0),
- reading_from_bulk_tmp_table(FALSE),
- union_table_name_pos_first(NULL),
- union_table_name_pos_current(NULL),
- mysql_share(db_share),
- link_for_hash(NULL)
-{
- DBUG_ENTER("spider_mysql_handler::spider_mysql_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 183);
- spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-spider_mysql_handler::~spider_mysql_handler()
-{
- DBUG_ENTER("spider_mysql_handler::~spider_mysql_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- while (union_table_name_pos_first)
- {
- SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
- union_table_name_pos_first = tmp_pos->next;
- spider_free(spider_current_trx, tmp_pos, MYF(0));
- }
- if (link_for_hash)
- {
- spider_free(spider_current_trx, link_for_hash, MYF(0));
- }
- spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_handler::init()
-{
- uint roop_count;
- 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_mysql_handler::init");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.init_calc_mem(59);
- sql_part.init_calc_mem(60);
- sql_part2.init_calc_mem(61);
- ha_sql.init_calc_mem(62);
- insert_sql.init_calc_mem(64);
- update_sql.init_calc_mem(65);
- tmp_sql.init_calc_mem(66);
- dup_update_sql.init_calc_mem(166);
- if (
- (sql.real_alloc(init_sql_alloc_size)) ||
- (insert_sql.real_alloc(init_sql_alloc_size)) ||
- (update_sql.real_alloc(init_sql_alloc_size)) ||
- (tmp_sql.real_alloc(init_sql_alloc_size))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.set_charset(share->access_charset);
- sql_part.set_charset(share->access_charset);
- ha_sql.set_charset(share->access_charset);
- insert_sql.set_charset(share->access_charset);
- update_sql.set_charset(share->access_charset);
- tmp_sql.set_charset(share->access_charset);
- upd_tmp_tbl_prm.init();
- upd_tmp_tbl_prm.field_count = 1;
- if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
- spider_bulk_alloc_mem(spider_current_trx, 141,
- __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
- &link_for_hash,
- sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
- NullS))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- 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 =
- &mysql_share->db_table_str[roop_count];
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- link_for_hash[roop_count].db_table_str_hash_value =
- mysql_share->db_table_str_hash_value[roop_count];
-#endif
- }
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- hs_upds.init();
-#endif
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_table_name_with_adjusting(
- spider_string *str,
- int link_idx,
- ulong sql_type
-) {
- int error_num = 0;
- DBUG_ENTER("spider_mysql_handler::append_table_name_with_adjusting");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type == SPIDER_SQL_TYPE_HANDLER)
- {
- str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
- } else {
- error_num = mysql_share->append_table_name_with_adjusting(str,
- spider->conn_link_idx[link_idx]);
- }
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_key_column_types(
- const key_range *start_key,
- spider_string *str
-) {
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- KEY *key_info = result_list->key_info;
- uint key_name_length, key_count;
- key_part_map full_key_part_map =
- make_prev_keypart_map(spider_user_defined_key_parts(key_info));
- key_part_map start_key_part_map;
- KEY_PART_INFO *key_part;
- Field *field;
- char tmp_buf[MAX_FIELD_WIDTH];
- spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info);
- DBUG_ENTER("spider_mysql_handler::append_key_column_types");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_str.init_calc_mem(115);
-
- start_key_part_map = start_key->keypart_map & full_key_part_map;
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
- DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
- DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
-
- if (!start_key_part_map)
- DBUG_RETURN(0);
-
- for (
- key_part = key_info->key_part,
- key_count = 0;
- start_key_part_map;
- start_key_part_map >>= 1,
- key_part++,
- key_count++
- ) {
- field = key_part->field;
- key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
- if (str->reserve(key_name_length + SPIDER_SQL_SPACE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(tmp_buf, key_name_length);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
-
- if (tmp_str.ptr() != tmp_buf)
- tmp_str.set(tmp_buf, sizeof(tmp_buf), system_charset_info);
- else
- tmp_str.set_charset(system_charset_info);
- field->sql_type(*tmp_str.get_str());
- tmp_str.mem_calc();
- str->append(tmp_str);
- if (field->has_charset())
- {
- CHARSET_INFO *cs = field->charset();
- uint coll_length = strlen(cs->name);
- if (str->reserve(SPIDER_SQL_COLLATE_LEN + coll_length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
- str->q_append(cs->name, coll_length);
- }
-
- 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);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
-
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_key_join_columns_for_bka(
- const key_range *start_key,
- spider_string *str,
- const char **table_aliases,
- uint *table_alias_lengths
-) {
- KEY *key_info = spider->result_list.key_info;
- uint length, key_name_length, key_count;
- key_part_map full_key_part_map =
- make_prev_keypart_map(spider_user_defined_key_parts(key_info));
- key_part_map start_key_part_map;
- KEY_PART_INFO *key_part;
- Field *field;
- char tmp_buf[MAX_FIELD_WIDTH];
- bool start_where = ((int) str->length() == where_pos);
- DBUG_ENTER("spider_mysql_handler::append_key_join_columns_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- start_key_part_map = start_key->keypart_map & full_key_part_map;
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
- DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
- DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
-
- if (!start_key_part_map)
- DBUG_RETURN(0);
-
- if (start_where)
- {
- if (str->reserve(SPIDER_SQL_WHERE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
-
- for (
- key_part = key_info->key_part,
- key_count = 0;
- start_key_part_map;
- start_key_part_map >>= 1,
- key_part++,
- key_count++
- ) {
- field = key_part->field;
- key_name_length =
- mysql_share->column_name_str[field->field_index].length();
- length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
- if (str->reserve(length + table_alias_lengths[0] + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- table_alias_lengths[1] + SPIDER_SQL_PF_EQUAL_LEN + SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(table_aliases[0], table_alias_lengths[0]);
- str->q_append(tmp_buf, length);
- str->q_append(SPIDER_SQL_PF_EQUAL_STR, SPIDER_SQL_PF_EQUAL_LEN);
- str->q_append(table_aliases[1], table_alias_lengths[1]);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
- str->length(str->length() - SPIDER_SQL_AND_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_tmp_table_and_sql_for_bka(
- const key_range *start_key
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_tmp_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- char tmp_table_name[MAX_FIELD_WIDTH * 2],
- tgt_table_name[MAX_FIELD_WIDTH * 2];
- int tmp_table_name_length;
- spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
- mysql_share->db_names_str[0].charset());
- const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
- uint table_name_lengths[2], table_alias_lengths[2],
- table_dot_alias_lengths[2];
- tgt_table_name_str.init_calc_mem(99);
- tgt_table_name_str.length(0);
- create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
- first_link_idx);
- if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
- first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
- DBUG_RETURN(error_num);
- }
- table_names[0] = tmp_table_name;
- table_names[1] = tgt_table_name_str.c_ptr_safe();
- table_name_lengths[0] = tmp_table_name_length;
- table_name_lengths[1] = tgt_table_name_str.length();
- table_aliases[0] = SPIDER_SQL_A_STR;
- table_aliases[1] = SPIDER_SQL_B_STR;
- table_alias_lengths[0] = SPIDER_SQL_A_LEN;
- table_alias_lengths[1] = SPIDER_SQL_B_LEN;
- table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
- table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
- table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
- table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
- if (
- (error_num = append_drop_tmp_bka_table(
- &tmp_sql, tmp_table_name, tmp_table_name_length,
- &tmp_sql_pos1, &tmp_sql_pos5, TRUE)) ||
- (error_num = append_create_tmp_bka_table(
- start_key,
- &tmp_sql, tmp_table_name,
- tmp_table_name_length,
- &tmp_sql_pos2, spider->share->table_share->table_charset)) ||
- (error_num = append_insert_tmp_bka_table(
- start_key,
- &tmp_sql, tmp_table_name,
- tmp_table_name_length, &tmp_sql_pos3))
- )
- DBUG_RETURN(error_num);
- tmp_sql_pos4 = tmp_sql.length();
- if ((error_num = spider_db_append_select(spider)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
- sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- if (
- (error_num = append_select_columns_with_alias(&sql,
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) ||
- (error_num = spider_db_mysql_utility.append_from_with_alias(&sql,
- table_names, table_name_lengths,
- table_aliases, table_alias_lengths, 2,
- &table_name_pos, FALSE))
- )
- DBUG_RETURN(error_num);
- if (
- mysql_share->key_hint &&
- (error_num = spider_db_append_hint_after_table(spider,
- &sql, &mysql_share->key_hint[spider->active_index]))
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- where_pos = sql.length();
- if (
- (error_num = append_key_join_columns_for_bka(
- start_key, &sql,
- table_dot_aliases, table_dot_alias_lengths)) ||
- (error_num = append_condition_part(
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
- SPIDER_SQL_TYPE_SELECT_SQL, FALSE)) ||
- (
- spider->result_list.direct_order_limit &&
- (error_num = append_key_order_for_direct_order_limit_with_alias(&sql,
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))
- )
- )
- DBUG_RETURN(error_num);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::reuse_tmp_table_and_sql_for_bka()
-{
- DBUG_ENTER("spider_mysql_handler::reuse_tmp_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_sql.length(tmp_sql_pos4);
- sql.length(limit_pos);
- ha_sql.length(ha_limit_pos);
- DBUG_RETURN(0);
-}
-
-void spider_mysql_handler::create_tmp_bka_table_name(
- char *tmp_table_name,
- int *tmp_table_name_length,
- int link_idx
-) {
- uint adjust_length =
- mysql_share->db_nm_max_length -
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length() +
- mysql_share->table_nm_max_length -
- mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length(),
- length;
- DBUG_ENTER("spider_mysql_handler::create_tmp_bka_table_name");
- *tmp_table_name_length = mysql_share->db_nm_max_length +
- mysql_share->table_nm_max_length;
- memset(tmp_table_name, ' ', adjust_length);
- tmp_table_name += adjust_length;
- memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(),
- mysql_share->db_names_str[link_idx].length());
- tmp_table_name += mysql_share->db_names_str[link_idx].length();
- length = my_sprintf(tmp_table_name, (tmp_table_name,
- "%s%s%p%s", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider,
- SPIDER_SQL_UNDERSCORE_STR));
- *tmp_table_name_length += length;
- tmp_table_name += length;
- memcpy(tmp_table_name,
- mysql_share->table_names_str[spider->conn_link_idx[link_idx]].c_ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length());
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_handler::append_create_tmp_bka_table(
- const key_range *start_key,
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos,
- CHARSET_INFO *table_charset
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- THD *thd = spider->trx->thd;
- char *bka_engine = spider_param_bka_engine(thd, share->bka_engine);
- uint bka_engine_length = strlen(bka_engine),
- cset_length = strlen(table_charset->csname),
- coll_length = strlen(table_charset->name);
- DBUG_ENTER("spider_mysql_handler::append_create_tmp_bka_table");
- if (str->reserve(SPIDER_SQL_CREATE_TMP_LEN + tmp_table_name_length +
- SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_ID_TYPE_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CREATE_TMP_STR, SPIDER_SQL_CREATE_TMP_LEN);
- *db_name_pos = str->length();
- str->q_append(tmp_table_name, tmp_table_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- str->q_append(SPIDER_SQL_ID_TYPE_STR, SPIDER_SQL_ID_TYPE_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- if ((error_num = append_key_column_types(start_key, str)))
- DBUG_RETURN(error_num);
- if (str->reserve(SPIDER_SQL_ENGINE_LEN + bka_engine_length +
- SPIDER_SQL_DEF_CHARSET_LEN + cset_length + SPIDER_SQL_COLLATE_LEN +
- coll_length + SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ENGINE_STR, SPIDER_SQL_ENGINE_LEN);
- str->q_append(bka_engine, bka_engine_length);
- str->q_append(SPIDER_SQL_DEF_CHARSET_STR, SPIDER_SQL_DEF_CHARSET_LEN);
- str->q_append(table_charset->csname, cset_length);
- str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
- str->q_append(table_charset->name, coll_length);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_drop_tmp_bka_table(
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos,
- int *drop_table_end_pos,
- bool with_semicolon
-) {
- DBUG_ENTER("spider_mysql_handler::append_drop_tmp_bka_table");
- if (str->reserve(SPIDER_SQL_DROP_TMP_LEN + tmp_table_name_length +
- (with_semicolon ? SPIDER_SQL_SEMICOLON_LEN : 0)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_DROP_TMP_STR, SPIDER_SQL_DROP_TMP_LEN);
- *db_name_pos = str->length();
- str->q_append(tmp_table_name, tmp_table_name_length);
- *drop_table_end_pos = str->length();
- if (with_semicolon)
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_insert_tmp_bka_table(
- const key_range *start_key,
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_insert_tmp_bka_table");
- if (str->reserve(SPIDER_SQL_INSERT_LEN + SPIDER_SQL_INTO_LEN +
- tmp_table_name_length + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
- str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
- *db_name_pos = str->length();
- str->q_append(tmp_table_name, tmp_table_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- if ((error_num = spider_db_append_key_columns(start_key, spider, str)))
- DBUG_RETURN(error_num);
- if (str->reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_union_table_and_sql_for_bka(
- const key_range *start_key
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_union_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- char tgt_table_name[MAX_FIELD_WIDTH * 2];
- spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
- mysql_share->db_names_str[0].charset());
- const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
- uint table_name_lengths[2], table_alias_lengths[2],
- table_dot_alias_lengths[2];
- tgt_table_name_str.init_calc_mem(233);
- tgt_table_name_str.length(0);
- if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
- first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
- DBUG_RETURN(error_num);
- }
- table_names[0] = "";
- table_names[1] = tgt_table_name_str.c_ptr_safe();
- table_name_lengths[0] = 0;
- table_name_lengths[1] = tgt_table_name_str.length();
- table_aliases[0] = SPIDER_SQL_A_STR;
- table_aliases[1] = SPIDER_SQL_B_STR;
- table_alias_lengths[0] = SPIDER_SQL_A_LEN;
- table_alias_lengths[1] = SPIDER_SQL_B_LEN;
- table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
- table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
- table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
- table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
-
- if ((error_num = spider_db_append_select(spider)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
- sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- if ((error_num = append_select_columns_with_alias(&sql,
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_FROM_LEN + (SPIDER_SQL_OPEN_PAREN_LEN * 2)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- tmp_sql_pos1 = sql.length();
-
- if (
- (error_num = spider_db_mysql_utility.append_from_with_alias(&tmp_sql,
- table_names, table_name_lengths,
- table_aliases, table_alias_lengths, 2,
- &table_name_pos, FALSE))
- )
- DBUG_RETURN(error_num);
- if (
- mysql_share->key_hint &&
- (error_num = spider_db_append_hint_after_table(spider,
- &tmp_sql, &mysql_share->key_hint[spider->active_index]))
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- where_pos = tmp_sql.length();
- if (
- (error_num = append_key_join_columns_for_bka(
- start_key, &tmp_sql,
- table_dot_aliases, table_dot_alias_lengths)) ||
- (error_num = append_condition_part(
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
- SPIDER_SQL_TYPE_TMP_SQL, FALSE)) ||
- (
- spider->result_list.direct_order_limit &&
- (error_num = append_key_order_for_direct_order_limit_with_alias(&tmp_sql,
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))
- )
- )
- DBUG_RETURN(error_num);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::reuse_union_table_and_sql_for_bka()
-{
- DBUG_ENTER("spider_mysql_handler::reuse_union_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.length(tmp_sql_pos1);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_insert_for_recovery(
- ulong sql_type,
- int link_idx
-) {
- const TABLE *table = spider->get_table();
- SPIDER_SHARE *share = spider->share;
- Field **field;
- uint field_name_length = 0;
- bool add_value = FALSE;
- spider_string *insert_sql;
- DBUG_ENTER("spider_mysql_handler::append_insert_for_recovery");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
- {
- insert_sql = &spider->result_list.insert_sqls[link_idx];
- insert_sql->length(0);
- } else {
- insert_sql = &spider->result_list.update_sqls[link_idx];
- }
- if (insert_sql->reserve(
- SPIDER_SQL_INSERT_LEN + SPIDER_SQL_SQL_IGNORE_LEN +
- SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- insert_sql->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
- insert_sql->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
- insert_sql->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
- mysql_share->append_table_name(insert_sql, spider->conn_link_idx[link_idx]);
- insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- for (field = table->field; *field; field++)
- {
- field_name_length =
- mysql_share->column_name_str[(*field)->field_index].length();
- if (insert_sql->reserve(field_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(insert_sql, (*field)->field_index);
- insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if (field_name_length)
- insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
- if (insert_sql->reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- insert_sql->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
- insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- for (field = table->field; *field; field++)
- {
- add_value = TRUE;
- if ((*field)->is_null())
- {
- if (insert_sql->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- insert_sql->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (
- spider_db_mysql_utility.
- append_column_value(spider, insert_sql, *field, NULL,
- share->access_charset) ||
- insert_sql->reserve(SPIDER_SQL_COMMA_LEN)
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if (add_value)
- insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
- if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN, SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
- {
- exec_insert_sql = insert_sql;
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
-) {
- int error_num;
- spider_string *str = &update_sql;
- DBUG_ENTER("spider_mysql_handler::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->length() > 0)
- {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
-
- if (
- (error_num = append_update(str, 0)) ||
- (error_num = append_update_set(str)) ||
- (error_num = append_update_where(str, table, ptr_diff))
- )
- DBUG_RETURN(error_num);
- filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.update_sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->length() > 0)
- {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
-
- if (
- (error_num = append_update(str, link_idx)) ||
- (error_num = append_update_set(str)) ||
- (error_num = append_update_where(str, table, ptr_diff))
- )
- DBUG_RETURN(error_num);
-
- if (
- spider->pk_update &&
- share->link_statuses[link_idx] == SPIDER_LINK_STATUS_RECOVERY
- ) {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- if ((error_num = append_insert_for_recovery(
- SPIDER_SQL_TYPE_UPDATE_SQL, link_idx)))
- DBUG_RETURN(error_num);
- }
-
- if (!filled_up)
- filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
-) {
- int error_num;
- spider_string *str = &update_sql;
- DBUG_ENTER("spider_mysql_handler::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->length() > 0)
- {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
-
- if (
- (error_num = append_delete(str)) ||
- (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL,
- first_link_idx)) ||
- (error_num = append_update_where(str, table, ptr_diff))
- )
- DBUG_RETURN(error_num);
- filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
-) {
- int error_num;
- spider_string *str = &spider->result_list.update_sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->length() > 0)
- {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
-
- if (
- (error_num = append_delete(str)) ||
- (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL, link_idx)) ||
- (error_num = append_update_where(str, table, ptr_diff))
- )
- DBUG_RETURN(error_num);
- if (!filled_up)
- filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_insert_part()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_insert_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_insert(&insert_sql, 0);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_insert(
- spider_string *str,
- int link_idx
-) {
- SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_mysql_handler::append_insert");
- if (
- (
- spider->write_can_replace ||
- /* for direct_dup_insert without patch for partition */
- spider->sql_command == SQLCOM_REPLACE ||
- spider->sql_command == SQLCOM_REPLACE_SELECT
- ) &&
- spider->direct_dup_insert
- ) {
- if (str->reserve(SPIDER_SQL_REPLACE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_INSERT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
- }
- if (spider->low_priority)
- {
- if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
- }
- else if (spider->insert_delayed)
- {
- if (share->internal_delayed)
- {
- if (str->reserve(SPIDER_SQL_SQL_DELAYED_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
- }
- }
- else if (
- spider->lock_type >= TL_WRITE &&
- !spider->write_can_replace &&
- /* for direct_dup_insert without patch for partition */
- spider->sql_command != SQLCOM_REPLACE &&
- spider->sql_command != SQLCOM_REPLACE_SELECT
- ) {
- if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
- }
- if (
- spider->ignore_dup_key &&
- spider->direct_dup_insert &&
- !spider->write_can_replace &&
- !spider->insert_with_update &&
- /* for direct_dup_insert without patch for partition */
- spider->sql_command != SQLCOM_REPLACE &&
- spider->sql_command != SQLCOM_REPLACE_SELECT
- ) {
- if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_update_part()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_update_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_update(&update_sql, 0);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_update(
- spider_string *str,
- int link_idx
-) {
- DBUG_ENTER("spider_mysql_handler::append_update");
- if (str->reserve(SPIDER_SQL_UPDATE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_UPDATE_STR, SPIDER_SQL_UPDATE_LEN);
- if (spider->low_priority)
- {
- if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
- }
- if (
- spider->ignore_dup_key &&
- !spider->insert_with_update
- ) {
- if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
- }
- if (str->reserve(mysql_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- table_name_pos = str->length();
- append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_UPDATE_SQL);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_delete_part()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_delete_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_delete(&update_sql);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_delete(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_delete");
- if (str->reserve(SPIDER_SQL_DELETE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_DELETE_STR, SPIDER_SQL_DELETE_LEN);
- if (spider->low_priority)
- {
- if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
- }
- if (spider->quick_mode)
- {
- if (str->reserve(SPIDER_SQL_SQL_QUICK_MODE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_QUICK_MODE_STR,
- SPIDER_SQL_SQL_QUICK_MODE_LEN);
- }
- if (spider->ignore_dup_key)
- {
- if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
- }
- str->length(str->length() - 1);
- DBUG_RETURN(0);
-}
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_mysql_handler::append_increment_update_set_part()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_increment_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_increment_update_set(&update_sql);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_increment_update_set(
- spider_string *str
-) {
- uint field_name_length;
- uint roop_count;
- Field *field;
- DBUG_ENTER("spider_mysql_handler::append_increment_update_set");
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- const SPIDER_HS_STRING_REF *value = hs_upds.ptr();
- for (roop_count = 0; roop_count < hs_upds.size();
- roop_count++)
- {
- if (
- value[roop_count].size() == 1 &&
- *(value[roop_count].begin()) == '0'
- )
- continue;
-
- 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;
- field_name_length =
- mysql_share->column_name_str[field->field_index].length();
-
- if (str->reserve(field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
- SPIDER_SQL_COMMA_LEN + value[roop_count].size()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- mysql_share->append_column_name(str, field->field_index);
- if (spider->hs_increment)
- str->q_append(SPIDER_SQL_HS_INCREMENT_STR,
- SPIDER_SQL_HS_INCREMENT_LEN);
- else
- str->q_append(SPIDER_SQL_HS_DECREMENT_STR,
- SPIDER_SQL_HS_DECREMENT_LEN);
- str->q_append(value[roop_count].begin(), value[roop_count].size());
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-#endif
-#endif
-
-int spider_mysql_handler::append_update_set_part()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_update_set(&update_sql);
- where_pos = update_sql.length();
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_update_set(
- spider_string *str
-) {
- uint field_name_length;
- SPIDER_SHARE *share = spider->share;
- TABLE *table = spider->get_table();
- Field **fields;
- DBUG_ENTER("spider_mysql_handler::append_update_set");
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- for (fields = table->field; *fields; fields++)
- {
- if (bitmap_is_set(table->write_set, (*fields)->field_index))
- {
- field_name_length =
- mysql_share->column_name_str[(*fields)->field_index].length();
- if ((*fields)->is_null())
- {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, (*fields)->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, (*fields)->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
-#ifndef DBUG_OFF
- my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
- table->read_set);
-#endif
- if (
- spider_db_mysql_utility.
- append_column_value(spider, str, *fields, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_COMMA_LEN)
- ) {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- }
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_mysql_handler::append_direct_update_set_part()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_direct_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_direct_update_set(&update_sql);
- where_pos = update_sql.length();
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_direct_update_set(
- spider_string *str
-) {
- uint field_name_length;
- SPIDER_SHARE *share = spider->share;
-#ifndef DBUG_OFF
- TABLE *table = spider->get_table();
-#endif
- DBUG_ENTER("spider_mysql_handler::append_direct_update_set");
- if (
- spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
- spider->direct_update_fields
- ) {
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- DBUG_RETURN(spider_db_append_update_columns(spider, str, NULL, 0,
- spider_dbton_mysql.dbton_id));
- }
-
- if (
- (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
- ) {
- size_t roop_count;
- Field *field;
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- 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;
- field_name_length =
- mysql_share->column_name_str[field->field_index].length();
- if (top_table_field->is_null())
- {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
-#ifndef DBUG_OFF
- my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
- table->read_set);
-#endif
- if (
- spider_db_mysql_utility.
- append_column_value(spider, str, top_table_field, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_COMMA_LEN)
- ) {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- }
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_dup_update_pushdown_part(
- const char *alias,
- uint alias_length
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_dup_update_pushdown_part");
- DBUG_PRINT("info",("spider this=%p", this));
- dup_update_sql.length(0);
- error_num = append_update_columns(&dup_update_sql, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_update_columns_part(
- const char *alias,
- uint alias_length
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_update_columns_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_update_columns(&update_sql, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::check_update_columns_part()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::check_update_columns_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_update_columns(NULL, NULL, 0);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_update_columns(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_update_columns");
- error_num = spider_db_append_update_columns(spider, str,
- alias, alias_length, spider_dbton_mysql.dbton_id);
- DBUG_RETURN(error_num);
-}
-#endif
-
-int spider_mysql_handler::append_select_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_select(str, sql_type);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_select(
- spider_string *str,
- ulong sql_type
-) {
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- DBUG_ENTER("spider_mysql_handler::append_select");
- if (sql_type == SPIDER_SQL_TYPE_HANDLER)
- {
- if (str->reserve(SPIDER_SQL_HANDLER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_SELECT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
- if (result_list->lock_type != F_WRLCK && spider->lock_mode < 1)
- {
- /* no lock */
- if (spider->share->query_cache == 1)
- {
- if (str->reserve(SPIDER_SQL_SQL_CACHE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_CACHE_STR, SPIDER_SQL_SQL_CACHE_LEN);
- } else if (spider->share->query_cache == 2)
- {
- if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR,
- SPIDER_SQL_SQL_NO_CACHE_LEN);
- }
- }
- if (spider->high_priority)
- {
- if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR,
- SPIDER_SQL_HIGH_PRIORITY_LEN);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_table_select_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_table_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_table_select(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_table_select(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_table_select");
- table_name_pos = str->length() + mysql_share->table_select_pos;
- if (str->append(*(mysql_share->table_select)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_key_select_part(
- ulong sql_type,
- uint idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_select(str, idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_key_select(
- spider_string *str,
- uint idx
-) {
- DBUG_ENTER("spider_mysql_handler::append_key_select");
- table_name_pos = str->length() + mysql_share->key_select_pos[idx];
- if (str->append(mysql_share->key_select[idx]))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_minimum_select_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_minimum_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_minimum_select(str, sql_type);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_minimum_select(
- spider_string *str,
- ulong sql_type
-) {
- TABLE *table = spider->get_table();
- Field **field;
- int field_length;
- bool appended = FALSE;
- DBUG_ENTER("spider_mysql_handler::append_minimum_select");
- for (field = table->field; *field; field++)
- {
- if (minimum_select_bit_is_set((*field)->field_index))
- {
- field_length =
- mysql_share->column_name_str[(*field)->field_index].length();
- if (str->reserve(field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- appended = TRUE;
- }
- }
- if (appended)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- else {
- if (str->reserve(SPIDER_SQL_ONE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
- }
- DBUG_RETURN(append_from(str, sql_type, first_link_idx));
-}
-
-int spider_mysql_handler::append_table_select_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- TABLE *table = spider->get_table();
- Field **field;
- int field_length;
- DBUG_ENTER("spider_mysql_handler::append_table_select_with_alias");
- for (field = table->field; *field; field++)
- {
- field_length =
- mysql_share->column_name_str[(*field)->field_index].length();
- if (str->reserve(alias_length + field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_key_select_with_alias(
- spider_string *str,
- const KEY *key_info,
- const char *alias,
- uint alias_length
-) {
- KEY_PART_INFO *key_part;
- Field *field;
- uint part_num;
- int field_length;
- DBUG_ENTER("spider_mysql_handler::append_key_select_with_alias");
- for (key_part = key_info->key_part, part_num = 0;
- part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
- {
- field = key_part->field;
- field_length = mysql_share->column_name_str[field->field_index].length();
- if (str->reserve(alias_length + field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_minimum_select_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- TABLE *table = spider->get_table();
- Field **field;
- int field_length;
- bool appended = FALSE;
- DBUG_ENTER("spider_mysql_handler::append_minimum_select_with_alias");
- for (field = table->field; *field; field++)
- {
- if (minimum_select_bit_is_set((*field)->field_index))
- {
- field_length =
- mysql_share->column_name_str[(*field)->field_index].length();
- if (str->reserve(alias_length + field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- appended = TRUE;
- }
- }
- if (appended)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- else {
- if (str->reserve(SPIDER_SQL_ONE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_select_columns_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- DBUG_ENTER("spider_mysql_handler::append_select_columns_with_alias");
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- if (
- result_list->direct_aggregate &&
- (error_num = append_sum_select(str, alias, alias_length))
- )
- DBUG_RETURN(error_num);
-#endif
- if ((error_num = append_match_select(str, alias, alias_length)))
- DBUG_RETURN(error_num);
- if (!spider->select_column_mode)
- {
- if (result_list->keyread)
- DBUG_RETURN(append_key_select_with_alias(
- str, result_list->key_info, alias, alias_length));
- else
- DBUG_RETURN(append_table_select_with_alias(
- str, alias, alias_length));
- }
- DBUG_RETURN(append_minimum_select_with_alias(str, alias, alias_length));
-}
-
-int spider_mysql_handler::append_hint_after_table_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_hint_after_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_hint_after_table(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_hint_after_table(
- spider_string *str
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_hint_after_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (
- mysql_share->key_hint &&
- (error_num = spider_db_append_hint_after_table(spider,
- str, &mysql_share->key_hint[spider->active_index]))
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_RETURN(0);
-}
-
-void spider_mysql_handler::set_where_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::set_where_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- where_pos = sql.length();
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- where_pos = update_sql.length();
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- ha_read_pos = ha_sql.length();
- break;
- default:
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_mysql_handler::set_where_to_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::set_where_to_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- sql.length(where_pos);
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- update_sql.length(where_pos);
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- ha_sql.length(ha_read_pos);
- break;
- default:
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_handler::check_item_type(
- Item *item
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::check_item_type");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = spider_db_print_item_type(item, spider, NULL, NULL, 0,
- spider_dbton_mysql.dbton_id);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_values_connector_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_values_connector_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_values_connector(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_values_connector(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_values_connector");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
- SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_values_terminator_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_values_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_values_terminator(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_values_terminator(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_values_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(str->length() -
- SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_union_table_connector_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_table_connector_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_table_connector(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_union_table_connector(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_union_table_connector");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_union_table_terminator_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_table_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_table_terminator(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_union_table_terminator(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_union_table_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(str->length() -
- ((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN));
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- table_name_pos = str->length() + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_A_LEN +
- SPIDER_SQL_COMMA_LEN;
- if (str->reserve(tmp_sql.length() - SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(tmp_sql.ptr() + SPIDER_SQL_FROM_LEN,
- tmp_sql.length() - SPIDER_SQL_FROM_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_key_column_values_part(
- const key_range *start_key,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_column_values_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_column_values(str, start_key);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_key_column_values(
- spider_string *str,
- const key_range *start_key
-) {
- int error_num;
- const uchar *ptr;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- SPIDER_SHARE *share = spider->share;
- KEY *key_info = result_list->key_info;
- uint length;
- uint store_length;
- key_part_map full_key_part_map =
- make_prev_keypart_map(spider_user_defined_key_parts(key_info));
- key_part_map start_key_part_map;
- KEY_PART_INFO *key_part;
- Field *field;
- DBUG_ENTER("spider_mysql_handler::append_key_column_values");
- start_key_part_map = start_key->keypart_map & full_key_part_map;
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
- DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
- DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
-
- if (!start_key_part_map)
- DBUG_RETURN(0);
-
- for (
- key_part = key_info->key_part,
- length = 0;
- start_key_part_map;
- start_key_part_map >>= 1,
- key_part++,
- length += store_length
- ) {
- store_length = key_part->store_length;
- ptr = start_key->key + length;
- field = key_part->field;
- if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
- {
- if (error_num > 0)
- DBUG_RETURN(error_num);
- } else {
- if (spider_db_mysql_utility.append_column_value(spider, str, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- 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);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_key_column_values_with_name_part(
- const key_range *start_key,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_column_values_with_name_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_column_values_with_name(str, start_key);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_key_column_values_with_name(
- spider_string *str,
- const key_range *start_key
-) {
- int error_num;
- const uchar *ptr;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- SPIDER_SHARE *share = spider->share;
- KEY *key_info = result_list->key_info;
- uint length;
- uint key_name_length, key_count;
- uint store_length;
- key_part_map full_key_part_map =
- make_prev_keypart_map(spider_user_defined_key_parts(key_info));
- key_part_map start_key_part_map;
- KEY_PART_INFO *key_part;
- Field *field;
- char tmp_buf[MAX_FIELD_WIDTH];
- DBUG_ENTER("spider_mysql_handler::append_key_column_values_with_name");
- start_key_part_map = start_key->keypart_map & full_key_part_map;
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
- DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
- DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
-
- if (!start_key_part_map)
- DBUG_RETURN(0);
-
- for (
- key_part = key_info->key_part,
- length = 0,
- key_count = 0;
- start_key_part_map;
- start_key_part_map >>= 1,
- key_part++,
- length += store_length,
- key_count++
- ) {
- store_length = key_part->store_length;
- ptr = start_key->key + length;
- field = key_part->field;
- if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
- {
- if (error_num > 0)
- DBUG_RETURN(error_num);
- } else {
- if (spider_db_mysql_utility.append_column_value(spider, str, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
- if (str->reserve(SPIDER_SQL_SPACE_LEN + key_name_length +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(tmp_buf, key_name_length);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_key_where_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type
-) {
- int error_num;
- spider_string *str, *str_part = NULL, *str_part2 = NULL;
- bool set_order;
- DBUG_ENTER("spider_mysql_handler::append_key_where_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- set_order = FALSE;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- set_order = FALSE;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- set_order = FALSE;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- ha_read_pos = str->length();
- str_part = &sql_part;
- str_part2 = &sql_part2;
- str_part->length(0);
- str_part2->length(0);
- set_order = TRUE;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_where(str, str_part, str_part2, start_key, end_key,
- sql_type, set_order);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_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_mysql_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_mysql.dbton_id);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_is_null_part(
- ulong sql_type,
- KEY_PART_INFO *key_part,
- const key_range *key,
- const uchar **ptr,
- bool key_eq
-) {
- int error_num;
- spider_string *str, *str_part = NULL, *str_part2 = NULL;
- DBUG_ENTER("spider_mysql_handler::append_is_null_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- str_part = &sql_part;
- str_part2 = &sql_part2;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_is_null(sql_type, str, str_part, str_part2,
- key_part, key, ptr, key_eq);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_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
-) {
- DBUG_ENTER("spider_mysql_handler::append_is_null");
- DBUG_PRINT("info",("spider this=%p", this));
- if (key_part->null_bit)
- {
- if (*(*ptr)++)
- {
- if (sql_type == SPIDER_SQL_TYPE_HANDLER)
- {
- str = str_part;
- if (
- key_eq ||
- key->flag == HA_READ_KEY_EXACT ||
- key->flag == HA_READ_KEY_OR_NEXT
- ) {
- if (str->reserve(SPIDER_SQL_IS_NULL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
- } else {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- ha_next_pos = str->length();
- if (str->reserve(SPIDER_SQL_FIRST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
- spider->result_list.ha_read_kind = 1;
- }
- str = str_part2;
- }
- if (
- key_eq ||
- key->flag == HA_READ_KEY_EXACT ||
- key->flag == HA_READ_KEY_OR_NEXT
- ) {
- if (str->reserve(SPIDER_SQL_IS_NULL_LEN +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- mysql_share->column_name_str[key_part->field->field_index].length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, key_part->field->field_index);
- str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_IS_NOT_NULL_LEN +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- mysql_share->column_name_str[key_part->field->field_index].length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, key_part->field->field_index);
- str->q_append(SPIDER_SQL_IS_NOT_NULL_STR, SPIDER_SQL_IS_NOT_NULL_LEN);
- }
- DBUG_RETURN(-1);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_where_terminator_part(
- ulong sql_type,
- bool set_order,
- int key_count
-) {
- int error_num;
- spider_string *str, *str_part = NULL, *str_part2 = NULL;
- DBUG_ENTER("spider_mysql_handler::append_where_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- str_part = &sql_part;
- str_part2 = &sql_part2;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_where_terminator(sql_type, str, str_part, str_part2,
- set_order, key_count);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_where_terminator(
- ulong sql_type,
- spider_string *str,
- spider_string *str_part,
- spider_string *str_part2,
- bool set_order,
- int key_count
-) {
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- DBUG_ENTER("spider_mysql_handler::append_where_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type != SPIDER_SQL_TYPE_HANDLER)
- {
- str->length(str->length() - SPIDER_SQL_AND_LEN);
- if (!set_order)
- result_list->key_order = key_count;
- } else {
- str_part2->length(str_part2->length() - SPIDER_SQL_AND_LEN);
-
- str_part->length(str_part->length() - SPIDER_SQL_COMMA_LEN);
- if (!result_list->ha_read_kind)
- str_part->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- if (str->append(*str_part))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- uint clause_length = str->length() - ha_next_pos;
- if (clause_length < SPIDER_SQL_NEXT_LEN)
- {
- int roop_count;
- clause_length = SPIDER_SQL_NEXT_LEN - clause_length;
- if (str->reserve(clause_length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- for (roop_count = 0; roop_count < (int) clause_length; roop_count++)
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_match_where_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_match_where_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
- }
- error_num = append_match_where(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_match_where(
- spider_string *str
-) {
- int error_num;
- bool first = TRUE;
- st_spider_ft_info *ft_info = spider->ft_first;
- DBUG_ENTER("spider_mysql_handler::append_match_where");
- if (spider->ft_current)
- {
- while (TRUE)
- {
- if (ft_info->used_in_where)
- {
- if (first)
- {
- if (str->reserve(SPIDER_SQL_WHERE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- first = FALSE;
- }
- if ((error_num = append_match_against(str, ft_info, NULL, 0)))
- DBUG_RETURN(error_num);
- if (str->reserve(SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
-
- if (ft_info == spider->ft_current)
- break;
- ft_info = ft_info->next;
- }
- if (!first)
- str->length(str->length() - SPIDER_SQL_AND_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_update_where(
- spider_string *str,
- const TABLE *table,
- my_ptrdiff_t ptr_diff
-) {
- uint field_name_length;
- Field **field;
- SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_mysql_handler::append_update_where");
- if (str->reserve(SPIDER_SQL_WHERE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- for (field = table->field; *field; field++)
- {
- if (
- table->s->primary_key == MAX_KEY ||
- bitmap_is_set(table->read_set, (*field)->field_index)
- ) {
- field_name_length =
- mysql_share->column_name_str[(*field)->field_index].length();
- if ((*field)->is_null(ptr_diff))
- {
- if (str->reserve(field_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
- } else {
- if (str->reserve(field_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- (*field)->move_field_offset(ptr_diff);
- if (
- spider_db_mysql_utility.
- append_column_value(spider, str, *field, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_AND_LEN)
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- (*field)->move_field_offset(-ptr_diff);
- }
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
- }
- str->length(str->length() - SPIDER_SQL_AND_LEN);
- if (str->reserve(SPIDER_SQL_LIMIT1_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LIMIT1_STR, SPIDER_SQL_LIMIT1_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_condition_part(
- const char *alias,
- uint alias_length,
- ulong sql_type,
- bool test_flg
-) {
- int error_num;
- spider_string *str;
- bool start_where = FALSE;
- DBUG_ENTER("spider_mysql_handler::append_condition_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- if (test_flg)
- {
- str = NULL;
- } else {
- str = &sql;
- start_where = ((int) str->length() == where_pos);
- }
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- if (test_flg)
- {
- str = NULL;
- } else {
- str = &tmp_sql;
- start_where = ((int) str->length() == where_pos);
- }
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- if (test_flg)
- {
- str = NULL;
- } else {
- str = &update_sql;
- start_where = ((int) str->length() == where_pos);
- }
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- if (test_flg)
- {
- str = NULL;
- } else {
- str = &ha_sql;
- start_where = TRUE;
- if (spider->active_index == MAX_KEY)
- {
- set_where_pos(SPIDER_SQL_TYPE_HANDLER);
- if (str->reserve(SPIDER_SQL_READ_LEN + SPIDER_SQL_FIRST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_READ_STR, SPIDER_SQL_READ_LEN);
- ha_next_pos = str->length();
- str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
- sql_part2.length(0);
- }
- ha_where_pos = str->length();
-
- if (sql_part2.length())
- {
- str->append(sql_part2);
- start_where = FALSE;
- }
- }
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_condition(str, alias, alias_length, start_where,
- sql_type);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_condition(
- spider_string *str,
- const char *alias,
- uint alias_length,
- bool start_where,
- ulong sql_type
-) {
- int error_num, restart_pos = 0, start_where_pos;
- SPIDER_CONDITION *tmp_cond = spider->condition;
- DBUG_ENTER("spider_mysql_handler::append_condition");
- if (str && start_where)
- {
- start_where_pos = str->length();
- } else {
- start_where_pos = 0;
- }
-
- if (spider->is_clone && !tmp_cond)
- {
- tmp_cond = spider->pt_clone_source_handler->condition;
- }
-
- while (tmp_cond)
- {
- if (str)
- {
- restart_pos = str->length();
- if (start_where)
- {
- if (str->reserve(SPIDER_SQL_WHERE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- start_where = FALSE;
- } else {
- if (str->reserve(SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
- }
- if ((error_num = spider_db_print_item_type(
- (Item *) tmp_cond->cond, spider, str, alias, alias_length,
- spider_dbton_mysql.dbton_id)))
- {
- if (str && error_num == ER_SPIDER_COND_SKIP_NUM)
- {
- DBUG_PRINT("info",("spider COND skip"));
- str->length(restart_pos);
- start_where = (restart_pos == start_where_pos);
- } else
- DBUG_RETURN(error_num);
- }
- tmp_cond = tmp_cond->next;
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_match_against_part(
- ulong sql_type,
- st_spider_ft_info *ft_info,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_match_against_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_match_against(str, ft_info, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_match_against(
- spider_string *str,
- st_spider_ft_info *ft_info,
- const char *alias,
- uint alias_length
-) {
- SPIDER_SHARE *share = spider->share;
- TABLE *table = spider->get_table();
- String *ft_init_key;
- KEY *key_info;
- uint key_name_length;
- int key_count;
- KEY_PART_INFO *key_part;
- Field *field;
- DBUG_ENTER("spider_mysql_handler::append_match_against");
- DBUG_PRINT("info",("spider this=%p", this));
- 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);
-
- ft_init_key = ft_info->key;
- key_info = &table->key_info[ft_info->inx];
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
-
- for (
- key_part = key_info->key_part,
- key_count = 0;
- key_count < (int) spider_user_defined_key_parts(key_info);
- key_part++,
- key_count++
- ) {
- field = key_part->field;
- key_name_length =
- mysql_share->column_name_str[field->field_index].length();
- if (alias_length)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- } else {
- if (str->reserve(key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- if (str->reserve(SPIDER_SQL_AGAINST_LEN + SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
-
- char buf[MAX_FIELD_WIDTH];
- spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
- tmp_str.init_calc_mem(116);
- tmp_str.length(0);
- if (
- tmp_str.append(ft_init_key->ptr(), ft_init_key->length(),
- ft_init_key->charset()) ||
- str->reserve(tmp_str.length() * 2) ||
- spider_db_mysql_utility.append_escaped_util(str, tmp_str.get_str())
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->mem_calc();
-
- if (str->reserve(
- SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_CLOSE_PAREN_LEN +
- ((ft_info->flags & FT_BOOL) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
- ((ft_info->flags & FT_EXPAND) ?
- SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
- ))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- if (ft_info->flags & FT_BOOL)
- str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
- SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
- if (ft_info->flags & FT_EXPAND)
- str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
- SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_match_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_match_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_match_select(str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_match_select(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_match_select");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider->ft_current)
- {
- st_spider_ft_info *ft_info = spider->ft_first;
- while (TRUE)
- {
- if ((error_num = append_match_against(str, ft_info,
- alias, alias_length)))
- DBUG_RETURN(error_num);
- 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 (ft_info == spider->ft_current)
- break;
- ft_info = ft_info->next;
- }
- }
- DBUG_RETURN(0);
-}
-
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_mysql_handler::append_sum_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_sum_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_sum_select(str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_sum_select(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- st_select_lex *select_lex;
- DBUG_ENTER("spider_mysql_handler::append_sum_select");
- DBUG_PRINT("info",("spider this=%p", this));
- select_lex = spider_get_select_lex(spider);
- JOIN *join = select_lex->join;
- Item_sum **item_sum_ptr;
- for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
- {
- if ((error_num = spider_db_mysql_utility.open_item_sum_func(*item_sum_ptr,
- spider, str, alias, alias_length)))
- {
- DBUG_RETURN(error_num);
- }
- 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);
- }
- DBUG_RETURN(0);
-}
-#endif
-
-void spider_mysql_handler::set_order_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::set_order_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- order_pos = sql.length();
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- order_pos = update_sql.length();
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- ha_next_pos = ha_sql.length();
- break;
- default:
- DBUG_ASSERT(0);
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_mysql_handler::set_order_to_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::set_order_to_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- sql.length(order_pos);
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- update_sql.length(order_pos);
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- ha_sql.length(ha_next_pos);
- break;
- default:
- DBUG_ASSERT(0);
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_mysql_handler::append_group_by(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- st_select_lex *select_lex;
- DBUG_ENTER("spider_mysql_handler::append_group_by");
- DBUG_PRINT("info",("spider this=%p", this));
- select_lex = spider_get_select_lex(spider);
- ORDER *group = (ORDER *) select_lex->group_list.first;
- if (group)
- {
- if (str->reserve(SPIDER_SQL_GROUP_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
- for (; group; group = group->next)
- {
- if ((error_num = spider_db_print_item_type((*group->item), spider, str,
- alias, alias_length, spider_dbton_mysql.dbton_id)))
- {
- DBUG_RETURN(error_num);
- }
- 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);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- DBUG_RETURN(0);
-}
-#endif
-
-int spider_mysql_handler::append_key_order_for_merge_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_merge_with_alias_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- ha_limit_pos = ha_sql.length();
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_order_for_merge_with_alias(str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_key_order_for_merge_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- /* sort for index merge */
- TABLE *table = spider->get_table();
- int length;
- Field *field;
- uint key_name_length;
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_merge_with_alias");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- if (spider->result_list.direct_aggregate)
- {
- int error_num;
- if ((error_num = append_group_by(str, alias, alias_length)))
- DBUG_RETURN(error_num);
- }
-#endif
- if (table->s->primary_key < MAX_KEY)
- {
- /* sort by primary key */
- KEY *key_info = &table->key_info[table->s->primary_key];
- KEY_PART_INFO *key_part;
- for (
- key_part = key_info->key_part,
- length = 1;
- length <= (int) spider_user_defined_key_parts(key_info);
- key_part++,
- length++
- ) {
- field = key_part->field;
- key_name_length =
- mysql_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if (length > 1)
- {
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- } else {
- /* sort by all columns */
- Field **fieldp;
- for (
- fieldp = table->field, length = 1;
- *fieldp;
- fieldp++, length++
- ) {
- key_name_length =
- mysql_share->column_name_str[(*fieldp)->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, (*fieldp)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if (length > 1)
- {
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- }
- limit_pos = str->length();
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_order_for_direct_order_limit_with_alias(
- str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- ORDER *order;
- st_select_lex *select_lex;
- longlong select_limit;
- longlong offset_limit;
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- if (spider->result_list.direct_aggregate)
- {
- if ((error_num = append_group_by(str, alias, alias_length)))
- DBUG_RETURN(error_num);
- }
-#endif
- spider_get_select_limit(spider, &select_lex, &select_limit,
- &offset_limit);
- if (select_lex->order_list.first)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- for (order = (ORDER *) select_lex->order_list.first; order;
- order = order->next)
- {
- if ((error_num =
- spider_db_print_item_type((*order->item), spider, str, alias,
- alias_length, spider_dbton_mysql.dbton_id)))
- {
- DBUG_PRINT("info",("spider error=%d", error_num));
- DBUG_RETURN(error_num);
- }
- if (order->asc)
- {
- 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);
- } else {
- if (str->reserve(SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- limit_pos = str->length();
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_key_order_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_order_with_alias_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- error_num = append_key_order_for_handler(str, alias, alias_length);
- DBUG_RETURN(error_num);
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_order_with_alias(str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_key_order_for_handler(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider ha_next_pos=%d", ha_next_pos));
- DBUG_PRINT("info",("spider ha_where_pos=%d", ha_where_pos));
- str->q_append(alias, alias_length);
- memset((char *) str->ptr() + str->length(), ' ',
- ha_where_pos - ha_next_pos - alias_length);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_key_order_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- KEY *key_info = result_list->key_info;
- int length;
- KEY_PART_INFO *key_part;
- Field *field;
- uint key_name_length;
- DBUG_ENTER("spider_mysql_handler::append_key_order_with_alias");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- if (spider->result_list.direct_aggregate)
- {
- int error_num;
- if ((error_num = append_group_by(str, alias, alias_length)))
- DBUG_RETURN(error_num);
- }
-#endif
- if (result_list->sorted == TRUE)
- {
- if (result_list->desc_flg == TRUE)
- {
- for (
- key_part = key_info->key_part + result_list->key_order,
- length = 1;
- length + result_list->key_order <
- (int) spider_user_defined_key_parts(key_info) &&
- length < result_list->max_order;
- key_part++,
- length++
- ) {
- field = key_part->field;
- key_name_length =
- mysql_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- if (
- length + result_list->key_order <=
- (int) spider_user_defined_key_parts(key_info) &&
- length <= result_list->max_order
- ) {
- field = key_part->field;
- key_name_length =
- mysql_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- } else {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- }
- }
- } else {
- for (
- key_part = key_info->key_part + result_list->key_order,
- length = 1;
- length + result_list->key_order <
- (int) spider_user_defined_key_parts(key_info) &&
- length < result_list->max_order;
- key_part++,
- length++
- ) {
- field = key_part->field;
- key_name_length =
- mysql_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- if (
- length + result_list->key_order <=
- (int) spider_user_defined_key_parts(key_info) &&
- length <= result_list->max_order
- ) {
- field = key_part->field;
- key_name_length =
- mysql_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- } else {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- mysql_share->append_column_name(str, field->field_index);
- }
- }
- }
- }
- limit_pos = str->length();
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_limit_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- limit_pos = str->length();
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- limit_pos = str->length();
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- limit_pos = str->length();
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- ha_limit_pos = str->length();
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_limit(str, offset, limit);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::reappend_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::reappend_limit_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- str->length(limit_pos);
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- str->length(limit_pos);
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- str->length(limit_pos);
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- str->length(ha_limit_pos);
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_limit(str, offset, limit);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_limit(
- spider_string *str,
- longlong offset,
- longlong limit
-) {
- char buf[SPIDER_LONGLONG_LEN + 1];
- uint32 length;
- DBUG_ENTER("spider_mysql_handler::append_limit");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info", ("spider offset=%lld", offset));
- DBUG_PRINT("info", ("spider limit=%lld", limit));
- if (offset || limit < 9223372036854775807LL)
- {
- if (str->reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
- ((SPIDER_LONGLONG_LEN) * 2)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
- if (offset)
- {
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
- str->q_append(buf, length);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
- str->q_append(buf, length);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_select_lock_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_select_lock_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_select_lock(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_select_lock(
- spider_string *str
-) {
- int lock_mode = spider_conn_lock_mode(spider);
- DBUG_ENTER("spider_mysql_handler::append_select_lock");
- DBUG_PRINT("info",("spider this=%p", this));
- if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
- {
- if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
- } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
- {
- if (str->reserve(SPIDER_SQL_SHARED_LOCK_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_union_all_start_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_all_start_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_all_start(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_union_all_start(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_union_all_start");
- DBUG_PRINT("info",("spider this=%p", this));
- 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_RETURN(0);
-}
-
-int spider_mysql_handler::append_union_all_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_all_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_all(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_union_all(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_union_all");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_UNION_ALL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_union_all_end_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_all_end_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_all_end(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_union_all_end(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_union_all_end");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(str->length() -
- SPIDER_SQL_UNION_ALL_LEN + SPIDER_SQL_CLOSE_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_multi_range_cnt_part(
- ulong sql_type,
- uint multi_range_cnt,
- bool with_comma
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_multi_range_cnt(str, multi_range_cnt, with_comma);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_multi_range_cnt(
- spider_string *str,
- uint multi_range_cnt,
- bool with_comma
-) {
- int range_cnt_length;
- char range_cnt_str[SPIDER_SQL_INT_LEN];
- DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt");
- DBUG_PRINT("info",("spider this=%p", this));
- range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
- multi_range_cnt));
- if (with_comma)
- {
- if (str->reserve(range_cnt_length + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(range_cnt_str, range_cnt_length);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (str->reserve(range_cnt_length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(range_cnt_str, range_cnt_length);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_multi_range_cnt_with_name_part(
- ulong sql_type,
- uint multi_range_cnt
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt_with_name_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_multi_range_cnt_with_name(str, multi_range_cnt);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_multi_range_cnt_with_name(
- spider_string *str,
- uint multi_range_cnt
-) {
- int range_cnt_length;
- char range_cnt_str[SPIDER_SQL_INT_LEN];
- DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt_with_name");
- DBUG_PRINT("info",("spider this=%p", this));
- range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
- multi_range_cnt));
- if (str->reserve(range_cnt_length + SPIDER_SQL_SPACE_LEN +
- SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(range_cnt_str, range_cnt_length);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_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_mysql_handler::append_open_handler_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_open_handler(str, handler_id, conn, link_idx);
- exec_ha_sql = str;
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_open_handler(
- spider_string *str,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_open_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider link_idx=%d", link_idx));
- DBUG_PRINT("info",("spider m_handler_cid=%s",
- spider->m_handler_cid[link_idx]));
- if (str->reserve(SPIDER_SQL_HANDLER_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
- if ((error_num = mysql_share->append_table_name(str,
- spider->conn_link_idx[link_idx])))
- DBUG_RETURN(error_num);
- if (str->reserve(SPIDER_SQL_OPEN_LEN + SPIDER_SQL_AS_LEN +
- SPIDER_SQL_HANDLER_CID_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_OPEN_STR, SPIDER_SQL_OPEN_LEN);
- str->q_append(SPIDER_SQL_AS_STR, SPIDER_SQL_AS_LEN);
- str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_close_handler_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_close_handler_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_close_handler(str, link_idx);
- exec_ha_sql = str;
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_close_handler(
- spider_string *str,
- int link_idx
-) {
- DBUG_ENTER("spider_mysql_handler::append_close_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_HANDLER_LEN + SPIDER_SQL_CLOSE_LEN +
- SPIDER_SQL_HANDLER_CID_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
- str->q_append(spider->m_handler_cid[link_idx],
- SPIDER_SQL_HANDLER_CID_LEN);
- str->q_append(SPIDER_SQL_CLOSE_STR, SPIDER_SQL_CLOSE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_insert_terminator_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_insert_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_SQL:
- str = &insert_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_insert_terminator(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_insert_terminator(
- spider_string *str
-) {
- DBUG_ENTER("spider_mysql_handler::append_insert_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider->result_list.insert_dup_update_pushdown)
- {
- DBUG_PRINT("info",("spider add duplicate key update"));
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- if (str->reserve(SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN +
- dup_update_sql.length()))
- {
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_DUPLICATE_KEY_UPDATE_STR,
- SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN);
- if (str->append(dup_update_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- } else {
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_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_SQL:
- str = &insert_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_insert_values(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_insert_values(
- spider_string *str
-) {
- SPIDER_SHARE *share = spider->share;
- TABLE *table = spider->get_table();
- Field **field;
- bool add_value = FALSE;
- DBUG_ENTER("spider_mysql_handler::append_insert_values");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
- {
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- 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
- add_value = TRUE;
- 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
- )
- ) {
- if (str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
- {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (
- spider_db_mysql_utility.
- append_column_value(spider, str, *field, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_COMMA_LEN)
- ) {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- }
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- }
- }
- if (add_value)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
- {
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_into_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_into_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_SQL:
- str = &insert_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_into(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_into(
- spider_string *str
-) {
- const TABLE *table = spider->get_table();
- Field **field;
- uint field_name_length = 0;
- DBUG_ENTER("spider_mysql_handler::append_into");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
- insert_table_name_pos = str->length();
- append_table_name_with_adjusting(str, first_link_idx,
- SPIDER_SQL_TYPE_INSERT_SQL);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- for (field = table->field; *field; field++)
- {
- if (
- bitmap_is_set(table->write_set, (*field)->field_index) ||
- bitmap_is_set(table->read_set, (*field)->field_index)
- ) {
- field_name_length =
- mysql_share->column_name_str[(*field)->field_index].length();
- if (str->reserve(field_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- if (field_name_length)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- if (str->reserve(SPIDER_SQL_VALUES_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
- insert_pos = str->length();
- DBUG_RETURN(0);
-}
-
-void spider_mysql_handler::set_insert_to_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::set_insert_to_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_SQL:
- insert_sql.length(insert_pos);
- break;
- default:
- DBUG_ASSERT(0);
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_handler::append_from_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_from_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- default:
- str = &sql;
- break;
- }
- error_num = append_from(str, sql_type, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_from(
- spider_string *str,
- ulong sql_type,
- int link_idx
-) {
- DBUG_ENTER("spider_mysql_handler::append_from");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider link_idx=%d", link_idx));
- if (sql_type == SPIDER_SQL_TYPE_HANDLER)
- {
- ha_table_name_pos = str->length();
- DBUG_PRINT("info",("spider ha_table_name_pos=%u", ha_table_name_pos));
- ha_sql_handler_id = spider->m_handler_id[link_idx];
- DBUG_PRINT("info",("spider ha_sql_handler_id=%u", ha_sql_handler_id));
- if (str->reserve(SPIDER_SQL_HANDLER_CID_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
- DBUG_PRINT("info",("spider m_handler_cid=%s",
- spider->m_handler_cid[link_idx]));
- } else {
- if (str->reserve(SPIDER_SQL_FROM_LEN + mysql_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- table_name_pos = str->length();
- append_table_name_with_adjusting(str, link_idx, sql_type);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_flush_tables_part(
- ulong sql_type,
- int link_idx,
- bool lock
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_flush_tables_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_flush_tables(str, link_idx, lock);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_flush_tables(
- spider_string *str,
- int link_idx,
- bool lock
-) {
- DBUG_ENTER("spider_mysql_handler::append_flush_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- if (lock)
- {
- if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN +
- SPIDER_SQL_WITH_READ_LOCK_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
- str->q_append(SPIDER_SQL_WITH_READ_LOCK_STR,
- SPIDER_SQL_WITH_READ_LOCK_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_optimize_table_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_optimize_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_optimize_table(str, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_optimize_table(
- spider_string *str,
- int link_idx
-) {
- SPIDER_SHARE *share = spider->share;
- int conn_link_idx = spider->conn_link_idx[link_idx];
- int local_length = spider_param_internal_optimize_local(spider->trx->thd,
- share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
- DBUG_ENTER("spider_mysql_handler::append_optimize_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_OPTIMIZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
- local_length +
- mysql_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- mysql_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_OPTIMIZE_STR, SPIDER_SQL_SQL_OPTIMIZE_LEN);
- if (local_length)
- str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
- str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
- mysql_share->append_table_name(str, conn_link_idx);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_analyze_table_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_analyze_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_analyze_table(str, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_analyze_table(
- spider_string *str,
- int link_idx
-) {
- SPIDER_SHARE *share = spider->share;
- int conn_link_idx = spider->conn_link_idx[link_idx];
- int local_length = spider_param_internal_optimize_local(spider->trx->thd,
- share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
- DBUG_ENTER("spider_mysql_handler::append_analyze_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_ANALYZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
- local_length +
- mysql_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- mysql_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_ANALYZE_STR, SPIDER_SQL_SQL_ANALYZE_LEN);
- if (local_length)
- str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
- str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
- mysql_share->append_table_name(str, conn_link_idx);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_repair_table_part(
- ulong sql_type,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_repair_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_repair_table(str, link_idx, check_opt);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_repair_table(
- spider_string *str,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- SPIDER_SHARE *share = spider->share;
- int conn_link_idx = spider->conn_link_idx[link_idx];
- int local_length = spider_param_internal_optimize_local(spider->trx->thd,
- share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
- DBUG_ENTER("spider_mysql_handler::append_repair_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_REPAIR_LEN + SPIDER_SQL_SQL_TABLE_LEN +
- local_length +
- mysql_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- mysql_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_REPAIR_STR, SPIDER_SQL_SQL_REPAIR_LEN);
- if (local_length)
- str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
- str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
- mysql_share->append_table_name(str, conn_link_idx);
- if (check_opt->flags & T_QUICK)
- {
- if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
- }
- if (check_opt->flags & T_EXTEND)
- {
- if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
- }
- if (check_opt->sql_flags & TT_USEFRM)
- {
- if (str->reserve(SPIDER_SQL_SQL_USE_FRM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_USE_FRM_STR, SPIDER_SQL_SQL_USE_FRM_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_check_table_part(
- ulong sql_type,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_check_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_check_table(str, link_idx, check_opt);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_check_table(
- spider_string *str,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int conn_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_check_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_CHECK_TABLE_LEN +
- mysql_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- mysql_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_CHECK_TABLE_STR,
- SPIDER_SQL_SQL_CHECK_TABLE_LEN);
- mysql_share->append_table_name(str, conn_link_idx);
- if (check_opt->flags & T_QUICK)
- {
- if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
- }
- if (check_opt->flags & T_FAST)
- {
- if (str->reserve(SPIDER_SQL_SQL_FAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_FAST_STR, SPIDER_SQL_SQL_FAST_LEN);
- }
- if (check_opt->flags & T_MEDIUM)
- {
- if (str->reserve(SPIDER_SQL_SQL_MEDIUM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_MEDIUM_STR, SPIDER_SQL_SQL_MEDIUM_LEN);
- }
- if (check_opt->flags & T_EXTEND)
- {
- if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_enable_keys_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_enable_keys_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_enable_keys(str, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_enable_keys(
- spider_string *str,
- int link_idx
-) {
- int conn_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_enable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
- mysql_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- mysql_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_ENABLE_KEYS_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
- SPIDER_SQL_SQL_ALTER_TABLE_LEN);
- mysql_share->append_table_name(str, conn_link_idx);
- str->q_append(SPIDER_SQL_SQL_ENABLE_KEYS_STR,
- SPIDER_SQL_SQL_ENABLE_KEYS_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_disable_keys_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_disable_keys_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_disable_keys(str, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_disable_keys(
- spider_string *str,
- int link_idx
-) {
- int conn_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_disable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
- mysql_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- mysql_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_DISABLE_KEYS_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
- SPIDER_SQL_SQL_ALTER_TABLE_LEN);
- mysql_share->append_table_name(str, conn_link_idx);
- str->q_append(SPIDER_SQL_SQL_DISABLE_KEYS_STR,
- SPIDER_SQL_SQL_DISABLE_KEYS_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_delete_all_rows_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_delete_all_rows_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_DELETE_SQL:
- str = &update_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_delete_all_rows(str, sql_type);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_delete_all_rows(
- spider_string *str,
- ulong sql_type
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_delete_all_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider->sql_command == SQLCOM_TRUNCATE)
- {
- if ((error_num = append_truncate(str, sql_type, first_link_idx)))
- DBUG_RETURN(error_num);
- } else {
- if (
- (error_num = append_delete(str)) ||
- (error_num = append_from(str, sql_type, first_link_idx))
- )
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_truncate(
- spider_string *str,
- ulong sql_type,
- int link_idx
-) {
- DBUG_ENTER("spider_mysql_handler::append_truncate");
- if (str->reserve(SPIDER_SQL_TRUNCATE_TABLE_LEN +
- mysql_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_TRUNCATE_TABLE_STR, SPIDER_SQL_TRUNCATE_TABLE_LEN);
- table_name_pos = str->length();
- append_table_name_with_adjusting(str, link_idx, sql_type);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_explain_select_part(
- key_range *start_key,
- key_range *end_key,
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_explain_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num =
- append_explain_select(str, start_key, end_key, sql_type, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::append_explain_select(
- spider_string *str,
- key_range *start_key,
- key_range *end_key,
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::append_explain_select");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_EXPLAIN_SELECT_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_EXPLAIN_SELECT_STR, SPIDER_SQL_EXPLAIN_SELECT_LEN);
- if (
- (error_num = append_from(str, sql_type, link_idx)) ||
- (error_num = append_key_where(str, NULL, NULL, start_key, end_key,
- sql_type, FALSE))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- DBUG_RETURN(0);
-}
-
-bool spider_mysql_handler::is_bulk_insert_exec_period(
- bool bulk_end
-) {
- DBUG_ENTER("spider_mysql_handler::is_bulk_insert_exec_period");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider insert_sql.length=%u", insert_sql.length()));
- DBUG_PRINT("info",("spider insert_pos=%d", insert_pos));
- DBUG_PRINT("info",("spider insert_sql=%s", insert_sql.c_ptr_safe()));
- if (
- (bulk_end || (int) insert_sql.length() >= spider->bulk_size) &&
- (int) insert_sql.length() > insert_pos
- ) {
- DBUG_RETURN(TRUE);
- }
- DBUG_RETURN(FALSE);
-}
-
-bool spider_mysql_handler::sql_is_filled_up(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::sql_is_filled_up");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(filled_up);
-}
-
-bool spider_mysql_handler::sql_is_empty(
- ulong sql_type
-) {
- bool is_empty;
- DBUG_ENTER("spider_mysql_handler::sql_is_empty");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- is_empty = (sql.length() == 0);
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- is_empty = (insert_sql.length() == 0);
- break;
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- is_empty = (update_sql.length() == 0);
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- is_empty = (tmp_sql.length() == 0);
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- is_empty = (ha_sql.length() == 0);
- break;
- default:
- is_empty = TRUE;
- break;
- }
- DBUG_RETURN(is_empty);
-}
-
-bool spider_mysql_handler::support_multi_split_read()
-{
- DBUG_ENTER("spider_mysql_handler::support_multi_split_read");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-bool spider_mysql_handler::support_bulk_update()
-{
- DBUG_ENTER("spider_mysql_handler::support_bulk_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-int spider_mysql_handler::bulk_tmp_table_insert()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = store_sql_to_bulk_tmp_table(&update_sql, upd_tmp_tbl);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::bulk_tmp_table_insert(
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = store_sql_to_bulk_tmp_table(
- &spider->result_list.update_sqls[link_idx],
- spider->result_list.upd_tmp_tbls[link_idx]);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::bulk_tmp_table_end_bulk_insert()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_end_bulk_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = upd_tmp_tbl->file->ha_end_bulk_insert()))
- {
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::bulk_tmp_table_rnd_init()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_rnd_init");
- DBUG_PRINT("info",("spider this=%p", this));
- upd_tmp_tbl->file->extra(HA_EXTRA_CACHE);
- if ((error_num = upd_tmp_tbl->file->ha_rnd_init(TRUE)))
- {
- DBUG_RETURN(error_num);
- }
- reading_from_bulk_tmp_table = TRUE;
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::bulk_tmp_table_rnd_next()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_rnd_next");
- DBUG_PRINT("info",("spider this=%p", this));
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
- error_num = upd_tmp_tbl->file->ha_rnd_next(upd_tmp_tbl->record[0]);
-#else
- error_num = upd_tmp_tbl->file->rnd_next(upd_tmp_tbl->record[0]);
-#endif
- if (!error_num)
- {
- error_num = restore_sql_from_bulk_tmp_table(&insert_sql, upd_tmp_tbl);
- }
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_handler::bulk_tmp_table_rnd_end()
-{
- int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_rnd_end");
- DBUG_PRINT("info",("spider this=%p", this));
- reading_from_bulk_tmp_table = FALSE;
- if ((error_num = upd_tmp_tbl->file->ha_rnd_end()))
- {
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-bool spider_mysql_handler::need_copy_for_update(
- int link_idx
-) {
- int all_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::need_copy_for_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(!mysql_share->same_db_table_name ||
- spider->share->link_statuses[all_link_idx] == SPIDER_LINK_STATUS_RECOVERY);
-}
-
-bool spider_mysql_handler::bulk_tmp_table_created()
-{
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_created");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(upd_tmp_tbl);
-}
-
-int spider_mysql_handler::mk_bulk_tmp_table_and_bulk_start()
-{
- THD *thd = spider->trx->thd;
- TABLE *table = spider->get_table();
- DBUG_ENTER("spider_mysql_handler::mk_bulk_tmp_table_and_bulk_start");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!upd_tmp_tbl)
- {
- if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
- thd, table, &upd_tmp_tbl_prm, "a", update_sql.charset())))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- upd_tmp_tbl->file->extra(HA_EXTRA_WRITE_CACHE);
- upd_tmp_tbl->file->ha_start_bulk_insert((ha_rows) 0);
- }
- DBUG_RETURN(0);
-}
-
-void spider_mysql_handler::rm_bulk_tmp_table()
-{
- DBUG_ENTER("spider_mysql_handler::rm_bulk_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (upd_tmp_tbl)
- {
- spider_rm_sys_tmp_table(spider->trx->thd, upd_tmp_tbl, &upd_tmp_tbl_prm);
- upd_tmp_tbl = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_handler::store_sql_to_bulk_tmp_table(
- spider_string *str,
- TABLE *tmp_table
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::store_sql_to_bulk_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_table->field[0]->set_notnull();
- tmp_table->field[0]->store(str->ptr(), str->length(), str->charset());
- if ((error_num = tmp_table->file->ha_write_row(tmp_table->record[0])))
- DBUG_RETURN(error_num);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::restore_sql_from_bulk_tmp_table(
- spider_string *str,
- TABLE *tmp_table
-) {
- DBUG_ENTER("spider_mysql_handler::restore_sql_from_bulk_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_table->field[0]->val_str(str->get_str());
- str->mem_calc();
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::insert_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx
-) {
- spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash2 = &link_for_hash[link_idx];
- DBUG_ENTER("spider_mysql_handler::insert_lock_tables_list");
- DBUG_PRINT("info",("spider this=%p", this));
- uint old_elements =
- db_conn->lock_table_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(
- &db_conn->lock_table_hash,
- tmp_link_for_hash2->db_table_str_hash_value,
- (uchar*) tmp_link_for_hash2))
-#else
- if (my_hash_insert(&db_conn->lock_table_hash,
- (uchar*) tmp_link_for_hash2))
-#endif
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (db_conn->lock_table_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- db_conn->lock_table_hash,
- (db_conn->lock_table_hash.array.max_element - old_elements) *
- db_conn->lock_table_hash.array.size_of_element);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::append_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx,
- int *appended
-) {
- int error_num;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash, *tmp_link_for_hash2;
- int conn_link_idx = spider->conn_link_idx[link_idx];
- spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
- DBUG_ENTER("spider_mysql_handler::append_lock_tables_list");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_link_for_hash2 = &link_for_hash[link_idx];
- tmp_link_for_hash2->db_table_str =
- &mysql_share->db_table_str[conn_link_idx];
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- tmp_link_for_hash2->db_table_str_hash_value =
- mysql_share->db_table_str_hash_value[conn_link_idx];
- if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *)
- my_hash_search_using_hash_value(
- &db_conn->lock_table_hash,
- tmp_link_for_hash2->db_table_str_hash_value,
- (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
- tmp_link_for_hash2->db_table_str->length())))
-#else
- if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *) my_hash_search(
- &db_conn->lock_table_hash,
- (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
- tmp_link_for_hash2->db_table_str->length())))
-#endif
- {
- if ((error_num = insert_lock_tables_list(conn, link_idx)))
- DBUG_RETURN(error_num);
- *appended = 1;
- } else {
- if (tmp_link_for_hash->spider->lock_type < spider->lock_type)
- {
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(
- &db_conn->lock_table_hash,
- tmp_link_for_hash->db_table_str_hash_value,
- (uchar*) tmp_link_for_hash);
-#else
- my_hash_delete(&db_conn->lock_table_hash,
- (uchar*) tmp_link_for_hash);
-#endif
- uint old_elements =
- db_conn->lock_table_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(
- &db_conn->lock_table_hash,
- tmp_link_for_hash2->db_table_str_hash_value,
- (uchar*) tmp_link_for_hash2))
-#else
- if (my_hash_insert(&db_conn->lock_table_hash,
- (uchar*) tmp_link_for_hash2))
-#endif
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (db_conn->lock_table_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- db_conn->lock_table_hash,
- (db_conn->lock_table_hash.array.max_element - old_elements) *
- db_conn->lock_table_hash.array.size_of_element);
- }
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_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_mysql_handler::realloc_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((int) sql.alloced_length() > init_sql_alloc_size * 2)
- {
- sql.free();
- if (sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
- }
- if ((int) ha_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- ha_sql.free();
- if (ha_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
- }
- if ((int) dup_update_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- dup_update_sql.free();
- if (dup_update_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if ((int) insert_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- insert_sql.free();
- if (insert_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= SPIDER_SQL_TYPE_INSERT_SQL;
- }
- if ((int) update_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- update_sql.free();
- if (update_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL);
- }
- update_sql.length(0);
- if ((int) tmp_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- tmp_sql.free();
- if (tmp_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= SPIDER_SQL_TYPE_TMP_SQL;
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::reset_sql(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::reset_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
- {
- sql.length(0);
- }
- if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
- {
- insert_sql.length(0);
- }
- if (sql_type & (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL |
- SPIDER_SQL_TYPE_BULK_UPDATE_SQL))
- {
- update_sql.length(0);
- }
- if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
- {
- tmp_sql.length(0);
- }
- if (sql_type & SPIDER_SQL_TYPE_HANDLER)
- {
- ha_sql.length(0);
- }
- DBUG_RETURN(0);
-}
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_mysql_handler::reset_keys(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::reset_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::reset_upds(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::reset_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_upds.clear();
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::reset_strs(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::reset_strs");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::reset_strs_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::reset_strs_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::push_back_upds(
- SPIDER_HS_STRING_REF &info
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_handler::push_back_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = hs_upds.push_back(info);
- DBUG_RETURN(error_num);
-}
-#endif
-
-bool spider_mysql_handler::need_lock_before_set_sql_for_exec(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::need_lock_before_set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_mysql_handler::set_sql_for_exec(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- uint tmp_pos;
- SPIDER_SHARE *share = spider->share;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- int all_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & (SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL))
- {
- if (mysql_share->same_db_table_name || link_idx == first_link_idx)
- {
- if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
- exec_sql = &sql;
- if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
- exec_tmp_sql = &tmp_sql;
- } else {
- char tmp_table_name[MAX_FIELD_WIDTH * 2],
- tgt_table_name[MAX_FIELD_WIDTH * 2];
- int tmp_table_name_length;
- spider_string tgt_table_name_str(tgt_table_name,
- MAX_FIELD_WIDTH * 2,
- mysql_share->db_names_str[link_idx].charset());
- const char *table_names[2], *table_aliases[2];
- uint table_name_lengths[2], table_alias_lengths[2];
- tgt_table_name_str.init_calc_mem(104);
- tgt_table_name_str.length(0);
- if (result_list->tmp_table_join && spider->bka_mode != 2)
- {
- create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
- link_idx);
- append_table_name_with_adjusting(&tgt_table_name_str, link_idx,
- SPIDER_SQL_TYPE_TMP_SQL);
- table_names[0] = tmp_table_name;
- table_names[1] = tgt_table_name_str.ptr();
- table_name_lengths[0] = tmp_table_name_length;
- table_name_lengths[1] = tgt_table_name_str.length();
- table_aliases[0] = SPIDER_SQL_A_STR;
- table_aliases[1] = SPIDER_SQL_B_STR;
- table_alias_lengths[0] = SPIDER_SQL_A_LEN;
- table_alias_lengths[1] = SPIDER_SQL_B_LEN;
- }
- if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
- {
- exec_sql = &result_list->sqls[link_idx];
- if (exec_sql->copy(sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- else if (result_list->use_union)
- {
- if ((error_num = reset_union_table_name(exec_sql, link_idx,
- SPIDER_SQL_TYPE_SELECT_SQL)))
- DBUG_RETURN(error_num);
- } else {
- tmp_pos = exec_sql->length();
- exec_sql->length(table_name_pos);
- if (result_list->tmp_table_join && spider->bka_mode != 2)
- {
- if ((error_num = spider_db_mysql_utility.append_from_with_alias(
- exec_sql, table_names, table_name_lengths,
- table_aliases, table_alias_lengths, 2,
- &table_name_pos, TRUE))
- )
- DBUG_RETURN(error_num);
- exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- } else {
- append_table_name_with_adjusting(exec_sql, link_idx,
- SPIDER_SQL_TYPE_SELECT_SQL);
- }
- exec_sql->length(tmp_pos);
- }
- }
- if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
- {
- exec_tmp_sql = &result_list->tmp_sqls[link_idx];
- if (result_list->tmp_table_join && spider->bka_mode != 2)
- {
- if (exec_tmp_sql->copy(tmp_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- else {
- tmp_pos = exec_tmp_sql->length();
- exec_tmp_sql->length(tmp_sql_pos1);
- exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
- exec_tmp_sql->length(tmp_sql_pos2);
- exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
- exec_tmp_sql->length(tmp_sql_pos3);
- exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
- exec_tmp_sql->length(tmp_pos);
- }
- }
- }
- }
- }
- if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
- {
- if (mysql_share->same_db_table_name || link_idx == first_link_idx)
- exec_insert_sql = &insert_sql;
- else {
- exec_insert_sql = &result_list->insert_sqls[link_idx];
- if (exec_insert_sql->copy(insert_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_PRINT("info",("spider exec_insert_sql=%s",
- exec_insert_sql->c_ptr_safe()));
- tmp_pos = exec_insert_sql->length();
- exec_insert_sql->length(insert_table_name_pos);
- append_table_name_with_adjusting(exec_insert_sql, link_idx,
- sql_type);
- exec_insert_sql->length(tmp_pos);
- DBUG_PRINT("info",("spider exec_insert_sql->length=%u",
- exec_insert_sql->length()));
- DBUG_PRINT("info",("spider exec_insert_sql=%s",
- exec_insert_sql->c_ptr_safe()));
- }
- }
- if (sql_type & SPIDER_SQL_TYPE_BULK_UPDATE_SQL)
- {
- if (reading_from_bulk_tmp_table)
- {
- if (
- mysql_share->same_db_table_name &&
- share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
- ) {
- exec_update_sql = &insert_sql;
- } else if (!spider->result_list.upd_tmp_tbls[link_idx])
- {
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- } else {
- exec_update_sql = &spider->result_list.insert_sqls[link_idx];
- if ((error_num = restore_sql_from_bulk_tmp_table(exec_update_sql,
- spider->result_list.upd_tmp_tbls[link_idx])))
- {
- DBUG_RETURN(error_num);
- }
- }
- } else {
- if (
- mysql_share->same_db_table_name &&
- share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
- ) {
- exec_update_sql = &update_sql;
- } else {
- exec_update_sql = &spider->result_list.update_sqls[link_idx];
- }
- }
- } else if (sql_type &
- (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL))
- {
- if (mysql_share->same_db_table_name || link_idx == first_link_idx)
- exec_update_sql = &update_sql;
- else {
- exec_update_sql = &spider->result_list.update_sqls[link_idx];
- if (exec_update_sql->copy(update_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- tmp_pos = exec_update_sql->length();
- exec_update_sql->length(table_name_pos);
- append_table_name_with_adjusting(exec_update_sql, link_idx,
- sql_type);
- exec_update_sql->length(tmp_pos);
- }
- }
- if (sql_type & SPIDER_SQL_TYPE_HANDLER)
- {
- if (spider->m_handler_id[link_idx] == ha_sql_handler_id)
- exec_ha_sql = &ha_sql;
- else {
- exec_ha_sql = &result_list->sqls[link_idx];
- if (exec_ha_sql->copy(ha_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- else {
- tmp_pos = exec_ha_sql->length();
- exec_ha_sql->length(ha_table_name_pos);
- append_table_name_with_adjusting(exec_ha_sql, link_idx,
- SPIDER_SQL_TYPE_HANDLER);
- exec_ha_sql->length(tmp_pos);
- }
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::set_sql_for_exec(
- spider_db_copy_table *tgt_ct,
- ulong sql_type
-) {
- spider_mysql_copy_table *mysql_ct = (spider_mysql_copy_table *) tgt_ct;
- DBUG_ENTER("spider_mysql_handler::set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_SQL:
- exec_insert_sql = &mysql_ct->sql;
- break;
- default:
- DBUG_ASSERT(0);
- break;
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::execute_sql(
- ulong sql_type,
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
-) {
- spider_string *tgt_sql;
- uint tgt_length;
- DBUG_ENTER("spider_mysql_handler::execute_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
- tgt_sql = exec_sql;
- tgt_length = tgt_sql->length();
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
- tgt_sql = exec_insert_sql;
- tgt_length = tgt_sql->length();
- break;
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- DBUG_PRINT("info",("spider %s",
- sql_type == SPIDER_SQL_TYPE_UPDATE_SQL ? "SPIDER_SQL_TYPE_UPDATE_SQL" :
- sql_type == SPIDER_SQL_TYPE_DELETE_SQL ? "SPIDER_SQL_TYPE_DELETE_SQL" :
- "SPIDER_SQL_TYPE_BULK_UPDATE_SQL"
- ));
- tgt_sql = exec_update_sql;
- tgt_length = tgt_sql->length();
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_TMP_SQL"));
- tgt_sql = exec_tmp_sql;
- tgt_length = tgt_sql->length();
- break;
- case SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL"));
- tgt_sql = exec_tmp_sql;
- tgt_length = tmp_sql_pos5;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_HANDLER"));
- tgt_sql = exec_ha_sql;
- tgt_length = tgt_sql->length();
- break;
- default:
- /* nothing to do */
- DBUG_PRINT("info",("spider default"));
- DBUG_RETURN(0);
- }
- DBUG_RETURN(spider_db_query(
- conn,
- tgt_sql->ptr(),
- tgt_length,
- quick_mode,
- need_mon
- ));
-}
-
-int spider_mysql_handler::reset()
-{
- DBUG_ENTER("spider_mysql_handler::reset");
- DBUG_PRINT("info",("spider this=%p", this));
- update_sql.length(0);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::sts_mode_exchange(
- int sts_mode
-) {
- DBUG_ENTER("spider_mysql_handler::sts_mode_exchange");
- DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
- DBUG_RETURN(sts_mode);
-}
-
-int spider_mysql_handler::show_table_status(
- int link_idx,
- int sts_mode,
- uint flag
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_DB_RESULT *res;
- SPIDER_SHARE *share = spider->share;
- uint pos = (2 * spider->conn_link_idx[link_idx]);
- DBUG_ENTER("spider_mysql_handler::show_table_status");
- DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
- if (sts_mode == 1)
- {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- mysql_share->show_table_status[0 + pos].ptr(),
- mysql_share->show_table_status[0 + pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- mysql_share->show_table_status[0 + pos].ptr(),
- mysql_share->show_table_status[0 + pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- if (error_num || (error_num = spider_db_errorno(conn)))
- DBUG_RETURN(error_num);
- else {
- my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
- ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
- }
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- error_num = res->fetch_table_status(
- sts_mode,
- share->records,
- share->mean_rec_length,
- share->data_file_length,
- share->max_data_file_length,
- share->index_file_length,
- share->auto_increment_value,
- share->create_time,
- share->update_time,
- share->check_time
- );
- res->free_result();
- delete res;
- if (error_num)
- {
- switch (error_num)
- {
- case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
- my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
- ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- break;
- case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
- my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
- ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- break;
- default:
- break;
- }
- DBUG_RETURN(error_num);
- }
- } else {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- mysql_share->show_table_status[1 + pos].ptr(),
- mysql_share->show_table_status[1 + pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- mysql_share->show_table_status[1 + pos].ptr(),
- mysql_share->show_table_status[1 + pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- if (error_num || (error_num = spider_db_errorno(conn)))
- DBUG_RETURN(error_num);
- else
- DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- error_num = res->fetch_table_status(
- sts_mode,
- share->records,
- share->mean_rec_length,
- share->data_file_length,
- share->max_data_file_length,
- share->index_file_length,
- share->auto_increment_value,
- share->create_time,
- share->update_time,
- share->check_time
- );
- res->free_result();
- delete res;
- if (error_num)
- {
- switch (error_num)
- {
- case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
- my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
- ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- break;
- case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
- my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
- ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- break;
- default:
- break;
- }
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::crd_mode_exchange(
- int crd_mode
-) {
- DBUG_ENTER("spider_mysql_handler::crd_mode_exchange");
- DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
- DBUG_RETURN(crd_mode);
-}
-
-int spider_mysql_handler::show_index(
- int link_idx,
- int crd_mode
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_SHARE *share = spider->share;
- TABLE *table = spider->get_table();
- SPIDER_DB_RESULT *res;
- int roop_count;
- longlong *tmp_cardinality;
- uint pos = (2 * spider->conn_link_idx[link_idx]);
- DBUG_ENTER("spider_mysql_handler::show_index");
- DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
- if (crd_mode == 1)
- {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- mysql_share->show_index[0 + pos].ptr(),
- mysql_share->show_index[0 + pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- mysql_share->show_index[0 + pos].ptr(),
- mysql_share->show_index[0 + pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- /* no record is ok */
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- if (res)
- {
- error_num = res->fetch_table_cardinality(
- crd_mode,
- table,
- share->cardinality,
- share->cardinality_upd,
- share->bitmap_size
- );
- }
- for (roop_count = 0, tmp_cardinality = share->cardinality;
- roop_count < (int) table->s->fields;
- roop_count++, tmp_cardinality++)
- {
- if (!spider_bit_is_set(share->cardinality_upd, roop_count))
- {
- DBUG_PRINT("info",
- ("spider init column cardinality id=%d", roop_count));
- *tmp_cardinality = 1;
- }
- }
- if (res)
- {
- res->free_result();
- delete res;
- }
- if (error_num)
- {
- switch (error_num)
- {
- case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
- my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
- ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- break;
- case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
- my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
- ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- break;
- default:
- break;
- }
- DBUG_RETURN(error_num);
- }
- } else {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- mysql_share->show_index[1 + pos].ptr(),
- mysql_share->show_index[1 + pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- mysql_share->show_index[1 + pos].ptr(),
- mysql_share->show_index[1 + pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- /* no record is ok */
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- if (res)
- {
- error_num = res->fetch_table_cardinality(
- crd_mode,
- table,
- share->cardinality,
- share->cardinality_upd,
- share->bitmap_size
- );
- }
- for (roop_count = 0, tmp_cardinality = share->cardinality;
- roop_count < (int) table->s->fields;
- roop_count++, tmp_cardinality++)
- {
- if (!spider_bit_is_set(share->cardinality_upd, roop_count))
- {
- DBUG_PRINT("info",
- ("spider init column cardinality id=%d", roop_count));
- *tmp_cardinality = 1;
- }
- }
- if (res)
- {
- res->free_result();
- delete res;
- }
- if (error_num)
- {
- switch (error_num)
- {
- case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
- my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
- ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- break;
- case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
- my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
- ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
- mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- mysql_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- break;
- default:
- break;
- }
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::show_records(
- int link_idx
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_DB_RESULT *res;
- SPIDER_SHARE *share = spider->share;
- uint pos = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::show_records");
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- mysql_share->show_records[pos].ptr(),
- mysql_share->show_records[pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- mysql_share->show_records[pos].ptr(),
- mysql_share->show_records[pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
- DBUG_RETURN(error_num);
- } else {
- DBUG_PRINT("info", ("spider error_num=%d 6",
- ER_QUERY_ON_FOREIGN_DATA_SOURCE));
- DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
- }
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- error_num = res->fetch_table_records(
- 1,
- share->records
- );
- res->free_result();
- delete res;
- if (error_num)
- {
- DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
- DBUG_RETURN(error_num);
- }
- spider->trx->direct_aggregate_count++;
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::show_last_insert_id(
- int link_idx,
- ulonglong &last_insert_id
-) {
- SPIDER_CONN *conn = spider->conns[link_idx];
- DBUG_ENTER("spider_mysql_handler::show_last_insert_id");
- last_insert_id = conn->db_conn->last_insert_id();
- DBUG_RETURN(0);
-}
-
-ha_rows spider_mysql_handler::explain_select(
- key_range *start_key,
- key_range *end_key,
- int link_idx
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- spider_string *str = &result_list->sqls[link_idx];
- SPIDER_DB_RESULT *res;
- ha_rows rows;
- spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
- DBUG_ENTER("spider_mysql_handler::explain_select");
- if ((error_num = dbton_hdl->append_explain_select_part(
- start_key, end_key, SPIDER_SQL_TYPE_OTHER_SQL, link_idx)))
- {
- my_errno = error_num;
- DBUG_RETURN(HA_POS_ERROR);
- }
-
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(spider->share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- spider->share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- spider->share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- error_num = spider_db_errorno(conn);
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- } else {
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- } else {
- my_errno = ER_QUERY_ON_FOREIGN_DATA_SOURCE;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- error_num = res->fetch_table_records(
- 2,
- rows
- );
- res->free_result();
- delete res;
- if (error_num)
- {
- my_errno = error_num;
- DBUG_RETURN(HA_POS_ERROR);
- }
- DBUG_RETURN(rows);
-}
-
-int spider_mysql_handler::lock_tables(
- int link_idx
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- spider_string *str = &sql;
- DBUG_ENTER("spider_mysql_handler::lock_tables");
- str->length(0);
- if ((error_num = conn->db_conn->append_lock_tables(str)))
- {
- DBUG_RETURN(error_num);
- }
- if (str->length())
- {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- spider->share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- if (!conn->table_locked)
- {
- conn->table_locked = TRUE;
- spider->trx->locked_connections++;
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::unlock_tables(
- int link_idx
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- DBUG_ENTER("spider_mysql_handler::unlock_tables");
- if (conn->table_locked)
- {
- spider_string *str = &sql;
- conn->table_locked = FALSE;
- spider->trx->locked_connections--;
-
- str->length(0);
- if ((error_num = conn->db_conn->append_unlock_tables(str)))
- {
- DBUG_RETURN(error_num);
- }
- if (str->length())
- {
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- spider->share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::disable_keys(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::disable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_disable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::enable_keys(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::enable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_enable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::check_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::check_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_check_table_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx, check_opt)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::repair_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::repair_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_repair_table_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx, check_opt)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::analyze_table(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::analyze_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_analyze_table_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::optimize_table(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::optimize_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_optimize_table_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::flush_tables(
- SPIDER_CONN *conn,
- int link_idx,
- bool lock
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::flush_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_flush_tables_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx, lock)))
- {
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::flush_logs(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_mysql_handler::flush_logs");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- SPIDER_SQL_FLUSH_LOGS_STR,
- SPIDER_SQL_FLUSH_LOGS_LEN,
- -1,
- &spider->need_mons[link_idx])
- ) {
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::insert_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
-) {
- spider_db_mysql *db_conn = (spider_db_mysql *) 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_mysql_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_mysql_handler::delete_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
-) {
- spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
- uint roop_count, elements = db_conn->handler_open_array.elements;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
- DBUG_ENTER("spider_mysql_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_mysql_handler::sync_from_clone_source(
- spider_db_handler *dbton_hdl
-) {
- DBUG_ENTER("spider_mysql_handler::sync_from_clone_source");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-bool spider_mysql_handler::support_use_handler(
- int use_handler
-) {
- DBUG_ENTER("spider_mysql_handler::support_use_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-bool spider_mysql_handler::minimum_select_bit_is_set(
- uint field_index
-) {
- TABLE *table = spider->get_table();
- DBUG_ENTER("spider_mysql_handler::minimum_select_bit_is_set");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider field_index=%u", field_index));
- DBUG_PRINT("info",("spider ft_discard_bitmap=%s",
- spider_bit_is_set(spider->ft_discard_bitmap, field_index) ?
- "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider searched_bitmap=%s",
- spider_bit_is_set(spider->searched_bitmap, field_index) ?
- "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider read_set=%s",
- bitmap_is_set(table->read_set, field_index) ?
- "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider write_set=%s",
- bitmap_is_set(table->write_set, field_index) ?
- "TRUE" : "FALSE"));
- DBUG_RETURN(
- spider_bit_is_set(spider->ft_discard_bitmap, field_index) &
- (
- 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)
- )
- );
-}
-
-void spider_mysql_handler::copy_minimum_select_bitmap(
- uchar *bitmap
-) {
- int roop_count;
- TABLE *table = spider->get_table();
- DBUG_ENTER("spider_mysql_handler::copy_minimum_select_bitmap");
- for (roop_count = 0;
- roop_count < (int) ((table->s->fields + 7) / 8);
- roop_count++)
- {
- bitmap[roop_count] =
- spider->ft_discard_bitmap[roop_count] &
- (
- spider->searched_bitmap[roop_count] |
- ((uchar *) table->read_set->bitmap)[roop_count] |
- ((uchar *) table->write_set->bitmap)[roop_count]
- );
- DBUG_PRINT("info",("spider roop_count=%d", roop_count));
- DBUG_PRINT("info",("spider bitmap=%d",
- bitmap[roop_count]));
- DBUG_PRINT("info",("spider ft_discard_bitmap=%d",
- spider->ft_discard_bitmap[roop_count]));
- DBUG_PRINT("info",("spider searched_bitmap=%d",
- spider->searched_bitmap[roop_count]));
- DBUG_PRINT("info",("spider read_set=%d",
- ((uchar *) table->read_set->bitmap)[roop_count]));
- DBUG_PRINT("info",("spider write_set=%d",
- ((uchar *) table->write_set->bitmap)[roop_count]));
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_handler::init_union_table_name_pos()
-{
- DBUG_ENTER("spider_mysql_handler::init_union_table_name_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!union_table_name_pos_first)
- {
- if (!spider_bulk_malloc(spider_current_trx, 236, MYF(MY_WME),
- &union_table_name_pos_first, sizeof(SPIDER_INT_HLD),
- NullS)
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- union_table_name_pos_first->next = NULL;
- }
- union_table_name_pos_current = union_table_name_pos_first;
- union_table_name_pos_current->tgt_num = 0;
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::set_union_table_name_pos()
-{
- DBUG_ENTER("spider_mysql_handler::set_union_table_name_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE)
- {
- if (!union_table_name_pos_current->next)
- {
- if (!spider_bulk_malloc(spider_current_trx, 237, MYF(MY_WME),
- &union_table_name_pos_current->next, sizeof(SPIDER_INT_HLD),
- NullS)
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- union_table_name_pos_current->next->next = NULL;
- }
- union_table_name_pos_current = union_table_name_pos_current->next;
- union_table_name_pos_current->tgt_num = 0;
- }
- union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] =
- table_name_pos;
- ++union_table_name_pos_current->tgt_num;
- DBUG_RETURN(0);
-}
-
-int spider_mysql_handler::reset_union_table_name(
- spider_string *str,
- int link_idx,
- ulong sql_type
-) {
- DBUG_ENTER("spider_mysql_handler::reset_union_table_name");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!union_table_name_pos_current)
- DBUG_RETURN(0);
-
- SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
- uint cur_num, pos_backup = str->length();
- while(TRUE)
- {
- for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num)
- {
- str->length(tmp_pos->tgt[cur_num]);
- append_table_name_with_adjusting(str, link_idx, sql_type);
- }
- if (tmp_pos == union_table_name_pos_current)
- break;
- tmp_pos = tmp_pos->next;
- }
- str->length(pos_backup);
- DBUG_RETURN(0);
-}
-
-spider_mysql_copy_table::spider_mysql_copy_table(
- spider_mysql_share *db_share
-) : spider_db_copy_table(
- db_share
-),
- mysql_share(db_share)
-{
- DBUG_ENTER("spider_mysql_copy_table::spider_mysql_copy_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_mysql_copy_table::~spider_mysql_copy_table()
-{
- DBUG_ENTER("spider_mysql_copy_table::~spider_mysql_copy_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_copy_table::init()
-{
- DBUG_ENTER("spider_mysql_copy_table::init");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.init_calc_mem(78);
- DBUG_RETURN(0);
-}
-
-void spider_mysql_copy_table::set_sql_charset(
- CHARSET_INFO *cs
-) {
- DBUG_ENTER("spider_mysql_copy_table::set_sql_charset");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.set_charset(cs);
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_copy_table::append_select_str()
-{
- DBUG_ENTER("spider_mysql_copy_table::append_select_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_SELECT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_insert_str(
- int insert_flg
-) {
- DBUG_ENTER("spider_mysql_copy_table::append_insert_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (insert_flg & SPIDER_DB_INSERT_REPLACE)
- {
- if (sql.reserve(SPIDER_SQL_REPLACE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
- } else {
- if (sql.reserve(SPIDER_SQL_INSERT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
- }
- if (insert_flg & SPIDER_DB_INSERT_LOW_PRIORITY)
- {
- if (sql.reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
- }
- else if (insert_flg & SPIDER_DB_INSERT_DELAYED)
- {
- if (sql.reserve(SPIDER_SQL_SQL_DELAYED_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
- }
- else if (insert_flg & SPIDER_DB_INSERT_HIGH_PRIORITY)
- {
- if (sql.reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
- }
- if (insert_flg & SPIDER_DB_INSERT_IGNORE)
- {
- if (sql.reserve(SPIDER_SQL_SQL_IGNORE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_table_columns(
- TABLE_SHARE *table_share
-) {
- int error_num;
- Field **field;
- DBUG_ENTER("spider_mysql_copy_table::append_table_columns");
- DBUG_PRINT("info",("spider this=%p", this));
- for (field = table_share->field; *field; field++)
- {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) (*field)->field_name, spider_dbton_mysql.dbton_id)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_from_str()
-{
- DBUG_ENTER("spider_mysql_copy_table::append_from_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_table_name(
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_copy_table::append_table_name");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = mysql_share->append_table_name(&sql, link_idx);
- DBUG_RETURN(error_num);
-}
-
-void spider_mysql_copy_table::set_sql_pos()
-{
- DBUG_ENTER("spider_mysql_copy_table::set_sql_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- pos = sql.length();
- DBUG_VOID_RETURN;
-}
-
-void spider_mysql_copy_table::set_sql_to_pos()
-{
- DBUG_ENTER("spider_mysql_copy_table::set_sql_to_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.length(pos);
- DBUG_VOID_RETURN;
-}
-
-int spider_mysql_copy_table::append_copy_where(
- spider_db_copy_table *source_ct,
- KEY *key_info,
- ulong *last_row_pos,
- ulong *last_lengths
-) {
- int error_num, roop_count, roop_count2;
- DBUG_ENTER("spider_mysql_copy_table::append_copy_where");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- Field *field;
- KEY_PART_INFO *key_part = key_info->key_part;
- for (roop_count = spider_user_defined_key_parts(key_info) - 1;
- roop_count >= 0; roop_count--)
- {
- for (roop_count2 = 0; roop_count2 < roop_count; roop_count2++)
- {
- field = key_part[roop_count2].field;
- if ((error_num = copy_key_row(source_ct,
- field, &last_row_pos[field->field_index],
- &last_lengths[field->field_index],
- SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN)))
- {
- DBUG_RETURN(error_num);
- }
- }
- field = key_part[roop_count2].field;
- if ((error_num = copy_key_row(source_ct,
- field, &last_row_pos[field->field_index],
- &last_lengths[field->field_index],
- SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN)))
- {
- DBUG_RETURN(error_num);
- }
- sql.length(sql.length() - SPIDER_SQL_AND_LEN);
- if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
- SPIDER_SQL_OR_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- sql.q_append(SPIDER_SQL_OR_STR, SPIDER_SQL_OR_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- }
- sql.length(sql.length() - SPIDER_SQL_OR_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_key_order_str(
- KEY *key_info,
- int start_pos,
- bool desc_flg
-) {
- int length, error_num;
- KEY_PART_INFO *key_part;
- Field *field;
- DBUG_ENTER("spider_mysql_copy_table::append_key_order_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((int) spider_user_defined_key_parts(key_info) > start_pos)
- {
- if (sql.reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- if (desc_flg == TRUE)
- {
- for (
- key_part = key_info->key_part + start_pos,
- length = 0;
- length + start_pos < (int) spider_user_defined_key_parts(key_info);
- key_part++,
- length++
- ) {
- field = key_part->field;
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_mysql.dbton_id)))
- DBUG_RETURN(error_num);
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- } else {
- for (
- key_part = key_info->key_part + start_pos,
- length = 0;
- length + start_pos < (int) spider_user_defined_key_parts(key_info);
- key_part++,
- length++
- ) {
- field = key_part->field;
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_mysql.dbton_id)))
- DBUG_RETURN(error_num);
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- }
- sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_limit(
- longlong offset,
- longlong limit
-) {
- char buf[SPIDER_LONGLONG_LEN + 1];
- uint32 length;
- DBUG_ENTER("spider_mysql_copy_table::append_limit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (offset || limit < 9223372036854775807LL)
- {
- if (sql.reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
- ((SPIDER_LONGLONG_LEN) * 2)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
- if (offset)
- {
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
- sql.q_append(buf, length);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
- sql.q_append(buf, length);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_into_str()
-{
- DBUG_ENTER("spider_mysql_copy_table::append_into_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_INTO_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_open_paren_str()
-{
- DBUG_ENTER("spider_mysql_copy_table::append_open_paren_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_values_str()
-{
- DBUG_ENTER("spider_mysql_copy_table::append_values_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_select_lock_str(
- int lock_mode
-) {
- DBUG_ENTER("spider_mysql_copy_table::append_select_lock_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
- {
- if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
- } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
- {
- if (sql.reserve(SPIDER_SQL_SHARED_LOCK_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::exec_query(
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_copy_table::exec_query");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = spider_db_query(conn, sql.ptr(), sql.length(), quick_mode,
- need_mon);
- DBUG_RETURN(error_num);
-}
-
-int spider_mysql_copy_table::copy_key_row(
- spider_db_copy_table *source_ct,
- Field *field,
- ulong *row_pos,
- ulong *length,
- const char *joint_str,
- const int joint_length
-) {
- int error_num;
- spider_string *source_str = &((spider_mysql_copy_table *) source_ct)->sql;
- DBUG_ENTER("spider_mysql_copy_table::copy_key_row");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_mysql.dbton_id)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length +
- SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(joint_str, joint_length);
- sql.q_append(source_str->ptr() + *row_pos, *length);
- sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::copy_row(
- Field *field,
- SPIDER_DB_ROW *row
-) {
- int error_num;
- DBUG_ENTER("spider_mysql_copy_table::copy_row");
- DBUG_PRINT("info",("spider this=%p", this));
- if (row->is_null())
- {
- if (sql.reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else if (field->str_needs_quotes())
- {
- if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- if ((error_num = row->append_escaped_to_str(&sql,
- spider_dbton_mysql.dbton_id)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- } else {
- if ((error_num = row->append_to_str(&sql)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::copy_rows(
- TABLE *table,
- SPIDER_DB_ROW *row,
- ulong **last_row_pos,
- ulong **last_lengths
-) {
- int error_num;
- Field **field;
- ulong *lengths2, *row_pos2;
- DBUG_ENTER("spider_mysql_copy_table::copy_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- row_pos2 = *last_row_pos;
- lengths2 = *last_lengths;
-
- for (
- field = table->field;
- *field;
- field++,
- lengths2++
- ) {
- *row_pos2 = sql.length();
- if ((error_num =
- copy_row(*field, row)))
- DBUG_RETURN(error_num);
- *lengths2 = sql.length() - *row_pos2 - SPIDER_SQL_COMMA_LEN;
- row->next();
- row_pos2++;
- }
- sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
- if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
- SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::copy_rows(
- TABLE *table,
- SPIDER_DB_ROW *row
-) {
- int error_num;
- Field **field;
- DBUG_ENTER("spider_mysql_copy_table::copy_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- for (
- field = table->field;
- *field;
- field++
- ) {
- if ((error_num =
- copy_row(*field, row)))
- DBUG_RETURN(error_num);
- row->next();
- }
- sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
- if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
- SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::append_insert_terminator()
-{
- DBUG_ENTER("spider_mysql_copy_table::append_insert_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.length(sql.length() - SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_mysql_copy_table::copy_insert_values(
- spider_db_copy_table *source_ct
-) {
- spider_mysql_copy_table *tmp_ct = (spider_mysql_copy_table *) source_ct;
- spider_string *source_str = &tmp_ct->sql;
- int values_length = source_str->length() - tmp_ct->pos;
- const char *values_ptr = source_str->ptr() + tmp_ct->pos;
- DBUG_ENTER("spider_mysql_copy_table::copy_insert_values");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(values_length))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.q_append(values_ptr, values_length);
- DBUG_RETURN(0);
-}
+/* Copyright (C) 2012-2014 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#define MYSQL_SERVER 1
+#include "mysql_version.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_class.h"
+#include "sql_partition.h"
+#include "sql_analyse.h"
+#include "sql_base.h"
+#include "tztime.h"
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+#include "sql_select.h"
+#endif
+#endif
+#include "sql_common.h"
+#include <mysql.h>
+#include <errmsg.h>
+#include "spd_err.h"
+#include "spd_param.h"
+#include "spd_db_include.h"
+#include "spd_include.h"
+#include "spd_db_mysql.h"
+#include "ha_spider.h"
+#include "spd_conn.h"
+#include "spd_db_conn.h"
+#include "spd_malloc.h"
+#include "spd_sys_table.h"
+#include "spd_table.h"
+
+extern struct charset_info_st *spd_charset_utf8_bin;
+
+extern handlerton *spider_hton_ptr;
+extern pthread_mutex_t spider_open_conn_mutex;
+extern HASH spider_open_connections;
+extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
+extern const char spider_dig_upper[];
+
+#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_ISO_READ_UNCOMMITTED_STR "set session transaction isolation level read uncommitted"
+#define SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR) - 1
+#define SPIDER_SQL_ISO_READ_COMMITTED_STR "set session transaction isolation level read committed"
+#define SPIDER_SQL_ISO_READ_COMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_COMMITTED_STR) - 1
+#define SPIDER_SQL_ISO_REPEATABLE_READ_STR "set session transaction isolation level repeatable read"
+#define SPIDER_SQL_ISO_REPEATABLE_READ_LEN sizeof(SPIDER_SQL_ISO_REPEATABLE_READ_STR) - 1
+#define SPIDER_SQL_ISO_SERIALIZABLE_STR "set session transaction isolation level serializable"
+#define SPIDER_SQL_ISO_SERIALIZABLE_LEN sizeof(SPIDER_SQL_ISO_SERIALIZABLE_STR) - 1
+
+#define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR "start transaction with consistent snapshot"
+#define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN sizeof(SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR) - 1
+#define SPIDER_SQL_START_TRANSACTION_STR "start transaction"
+#define SPIDER_SQL_START_TRANSACTION_LEN sizeof(SPIDER_SQL_START_TRANSACTION_STR) - 1
+
+#define SPIDER_SQL_AUTOCOMMIT_OFF_STR "set session autocommit = 0"
+#define SPIDER_SQL_AUTOCOMMIT_OFF_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_OFF_STR) - 1
+#define SPIDER_SQL_AUTOCOMMIT_ON_STR "set session autocommit = 1"
+#define SPIDER_SQL_AUTOCOMMIT_ON_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_ON_STR) - 1
+
+#define SPIDER_SQL_SQL_LOG_OFF_STR "set session sql_log_off = 0"
+#define SPIDER_SQL_SQL_LOG_OFF_LEN sizeof(SPIDER_SQL_SQL_LOG_OFF_STR) - 1
+#define SPIDER_SQL_SQL_LOG_ON_STR "set session sql_log_off = 1"
+#define SPIDER_SQL_SQL_LOG_ON_LEN sizeof(SPIDER_SQL_SQL_LOG_ON_STR) - 1
+
+#define SPIDER_SQL_TIME_ZONE_STR "set session time_zone = '"
+#define SPIDER_SQL_TIME_ZONE_LEN sizeof(SPIDER_SQL_TIME_ZONE_STR) - 1
+
+#define SPIDER_SQL_COMMIT_STR "commit"
+#define SPIDER_SQL_COMMIT_LEN sizeof(SPIDER_SQL_COMMIT_STR) - 1
+#define SPIDER_SQL_ROLLBACK_STR "rollback"
+#define SPIDER_SQL_ROLLBACK_LEN sizeof(SPIDER_SQL_ROLLBACK_STR) - 1
+
+#define SPIDER_SQL_XA_START_STR "xa start "
+#define SPIDER_SQL_XA_START_LEN sizeof(SPIDER_SQL_XA_START_STR) - 1
+#define SPIDER_SQL_XA_END_STR "xa end "
+#define SPIDER_SQL_XA_END_LEN sizeof(SPIDER_SQL_XA_END_STR) - 1
+#define SPIDER_SQL_XA_PREPARE_STR "xa prepare "
+#define SPIDER_SQL_XA_PREPARE_LEN sizeof(SPIDER_SQL_XA_PREPARE_STR) - 1
+#define SPIDER_SQL_XA_COMMIT_STR "xa commit "
+#define SPIDER_SQL_XA_COMMIT_LEN sizeof(SPIDER_SQL_XA_COMMIT_STR) - 1
+#define SPIDER_SQL_XA_ROLLBACK_STR "xa rollback "
+#define SPIDER_SQL_XA_ROLLBACK_LEN sizeof(SPIDER_SQL_XA_ROLLBACK_STR) - 1
+
+#define SPIDER_SQL_LOCK_TABLE_STR "lock tables "
+#define SPIDER_SQL_LOCK_TABLE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_STR) - 1)
+#define SPIDER_SQL_UNLOCK_TABLE_STR "unlock tables"
+#define SPIDER_SQL_UNLOCK_TABLE_LEN (sizeof(SPIDER_SQL_UNLOCK_TABLE_STR) - 1)
+
+#define SPIDER_SQL_SHOW_TABLE_STATUS_STR "show table status from "
+#define SPIDER_SQL_SHOW_TABLE_STATUS_LEN sizeof(SPIDER_SQL_SHOW_TABLE_STATUS_STR) - 1
+#define SPIDER_SQL_SELECT_TABLES_STATUS_STR "select `table_rows`,`avg_row_length`,`data_length`,`max_data_length`,`index_length`,`auto_increment`,`create_time`,`update_time`,`check_time` from `information_schema`.`tables` where `table_schema` = "
+#define SPIDER_SQL_SELECT_TABLES_STATUS_LEN sizeof(SPIDER_SQL_SELECT_TABLES_STATUS_STR) - 1
+#define SPIDER_SQL_SHOW_WARNINGS_STR "show warnings"
+#define SPIDER_SQL_SHOW_WARNINGS_LEN sizeof(SPIDER_SQL_SHOW_WARNINGS_STR) - 1
+
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+#define SPIDER_SQL_SHOW_COLUMNS_STR "show columns from "
+#define SPIDER_SQL_SHOW_COLUMNS_LEN sizeof(SPIDER_SQL_SHOW_COLUMNS_STR) - 1
+#endif
+
+#define SPIDER_SQL_LIKE_STR " like "
+#define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1)
+#define SPIDER_SQL_LIMIT1_STR " limit 1"
+#define SPIDER_SQL_LIMIT1_LEN (sizeof(SPIDER_SQL_LIMIT1_STR) - 1)
+#define SPIDER_SQL_COLLATE_STR " collate "
+#define SPIDER_SQL_COLLATE_LEN (sizeof(SPIDER_SQL_COLLATE_STR) - 1)
+
+#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)
+
+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_table_lock_str[] =
+{
+ " read local,",
+ " read,",
+ " low_priority write,",
+ " write,"
+};
+static const int spider_db_table_lock_len[] =
+{
+ sizeof(" read local,") - 1,
+ sizeof(" read,") - 1,
+ sizeof(" low_priority write,") - 1,
+ sizeof(" write,") - 1
+};
+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"
+};
+
+int spider_mysql_init()
+{
+ DBUG_ENTER("spider_mysql_init");
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_deinit()
+{
+ DBUG_ENTER("spider_mysql_deinit");
+ DBUG_RETURN(0);
+}
+
+spider_db_share *spider_mysql_create_share(
+ SPIDER_SHARE *share
+) {
+ DBUG_ENTER("spider_mysql_create_share");
+ DBUG_RETURN(new spider_mysql_share(share));
+}
+
+spider_db_handler *spider_mysql_create_handler(
+ ha_spider *spider,
+ spider_db_share *db_share
+) {
+ DBUG_ENTER("spider_mysql_create_handler");
+ DBUG_RETURN(new spider_mysql_handler(spider,
+ (spider_mysql_share *) db_share));
+}
+
+spider_db_copy_table *spider_mysql_create_copy_table(
+ spider_db_share *db_share
+) {
+ DBUG_ENTER("spider_mysql_create_copy_table");
+ DBUG_RETURN(new spider_mysql_copy_table(
+ (spider_mysql_share *) db_share));
+}
+
+SPIDER_DB_CONN *spider_mysql_create_conn(
+ SPIDER_CONN *conn
+) {
+ DBUG_ENTER("spider_mysql_create_conn");
+ DBUG_RETURN(new spider_db_mysql(conn));
+}
+
+spider_db_mysql_util spider_db_mysql_utility;
+
+SPIDER_DBTON spider_dbton_mysql = {
+ 0,
+ SPIDER_DB_WRAPPER_MYSQL,
+ SPIDER_DB_ACCESS_TYPE_SQL,
+ spider_mysql_init,
+ spider_mysql_deinit,
+ spider_mysql_create_share,
+ spider_mysql_create_handler,
+ spider_mysql_create_copy_table,
+ spider_mysql_create_conn,
+ &spider_db_mysql_utility
+};
+
+spider_db_mysql_row::spider_db_mysql_row() :
+ spider_db_row(spider_dbton_mysql.dbton_id),
+ row(NULL), lengths(NULL), cloned(FALSE)
+{
+ DBUG_ENTER("spider_db_mysql_row::spider_db_mysql_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mysql_row::~spider_db_mysql_row()
+{
+ DBUG_ENTER("spider_db_mysql_row::~spider_db_mysql_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (cloned)
+ {
+ spider_free(spider_current_trx, row_first, MYF(0));
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_mysql_row::store_to_field(
+ Field *field,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_mysql_row::store_to_field");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!*row)
+ {
+ DBUG_PRINT("info", ("spider field is null"));
+ field->set_null();
+ field->reset();
+ } else {
+ field->set_notnull();
+ if (field->flags & BLOB_FLAG)
+ {
+ DBUG_PRINT("info", ("spider blob field"));
+ if (
+ field->charset() == &my_charset_bin ||
+ field->charset()->cset == access_charset->cset
+ )
+ ((Field_blob *)field)->set_ptr(*lengths, (uchar *) *row);
+ else {
+ DBUG_PRINT("info", ("spider blob convert"));
+ if (field->table->file->ht == spider_hton_ptr)
+ {
+ ha_spider *spider = (ha_spider *) field->table->file;
+ spider_string *str = &spider->blob_buff[field->field_index];
+ str->length(0);
+ if (str->append(*row, *lengths, access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ ((Field_blob *)field)->set_ptr(str->length(), (uchar *) str->ptr());
+ } else {
+ field->store(*row, *lengths, access_charset);
+ }
+ }
+ } else
+ field->store(*row, *lengths, access_charset);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_row::append_to_str(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_mysql_row::append_to_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(*lengths))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(*row, *lengths);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_row::append_escaped_to_str(
+ spider_string *str,
+ uint dbton_id
+) {
+ DBUG_ENTER("spider_db_mysql_row::append_escaped_to_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_string tmp_str(*row, *lengths + 1, str->charset());
+ tmp_str.init_calc_mem(133);
+ tmp_str.length(*lengths);
+ if (str->reserve(*lengths * 2 + 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ spider_dbton[dbton_id].db_util->append_escaped_util(str, tmp_str.get_str());
+ DBUG_RETURN(0);
+}
+
+void spider_db_mysql_row::first()
+{
+ DBUG_ENTER("spider_db_mysql_row::first");
+ DBUG_PRINT("info",("spider this=%p", this));
+ row = row_first;
+ lengths = lengths_first;
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_mysql_row::next()
+{
+ DBUG_ENTER("spider_db_mysql_row::next");
+ DBUG_PRINT("info",("spider this=%p", this));
+ row++;
+ lengths++;
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_mysql_row::is_null()
+{
+ DBUG_ENTER("spider_db_mysql_row::is_null");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(!(*row));
+}
+
+int spider_db_mysql_row::val_int()
+{
+ DBUG_ENTER("spider_db_mysql_row::val_int");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(*row ? atoi(*row) : 0);
+}
+
+double spider_db_mysql_row::val_real()
+{
+ DBUG_ENTER("spider_db_mysql_row::val_real");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(*row ? my_atof(*row) : 0.0);
+}
+
+my_decimal *spider_db_mysql_row::val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_mysql_row::val_decimal");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!*row)
+ DBUG_RETURN(NULL);
+
+#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
+ decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
+ decimal_value), "", "");
+#else
+ decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
+ decimal_value));
+#endif
+
+ DBUG_RETURN(decimal_value);
+}
+
+SPIDER_DB_ROW *spider_db_mysql_row::clone()
+{
+ spider_db_mysql_row *clone_row;
+ char *tmp_char;
+ MYSQL_ROW tmp_row = row_first, ctmp_row;
+ ulong *tmp_lengths = lengths_first;
+ uint row_size, i;
+ DBUG_ENTER("spider_db_mysql_row::clone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(clone_row = new spider_db_mysql_row()))
+ {
+ DBUG_RETURN(NULL);
+ }
+ row_size = field_count;
+ for (i = 0; i < field_count; i++)
+ {
+ row_size += *tmp_lengths;
+ tmp_lengths++;
+ }
+ if (!spider_bulk_malloc(spider_current_trx, 29, MYF(MY_WME),
+ &clone_row->row, sizeof(char*) * field_count,
+ &tmp_char, row_size,
+ &clone_row->lengths, sizeof(ulong) * field_count,
+ NullS)
+ ) {
+ delete clone_row;
+ DBUG_RETURN(NULL);
+ }
+ memcpy(clone_row->lengths, lengths_first, sizeof(ulong) * field_count);
+ tmp_lengths = lengths_first;
+ ctmp_row = clone_row->row;
+ for (i = 0; i < field_count; i++)
+ {
+ DBUG_PRINT("info",("spider *lengths=%lu", *tmp_lengths));
+ if (*tmp_row == NULL)
+ {
+ *ctmp_row = NULL;
+ *tmp_char = 0;
+ tmp_char++;
+ } else {
+ *ctmp_row = tmp_char;
+ memcpy(tmp_char, *tmp_row, *tmp_lengths + 1);
+ tmp_char += *tmp_lengths + 1;
+ }
+ ctmp_row++;
+ tmp_lengths++;
+ tmp_row++;
+ }
+ clone_row->field_count = field_count;
+ clone_row->row_first = clone_row->row;
+ clone_row->lengths_first = clone_row->lengths;
+ clone_row->cloned = TRUE;
+ DBUG_RETURN((SPIDER_DB_ROW *) clone_row);
+}
+
+int spider_db_mysql_row::store_to_tmp_table(
+ TABLE *tmp_table,
+ spider_string *str
+) {
+ uint i;
+ MYSQL_ROW tmp_row = row;
+ ulong *tmp_lengths = lengths;
+ DBUG_ENTER("spider_db_mysql_row::store_to_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ for (i = 0; i < field_count; i++)
+ {
+ if (*tmp_row)
+ {
+ if (str->reserve(*tmp_lengths + 1))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(*tmp_row, *tmp_lengths + 1);
+ }
+ tmp_lengths++;
+ tmp_row++;
+ }
+ tmp_table->field[0]->set_notnull();
+ tmp_table->field[0]->store(
+ (const char *) lengths,
+ sizeof(ulong) * 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_notnull();
+ tmp_table->field[2]->store(
+ (char *) row, (uint) (sizeof(char *) * field_count), &my_charset_bin);
+ DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
+}
+
+spider_db_mysql_result::spider_db_mysql_result() :
+ spider_db_result(spider_dbton_mysql.dbton_id),
+ db_result(NULL)
+{
+ DBUG_ENTER("spider_db_mysql_result::spider_db_mysql_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mysql_result::~spider_db_mysql_result()
+{
+ DBUG_ENTER("spider_db_mysql_result::~spider_db_mysql_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (db_result)
+ {
+ free_result();
+ }
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_mysql_result::has_result()
+{
+ DBUG_ENTER("spider_db_mysql_result::has_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(db_result);
+}
+
+void spider_db_mysql_result::free_result()
+{
+ DBUG_ENTER("spider_db_mysql_result::free_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* need 2 times execution design */
+ if (db_result)
+ {
+ mysql_free_result(db_result);
+ db_result = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_DB_ROW *spider_db_mysql_result::current_row()
+{
+ DBUG_ENTER("spider_db_mysql_result::current_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
+}
+
+SPIDER_DB_ROW *spider_db_mysql_result::fetch_row()
+{
+ DBUG_ENTER("spider_db_mysql_result::fetch_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(row.row = mysql_fetch_row(db_result)))
+ {
+ store_error_num = HA_ERR_END_OF_FILE;
+ DBUG_RETURN(NULL);
+ }
+ row.lengths = mysql_fetch_lengths(db_result);
+ row.field_count = mysql_num_fields(db_result);
+ row.row_first = row.row;
+ row.lengths_first = row.lengths;
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+SPIDER_DB_ROW *spider_db_mysql_result::fetch_row_from_result_buffer(
+ spider_db_result_buffer *spider_res_buf
+) {
+ DBUG_ENTER("spider_db_mysql_result::fetch_row_from_result_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(row.row = mysql_fetch_row(db_result)))
+ {
+ store_error_num = HA_ERR_END_OF_FILE;
+ DBUG_RETURN(NULL);
+ }
+ row.lengths = mysql_fetch_lengths(db_result);
+ row.field_count = mysql_num_fields(db_result);
+ row.row_first = row.row;
+ row.lengths_first = row.lengths;
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+SPIDER_DB_ROW *spider_db_mysql_result::fetch_row_from_tmp_table(
+ TABLE *tmp_table
+) {
+ uint i;
+ spider_string tmp_str1, tmp_str2, tmp_str3;
+ const char *row_ptr;
+ MYSQL_ROW tmp_row;
+ ulong *tmp_lengths;
+ uint field_count;
+ DBUG_ENTER("spider_db_mysql_result::fetch_row_from_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_str1.init_calc_mem(117);
+ tmp_str2.init_calc_mem(118);
+ tmp_str3.init_calc_mem(170);
+ tmp_table->field[0]->val_str(tmp_str1.get_str());
+ tmp_table->field[1]->val_str(tmp_str2.get_str());
+ tmp_table->field[2]->val_str(tmp_str3.get_str());
+ tmp_str1.mem_calc();
+ tmp_str2.mem_calc();
+ tmp_str3.mem_calc();
+ row_ptr = tmp_str2.ptr();
+ tmp_lengths = (ulong *) tmp_str1.ptr();
+ tmp_row = (MYSQL_ROW) tmp_str3.ptr();
+ field_count = tmp_str1.length() / sizeof(ulong);
+ row.row = tmp_row;
+ row.lengths = tmp_lengths;
+ row.field_count = field_count;
+ row.row_first = row.row;
+ row.lengths_first = row.lengths;
+ for (i = 0; i < field_count; i++)
+ {
+ if (*tmp_row)
+ {
+ *tmp_row = (char *) row_ptr;
+ row_ptr += *tmp_lengths + 1;
+ }
+ tmp_row++;
+ tmp_lengths++;
+ }
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+int spider_db_mysql_result::fetch_table_status(
+ int mode,
+ ha_rows &records,
+ ulong &mean_rec_length,
+ ulonglong &data_file_length,
+ ulonglong &max_data_file_length,
+ ulonglong &index_file_length,
+ ulonglong &auto_increment_value,
+ time_t &create_time,
+ time_t &update_time,
+ time_t &check_time
+) {
+ int error_num;
+ MYSQL_ROW mysql_row;
+ MYSQL_TIME mysql_time;
+#ifdef MARIADB_BASE_VERSION
+ uint not_used_uint;
+#else
+ my_bool not_used_my_bool;
+#endif
+#ifdef SPIDER_HAS_TIME_STATUS
+ MYSQL_TIME_STATUS time_status;
+#else
+ int time_status;
+#endif
+ long not_used_long;
+ DBUG_ENTER("spider_db_mysql_result::fetch_table_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(mysql_row = mysql_fetch_row(db_result)))
+ {
+ DBUG_PRINT("info",("spider fetch row is null"));
+ DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
+ }
+ if (mode == 1)
+ {
+ if (num_fields() != 18)
+ {
+ DBUG_PRINT("info",("spider field_count != 18"));
+ DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
+ }
+
+ if (mysql_row[4])
+ records =
+ (ha_rows) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
+ else
+ records = (ha_rows) 0;
+ DBUG_PRINT("info",
+ ("spider records=%lld", records));
+ if (mysql_row[5])
+ mean_rec_length =
+ (ulong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
+ else
+ mean_rec_length = 0;
+ DBUG_PRINT("info",
+ ("spider mean_rec_length=%lu", mean_rec_length));
+ if (mysql_row[6])
+ data_file_length =
+ (ulonglong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num);
+ else
+ data_file_length = 0;
+ DBUG_PRINT("info",
+ ("spider data_file_length=%lld", data_file_length));
+ if (mysql_row[7])
+ max_data_file_length =
+ (ulonglong) my_strtoll10(mysql_row[7], (char**) NULL, &error_num);
+ else
+ max_data_file_length = 0;
+ DBUG_PRINT("info",
+ ("spider max_data_file_length=%lld", max_data_file_length));
+ if (mysql_row[8])
+ index_file_length =
+ (ulonglong) my_strtoll10(mysql_row[8], (char**) NULL, &error_num);
+ else
+ index_file_length = 0;
+ DBUG_PRINT("info",
+ ("spider index_file_length=%lld", index_file_length));
+ if (mysql_row[10])
+ auto_increment_value =
+ (ulonglong) my_strtoll10(mysql_row[10], (char**) NULL, &error_num);
+ else
+ auto_increment_value = 1;
+ DBUG_PRINT("info",
+ ("spider auto_increment_value=%lld", auto_increment_value));
+ if (mysql_row[11])
+ {
+#ifdef SPIDER_HAS_TIME_STATUS
+ my_time_status_init(&time_status);
+#endif
+ str_to_datetime(mysql_row[11], strlen(mysql_row[11]), &mysql_time, 0,
+ &time_status);
+#ifdef MARIADB_BASE_VERSION
+ create_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_uint);
+#else
+ create_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_my_bool);
+#endif
+ } else
+ create_time = (time_t) 0;
+#ifndef DBUG_OFF
+ {
+ struct tm *ts, tmp_ts;
+ char buf[80];
+ ts = localtime_r(&create_time, &tmp_ts);
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
+ DBUG_PRINT("info",("spider create_time=%s", buf));
+ }
+#endif
+ if (mysql_row[12])
+ {
+#ifdef SPIDER_HAS_TIME_STATUS
+ my_time_status_init(&time_status);
+#endif
+ str_to_datetime(mysql_row[12], strlen(mysql_row[12]), &mysql_time, 0,
+ &time_status);
+#ifdef MARIADB_BASE_VERSION
+ update_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_uint);
+#else
+ update_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_my_bool);
+#endif
+ } else
+ update_time = (time_t) 0;
+#ifndef DBUG_OFF
+ {
+ struct tm *ts, tmp_ts;
+ char buf[80];
+ ts = localtime_r(&update_time, &tmp_ts);
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
+ DBUG_PRINT("info",("spider update_time=%s", buf));
+ }
+#endif
+ if (mysql_row[13])
+ {
+#ifdef SPIDER_HAS_TIME_STATUS
+ my_time_status_init(&time_status);
+#endif
+ str_to_datetime(mysql_row[13], strlen(mysql_row[13]), &mysql_time, 0,
+ &time_status);
+#ifdef MARIADB_BASE_VERSION
+ check_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_uint);
+#else
+ check_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_my_bool);
+#endif
+ } else
+ check_time = (time_t) 0;
+#ifndef DBUG_OFF
+ {
+ struct tm *ts, tmp_ts;
+ char buf[80];
+ ts = localtime_r(&check_time, &tmp_ts);
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
+ DBUG_PRINT("info",("spider check_time=%s", buf));
+ }
+#endif
+ } else {
+ if (mysql_row[0])
+ records =
+ (ha_rows) my_strtoll10(mysql_row[0], (char**) NULL, &error_num);
+ else
+ records = (ha_rows) 0;
+ DBUG_PRINT("info",
+ ("spider records=%lld", records));
+ if (mysql_row[1])
+ mean_rec_length =
+ (ulong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num);
+ else
+ mean_rec_length = 0;
+ DBUG_PRINT("info",
+ ("spider mean_rec_length=%lu", mean_rec_length));
+ if (mysql_row[2])
+ data_file_length =
+ (ulonglong) my_strtoll10(mysql_row[2], (char**) NULL, &error_num);
+ else
+ data_file_length = 0;
+ DBUG_PRINT("info",
+ ("spider data_file_length=%lld", data_file_length));
+ if (mysql_row[3])
+ max_data_file_length =
+ (ulonglong) my_strtoll10(mysql_row[3], (char**) NULL, &error_num);
+ else
+ max_data_file_length = 0;
+ DBUG_PRINT("info",
+ ("spider max_data_file_length=%lld", max_data_file_length));
+ if (mysql_row[4])
+ index_file_length =
+ (ulonglong) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
+ else
+ index_file_length = 0;
+ DBUG_PRINT("info",
+ ("spider index_file_length=%lld", index_file_length));
+ if (mysql_row[5])
+ auto_increment_value =
+ (ulonglong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
+ else
+ auto_increment_value = 1;
+ DBUG_PRINT("info",
+ ("spider auto_increment_value=%lld", auto_increment_value));
+ if (mysql_row[6])
+ {
+#ifdef SPIDER_HAS_TIME_STATUS
+ my_time_status_init(&time_status);
+#endif
+ str_to_datetime(mysql_row[6], strlen(mysql_row[6]), &mysql_time, 0,
+ &time_status);
+#ifdef MARIADB_BASE_VERSION
+ create_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_uint);
+#else
+ create_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_my_bool);
+#endif
+ } else
+ create_time = (time_t) 0;
+#ifndef DBUG_OFF
+ {
+ struct tm *ts, tmp_ts;
+ char buf[80];
+ ts = localtime_r(&create_time, &tmp_ts);
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
+ DBUG_PRINT("info",("spider create_time=%s", buf));
+ }
+#endif
+ if (mysql_row[7])
+ {
+#ifdef SPIDER_HAS_TIME_STATUS
+ my_time_status_init(&time_status);
+#endif
+ str_to_datetime(mysql_row[7], strlen(mysql_row[7]), &mysql_time, 0,
+ &time_status);
+#ifdef MARIADB_BASE_VERSION
+ update_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_uint);
+#else
+ update_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_my_bool);
+#endif
+ } else
+ update_time = (time_t) 0;
+#ifndef DBUG_OFF
+ {
+ struct tm *ts, tmp_ts;
+ char buf[80];
+ ts = localtime_r(&update_time, &tmp_ts);
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
+ DBUG_PRINT("info",("spider update_time=%s", buf));
+ }
+#endif
+ if (mysql_row[8])
+ {
+#ifdef SPIDER_HAS_TIME_STATUS
+ my_time_status_init(&time_status);
+#endif
+ str_to_datetime(mysql_row[8], strlen(mysql_row[8]), &mysql_time, 0,
+ &time_status);
+#ifdef MARIADB_BASE_VERSION
+ check_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_uint);
+#else
+ check_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_my_bool);
+#endif
+ } else
+ check_time = (time_t) 0;
+#ifndef DBUG_OFF
+ {
+ struct tm *ts, tmp_ts;
+ char buf[80];
+ ts = localtime_r(&check_time, &tmp_ts);
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
+ DBUG_PRINT("info",("spider check_time=%s", buf));
+ }
+#endif
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_result::fetch_table_records(
+ int mode,
+ ha_rows &records
+) {
+ int error_num;
+ MYSQL_ROW mysql_row;
+ DBUG_ENTER("spider_db_mysql_result::fetch_table_records");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(mysql_row = mysql_fetch_row(db_result)))
+ {
+ DBUG_PRINT("info",("spider fetch row is null"));
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ if (mode == 1)
+ {
+ if (mysql_row[0])
+ {
+ records =
+ (ha_rows) my_strtoll10(mysql_row[0], (char**) NULL, &error_num);
+ } else
+ records = (ha_rows) 0;
+ DBUG_PRINT("info",
+ ("spider records=%lld", records));
+ } else {
+ if (num_fields() != 10)
+ {
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+
+ if (mysql_row[8])
+ {
+ records =
+ (ha_rows) my_strtoll10(mysql_row[8], (char**) NULL, &error_num);
+ } else
+ records = 0;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_result::fetch_table_cardinality(
+ int mode,
+ TABLE *table,
+ longlong *cardinality,
+ uchar *cardinality_upd,
+ int bitmap_size
+) {
+ int error_num;
+ MYSQL_ROW mysql_row;
+ Field *field;
+ DBUG_ENTER("spider_db_mysql_result::fetch_table_cardinality");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(mysql_row = mysql_fetch_row(db_result)))
+ {
+ DBUG_PRINT("info",("spider fetch row is null"));
+ /* no index */
+ DBUG_RETURN(0);
+ }
+ memset((uchar *) cardinality_upd, 0, sizeof(uchar) * bitmap_size);
+ if (mode == 1)
+ {
+ uint num_fields = this->num_fields();
+ if (num_fields < 12 || num_fields > 13)
+ {
+ DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 13"));
+ DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
+ }
+
+ while (mysql_row)
+ {
+ if (
+ mysql_row[4] &&
+ mysql_row[6] &&
+ (field = find_field_in_table_sef(table, mysql_row[4]))
+ ) {
+ if ((cardinality[field->field_index] =
+ (longlong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num))
+ <= 0)
+ cardinality[field->field_index] = 1;
+ spider_set_bit(cardinality_upd, field->field_index);
+ DBUG_PRINT("info",
+ ("spider col_name=%s", mysql_row[4]));
+ DBUG_PRINT("info",
+ ("spider cardinality=%lld",
+ cardinality[field->field_index]));
+ } else if (mysql_row[4])
+ {
+ DBUG_PRINT("info",
+ ("spider skip col_name=%s", mysql_row[4]));
+ } else {
+ DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
+ }
+ mysql_row = mysql_fetch_row(db_result);
+ }
+ } else {
+ while (mysql_row)
+ {
+ if (
+ mysql_row[0] &&
+ mysql_row[1] &&
+ (field = find_field_in_table_sef(table, mysql_row[0]))
+ ) {
+ if ((cardinality[field->field_index] =
+ (longlong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num))
+ <= 0)
+ cardinality[field->field_index] = 1;
+ spider_set_bit(cardinality_upd, field->field_index);
+ DBUG_PRINT("info",
+ ("spider col_name=%s", mysql_row[0]));
+ DBUG_PRINT("info",
+ ("spider cardinality=%lld",
+ cardinality[field->field_index]));
+ } else if (mysql_row[0])
+ {
+ DBUG_PRINT("info",
+ ("spider skip col_name=%s", mysql_row[0]));
+ } else {
+ DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
+ }
+ mysql_row = mysql_fetch_row(db_result);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_result::fetch_table_mon_status(
+ int &status
+) {
+ MYSQL_ROW mysql_row;
+ DBUG_ENTER("spider_db_mysql_result::fetch_table_mon_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(mysql_row = mysql_fetch_row(db_result)))
+ {
+ DBUG_PRINT("info",("spider fetch row is null"));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (num_fields() != 1)
+ {
+ DBUG_PRINT("info",("spider num_fields != 1"));
+ my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
+ DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
+ }
+ if (mysql_row[0])
+ status = atoi(mysql_row[0]);
+ else
+ status = SPIDER_LINK_MON_OK;
+ DBUG_PRINT("info", ("spider status=%d", status));
+ DBUG_RETURN(0);
+}
+
+longlong spider_db_mysql_result::num_rows()
+{
+ DBUG_ENTER("spider_db_mysql_result::num_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((longlong) mysql_num_rows(db_result));
+}
+
+uint spider_db_mysql_result::num_fields()
+{
+ DBUG_ENTER("spider_db_mysql_result::num_fields");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(mysql_num_fields(db_result));
+}
+
+void spider_db_mysql_result::move_to_pos(
+ longlong pos
+) {
+ DBUG_ENTER("spider_db_mysql_result::move_to_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider pos=%lld", pos));
+/*
+ DBUG_ASSERT(first_row);
+*/
+ db_result->data_cursor = first_row + pos;
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_mysql_result::get_errno()
+{
+ DBUG_ENTER("spider_db_mysql_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_mysql_result::fetch_columns_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+) {
+ MYSQL_ROW mysql_row;
+ DBUG_ENTER("spider_db_mysql_result::fetch_columns_for_discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(mysql_row = mysql_fetch_row(db_result)))
+ {
+ DBUG_PRINT("info",("spider fetch row is null"));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (num_fields() != 6)
+ {
+ DBUG_PRINT("info",("spider num_fields != 6"));
+ my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
+ DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
+ }
+ do {
+ 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);
+ if (str->append(mysql_row[0], strlen(mysql_row[0]), access_charset))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_SPACE_LEN))
+ {
+ 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_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (!strcmp(mysql_row[2], "NO"))
+ {
+ if (str->reserve(SPIDER_SQL_NOT_NULL_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NOT_NULL_STR, SPIDER_SQL_NOT_NULL_LEN);
+ if (mysql_row[4])
+ {
+ if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ }
+ } else {
+ if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
+ if (mysql_row[4])
+ {
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_NULL_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ }
+ }
+ 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);
+ } while ((mysql_row = mysql_fetch_row(db_result)));
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_result::fetch_index_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+) {
+ MYSQL_ROW mysql_row;
+ DBUG_ENTER("spider_db_mysql_result::fetch_index_for_discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(mysql_row = mysql_fetch_row(db_result)))
+ {
+ DBUG_PRINT("info",("spider fetch row is null"));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (num_fields() != 13)
+ {
+ DBUG_PRINT("info",("spider num_fields != 13"));
+ my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
+ DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
+ }
+ bool first = TRUE;
+ do {
+ if (!strcmp(mysql_row[3], "1"))
+ {
+ if (first)
+ {
+ first = FALSE;
+ } else {
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ /* new index */
+ if (!strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
+ {
+ /* primary key */
+ if (str->reserve(SPIDER_DB_PK_NAME_LEN + SPIDER_SQL_SPACE_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_DB_PK_NAME_STR, SPIDER_DB_PK_NAME_LEN);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ } else if (!strcmp(mysql_row[1], "0"))
+ {
+ /* unique key */
+ if (str->reserve(SPIDER_DB_UNIQUE_NAME_LEN + SPIDER_SQL_SPACE_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_DB_UNIQUE_NAME_STR, SPIDER_DB_UNIQUE_NAME_LEN);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ }
+ if (str->reserve(SPIDER_DB_KEY_NAME_LEN + SPIDER_SQL_SPACE_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_DB_KEY_NAME_STR, SPIDER_DB_KEY_NAME_LEN);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ if (strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
+ {
+ 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);
+ if (str->append(mysql_row[2], strlen(mysql_row[2]), access_charset))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ 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);
+ }
+ 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);
+ 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);
+ if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ 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);
+ if (mysql_row[7])
+ {
+ 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);
+ if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ 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);
+ }
+ } else {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_NAME_QUOTE_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ 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);
+ if (mysql_row[7])
+ {
+ 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);
+ if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ 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);
+ }
+ }
+ } while ((mysql_row = mysql_fetch_row(db_result)));
+ if (!first)
+ {
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
+spider_db_mysql::spider_db_mysql(
+ SPIDER_CONN *conn
+) : spider_db_conn(conn), lock_table_hash_inited(FALSE),
+ handler_open_array_inited(FALSE)
+{
+ DBUG_ENTER("spider_db_mysql::spider_db_mysql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ db_conn = NULL;
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mysql::~spider_db_mysql()
+{
+ DBUG_ENTER("spider_db_mysql::~spider_db_mysql");
+ 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);
+ }
+ if (lock_table_hash_inited)
+ {
+ spider_free_mem_calc(spider_current_trx,
+ lock_table_hash_id,
+ lock_table_hash.array.max_element *
+ lock_table_hash.array.size_of_element);
+ my_hash_free(&lock_table_hash);
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_mysql::init()
+{
+ DBUG_ENTER("spider_db_mysql::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (
+ my_hash_init(&lock_table_hash, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_link_get_key, 0, 0)
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ spider_alloc_calc_mem_init(lock_table_hash, 140);
+ spider_alloc_calc_mem(spider_current_trx,
+ lock_table_hash,
+ lock_table_hash.array.max_element *
+ lock_table_hash.array.size_of_element);
+ lock_table_hash_inited = TRUE;
+
+ 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, 162);
+ 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_mysql::is_connected()
+{
+ DBUG_ENTER("spider_db_mysql::is_connected");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(db_conn);
+}
+
+void spider_db_mysql::bg_connect()
+{
+ DBUG_ENTER("spider_db_mysql::bg_connect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_mysql::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
+) {
+ int error_num;
+ my_bool connect_mutex = spider_param_connect_mutex();
+ DBUG_ENTER("spider_db_mysql::connect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ while (TRUE)
+ {
+ if (!db_conn)
+ {
+ if (!(db_conn = mysql_init(NULL)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ mysql_options(db_conn, MYSQL_OPT_READ_TIMEOUT,
+ &conn->net_read_timeout);
+ mysql_options(db_conn, MYSQL_OPT_WRITE_TIMEOUT,
+ &conn->net_write_timeout);
+ mysql_options(db_conn, MYSQL_OPT_CONNECT_TIMEOUT,
+ &conn->connect_timeout);
+ mysql_options(db_conn, MYSQL_OPT_USE_REMOTE_CONNECTION,
+ NULL);
+
+ if (
+ conn->tgt_ssl_ca_length |
+ conn->tgt_ssl_capath_length |
+ conn->tgt_ssl_cert_length |
+ conn->tgt_ssl_key_length
+ ) {
+ mysql_ssl_set(db_conn, conn->tgt_ssl_key, conn->tgt_ssl_cert,
+ conn->tgt_ssl_ca, conn->tgt_ssl_capath, conn->tgt_ssl_cipher);
+ if (conn->tgt_ssl_vsc)
+ {
+ my_bool verify_flg = TRUE;
+ mysql_options(db_conn, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
+ &verify_flg);
+ }
+ }
+
+ if (conn->tgt_default_file)
+ {
+ DBUG_PRINT("info",("spider tgt_default_file=%s",
+ conn->tgt_default_file));
+ mysql_options(db_conn, MYSQL_READ_DEFAULT_FILE,
+ conn->tgt_default_file);
+ }
+ if (conn->tgt_default_group)
+ {
+ DBUG_PRINT("info",("spider tgt_default_group=%s",
+ conn->tgt_default_group));
+ mysql_options(db_conn, MYSQL_READ_DEFAULT_GROUP,
+ conn->tgt_default_group);
+ }
+
+ if (connect_mutex)
+ pthread_mutex_lock(&spider_open_conn_mutex);
+ /* tgt_db not use */
+ if (
+ !spider_param_dry_access() &&
+ !mysql_real_connect(
+ db_conn,
+ tgt_host,
+ tgt_username,
+ tgt_password,
+ NULL,
+ tgt_port,
+ tgt_socket,
+ CLIENT_MULTI_STATEMENTS
+ )
+ ) {
+ if (connect_mutex)
+ pthread_mutex_unlock(&spider_open_conn_mutex);
+ error_num = mysql_errno(db_conn);
+ disconnect();
+ if (
+ (
+ error_num != CR_CONN_HOST_ERROR &&
+ error_num != CR_CONNECTION_ERROR
+ ) ||
+ !connect_retry_count
+ ) {
+ *conn->need_mon = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
+ my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
+ server_name ? server_name : tgt_host);
+ DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
+ }
+ connect_retry_count--;
+ my_sleep((ulong) connect_retry_interval);
+ } else {
+ if (connect_mutex)
+ pthread_mutex_unlock(&spider_open_conn_mutex);
+ break;
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::ping(
+) {
+ DBUG_ENTER("spider_db_mysql::ping");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_param_dry_access())
+ DBUG_RETURN(0);
+ DBUG_RETURN(simple_command(db_conn, COM_PING, 0, 0, 0));
+}
+
+void spider_db_mysql::bg_disconnect()
+{
+ DBUG_ENTER("spider_db_mysql::bg_disconnect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_mysql::disconnect()
+{
+ DBUG_ENTER("spider_db_mysql::disconnect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider db_conn=%p", db_conn));
+ if (db_conn)
+ {
+ mysql_close(db_conn);
+ db_conn = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_mysql::set_net_timeout()
+{
+ DBUG_ENTER("spider_db_mysql::set_net_timeout");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider conn=%p", conn));
+ my_net_set_read_timeout(&db_conn->net, conn->net_read_timeout);
+ my_net_set_write_timeout(&db_conn->net, conn->net_write_timeout);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::exec_query(
+ const char *query,
+ uint length,
+ int quick_mode
+) {
+ int error_num = 0;
+ uint log_result_errors = spider_param_log_result_errors();
+ DBUG_ENTER("spider_db_mysql::exec_query");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_param_general_log())
+ {
+ const char *tgt_str = conn->tgt_host;
+ uint32 tgt_len = conn->tgt_host_length;
+ spider_string tmp_query_str;
+ tmp_query_str.init_calc_mem(230);
+ if (tmp_query_str.reserve(
+ length + conn->tgt_wrapper_length +
+ tgt_len + (SPIDER_SQL_SPACE_LEN * 2)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ 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(query, length);
+ general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
+ tmp_query_str.length());
+ }
+ if (!spider_param_dry_access())
+ {
+ error_num = mysql_real_query(db_conn, query, length);
+ }
+ if (
+ (error_num && log_result_errors >= 1) ||
+ (log_result_errors >= 2 && db_conn->warning_count > 0) ||
+ (log_result_errors >= 4)
+ ) {
+ THD *thd = current_thd;
+ uint log_result_error_with_sql = spider_param_log_result_error_with_sql();
+ if (log_result_error_with_sql)
+ {
+ time_t cur_time = (time_t) time((time_t*) 0);
+ struct tm lt;
+ struct tm *l_time = localtime_r(&cur_time, &lt);
+ spider_string tmp_query_str;
+ tmp_query_str.init_calc_mem(243);
+ uint query_length = thd->query_length();
+ if ((log_result_error_with_sql & 2) && query_length)
+ {
+ Security_context *security_ctx = thd->security_ctx;
+ tmp_query_str.length(0);
+ if (tmp_query_str.reserve(query_length + 1))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ tmp_query_str.q_append(thd->query(), query_length);
+ fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [RECV SPIDER SQL] "
+ "from [%s][%s] to %ld: "
+ "sql: %s\n",
+ l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
+ l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
+ security_ctx->user ? security_ctx->user : "system user",
+ security_ctx->host_or_ip,
+ thd->thread_id,
+ tmp_query_str.c_ptr_safe());
+ }
+ if (log_result_error_with_sql & 1)
+ {
+ tmp_query_str.length(0);
+ if (tmp_query_str.reserve(length + 1))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ tmp_query_str.q_append(query, length);
+ fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [SEND SPIDER SQL] "
+ "from %ld to [%s] %ld: "
+ "sql: %s\n",
+ l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
+ l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
+ thd->thread_id, conn->tgt_host, db_conn->thread_id,
+ tmp_query_str.c_ptr_safe());
+ }
+ }
+ if (log_result_errors >= 2 && db_conn->warning_count > 0)
+ {
+ time_t cur_time = (time_t) time((time_t*) 0);
+ struct tm lt;
+ struct tm *l_time = localtime_r(&cur_time, &lt);
+ fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
+ "from [%s] %ld to %ld: "
+ "affected_rows: %llu id: %llu status: %u warning_count: %u\n",
+ l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
+ l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
+ conn->tgt_host, db_conn->thread_id, thd->thread_id,
+ db_conn->affected_rows, db_conn->insert_id,
+ db_conn->server_status, db_conn->warning_count);
+ if (spider_param_log_result_errors() >= 3)
+ print_warnings(l_time);
+ } else if (log_result_errors >= 4)
+ {
+ time_t cur_time = (time_t) time((time_t*) 0);
+ struct tm lt;
+ struct tm *l_time = localtime_r(&cur_time, &lt);
+ fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [INFO SPIDER RESULT] "
+ "from [%s] %ld to %ld: "
+ "affected_rows: %llu id: %llu status: %u warning_count: %u\n",
+ l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
+ l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
+ conn->tgt_host, db_conn->thread_id, thd->thread_id,
+ db_conn->affected_rows, db_conn->insert_id,
+ db_conn->server_status, db_conn->warning_count);
+ }
+ }
+ DBUG_RETURN(error_num);
+}
+
+int spider_db_mysql::get_errno()
+{
+ DBUG_ENTER("spider_db_mysql::get_errno");
+ DBUG_PRINT("info",("spider this=%p", this));
+ stored_error = mysql_errno(db_conn);
+ DBUG_PRINT("info",("spider stored_error=%d", stored_error));
+ DBUG_RETURN(stored_error);
+}
+
+const char *spider_db_mysql::get_error()
+{
+ const char *error_ptr;
+ DBUG_ENTER("spider_db_mysql::get_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_ptr = mysql_error(db_conn);
+ DBUG_PRINT("info",("spider error=%s", error_ptr));
+ DBUG_RETURN(error_ptr);
+}
+
+bool spider_db_mysql::is_server_gone_error(
+ int error_num
+) {
+ bool server_gone;
+ DBUG_ENTER("spider_db_mysql::is_server_gone_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ server_gone =
+ (error_num == CR_SERVER_GONE_ERROR || error_num == CR_SERVER_LOST);
+ DBUG_PRINT("info",("spider server_gone=%s", server_gone ? "TRUE" : "FALSE"));
+ DBUG_RETURN(server_gone);
+}
+
+bool spider_db_mysql::is_dup_entry_error(
+ int error_num
+) {
+ bool dup_entry;
+ DBUG_ENTER("spider_db_mysql::is_dup_entry_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ dup_entry =
+ (
+ error_num == ER_DUP_ENTRY ||
+ error_num == ER_DUP_KEY ||
+ error_num == HA_ERR_FOUND_DUPP_KEY
+ );
+ DBUG_PRINT("info",("spider dup_entry=%s", dup_entry ? "TRUE" : "FALSE"));
+ DBUG_RETURN(dup_entry);
+}
+
+bool spider_db_mysql::is_xa_nota_error(
+ int error_num
+) {
+ bool xa_nota;
+ DBUG_ENTER("spider_db_mysql::is_xa_nota_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ xa_nota =
+ (
+ error_num == ER_XAER_NOTA ||
+ error_num == ER_XA_RBTIMEOUT ||
+ error_num == ER_XA_RBDEADLOCK
+ );
+ DBUG_PRINT("info",("spider xa_nota=%s", xa_nota ? "TRUE" : "FALSE"));
+ DBUG_RETURN(xa_nota);
+}
+
+void spider_db_mysql::print_warnings(
+ struct tm *l_time
+) {
+ DBUG_ENTER("spider_db_mysql::print_warnings");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (db_conn->status == MYSQL_STATUS_READY)
+ {
+#if MYSQL_VERSION_ID < 50500
+ if (!(db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS))
+#else
+ if (!(db_conn->server_status & SERVER_MORE_RESULTS_EXISTS))
+#endif
+ {
+/*
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+*/
+ if (
+ spider_param_dry_access() ||
+ !mysql_real_query(db_conn, SPIDER_SQL_SHOW_WARNINGS_STR,
+ SPIDER_SQL_SHOW_WARNINGS_LEN)
+ ) {
+ MYSQL_RES *res = NULL;
+ MYSQL_ROW row = NULL;
+ uint num_fields;
+ if (
+ spider_param_dry_access() ||
+ !(res = mysql_store_result(db_conn)) ||
+ !(row = mysql_fetch_row(res))
+ ) {
+ if (mysql_errno(db_conn))
+ {
+ if (res)
+ mysql_free_result(res);
+/*
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+*/
+ DBUG_VOID_RETURN;
+ }
+ /* no record is ok */
+ }
+/*
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+*/
+ num_fields = mysql_num_fields(res);
+ if (num_fields != 3)
+ {
+ mysql_free_result(res);
+ DBUG_VOID_RETURN;
+ }
+ while (row)
+ {
+ fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
+ "from [%s] %ld to %ld: %s %s %s\n",
+ l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
+ l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
+ conn->tgt_host, db_conn->thread_id,
+ current_thd->thread_id, row[0], row[1], row[2]);
+ row = mysql_fetch_row(res);
+ }
+ if (res)
+ mysql_free_result(res);
+ } else {
+/*
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+*/
+ }
+ }
+ }
+ DBUG_VOID_RETURN;
+}
+
+spider_db_result *spider_db_mysql::store_result(
+ spider_db_result_buffer **spider_res_buf,
+ st_spider_db_request_key *request_key,
+ int *error_num
+) {
+ spider_db_mysql_result *result;
+ DBUG_ENTER("spider_db_mysql::store_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(!spider_res_buf);
+ if ((result = new spider_db_mysql_result()))
+ {
+ *error_num = 0;
+ if (
+ spider_param_dry_access() ||
+ !(result->db_result = mysql_store_result(db_conn))
+ ) {
+ delete result;
+ result = NULL;
+ } else {
+ result->first_row = result->db_result->data_cursor;
+ DBUG_PRINT("info",("spider result->first_row=%p", result->first_row));
+ }
+ } else {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ }
+ DBUG_RETURN(result);
+}
+
+spider_db_result *spider_db_mysql::use_result(
+ st_spider_db_request_key *request_key,
+ int *error_num
+) {
+ spider_db_mysql_result *result;
+ DBUG_ENTER("spider_db_mysql::use_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((result = new spider_db_mysql_result()))
+ {
+ *error_num = 0;
+ if (
+ spider_param_dry_access() ||
+ !(result->db_result = db_conn->methods->use_result(db_conn))
+ ) {
+ delete result;
+ result = NULL;
+ } else {
+ result->first_row = NULL;
+ }
+ } else {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ }
+ DBUG_RETURN(result);
+}
+
+int spider_db_mysql::next_result()
+{
+ int status;
+ DBUG_ENTER("spider_db_mysql::next_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (db_conn->status != MYSQL_STATUS_READY)
+ {
+ my_message(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
+ DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
+ }
+
+ db_conn->net.last_errno = 0;
+ db_conn->net.last_error[0] = '\0';
+ strmov(db_conn->net.sqlstate, "00000");
+ db_conn->affected_rows = ~(my_ulonglong) 0;
+
+#if MYSQL_VERSION_ID < 50500
+ if (db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS)
+#else
+ if (db_conn->server_status & SERVER_MORE_RESULTS_EXISTS)
+#endif
+ {
+ if ((status = db_conn->methods->read_query_result(db_conn)) > 0)
+ DBUG_RETURN(spider_db_errorno(conn));
+ DBUG_RETURN(status);
+ }
+ DBUG_RETURN(-1);
+}
+
+uint spider_db_mysql::affected_rows()
+{
+ MYSQL *last_used_con;
+ DBUG_ENTER("spider_db_mysql::affected_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+#if MYSQL_VERSION_ID < 50500
+ last_used_con = db_conn->last_used_con;
+#else
+ last_used_con = db_conn;
+#endif
+ DBUG_RETURN((uint) last_used_con->affected_rows);
+}
+
+ulonglong spider_db_mysql::last_insert_id()
+{
+ MYSQL *last_used_con;
+ DBUG_ENTER("spider_db_mysql::last_insert_id");
+ DBUG_PRINT("info",("spider this=%p", this));
+#if MYSQL_VERSION_ID < 50500
+ last_used_con = db_conn->last_used_con;
+#else
+ last_used_con = db_conn;
+#endif
+ DBUG_RETURN((uint) last_used_con->insert_id);
+}
+
+int spider_db_mysql::set_character_set(
+ const char *csname
+) {
+ DBUG_ENTER("spider_db_mysql::set_character_set");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_param_dry_access())
+ DBUG_RETURN(0);
+ DBUG_RETURN(mysql_set_character_set(db_conn, csname));
+}
+
+int spider_db_mysql::select_db(
+ const char *dbname
+) {
+ DBUG_ENTER("spider_db_mysql::select_db");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_param_dry_access())
+ DBUG_RETURN(0);
+ DBUG_RETURN(mysql_select_db(db_conn, dbname));
+}
+
+int spider_db_mysql::consistent_snapshot(
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_mysql::consistent_snapshot");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR,
+ SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+bool spider_db_mysql::trx_start_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_mysql::trx_start_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+int spider_db_mysql::start_transaction(
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_mysql::start_transaction");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_START_TRANSACTION_STR,
+ SPIDER_SQL_START_TRANSACTION_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::commit(
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_mysql::commit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_COMMIT_STR,
+ SPIDER_SQL_COMMIT_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::rollback(
+ int *need_mon
+) {
+ bool is_error;
+ int error_num;
+ DBUG_ENTER("spider_db_mysql::rollback");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_ROLLBACK_STR,
+ SPIDER_SQL_ROLLBACK_LEN,
+ -1,
+ need_mon)
+ ) {
+ is_error = conn->thd->is_error();
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ error_num = spider_db_errorno(conn);
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !is_error
+ )
+ conn->thd->clear_error();
+ else {
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ }
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::xa_start(
+ XID *xid,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_mysql::xa_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+bool spider_db_mysql::xa_start_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_mysql::xa_start_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+int spider_db_mysql::xa_end(
+ XID *xid,
+ int *need_mon
+) {
+ char sql_buf[SPIDER_SQL_XA_END_LEN + XIDDATASIZE + sizeof(long) + 9];
+ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
+ DBUG_ENTER("spider_db_mysql::xa_end");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql_str.init_calc_mem(108);
+
+ sql_str.length(0);
+ sql_str.q_append(SPIDER_SQL_XA_END_STR, SPIDER_SQL_XA_END_LEN);
+ spider_db_append_xid_str(&sql_str, xid);
+ if (spider_db_query(
+ conn,
+ sql_str.ptr(),
+ sql_str.length(),
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::xa_prepare(
+ XID *xid,
+ int *need_mon
+) {
+ char sql_buf[SPIDER_SQL_XA_PREPARE_LEN + XIDDATASIZE + sizeof(long) + 9];
+ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
+ DBUG_ENTER("spider_db_mysql::xa_prepare");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql_str.init_calc_mem(109);
+
+ sql_str.length(0);
+ sql_str.q_append(SPIDER_SQL_XA_PREPARE_STR, SPIDER_SQL_XA_PREPARE_LEN);
+ spider_db_append_xid_str(&sql_str, xid);
+ if (spider_db_query(
+ conn,
+ sql_str.ptr(),
+ sql_str.length(),
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::xa_commit(
+ XID *xid,
+ int *need_mon
+) {
+ char sql_buf[SPIDER_SQL_XA_COMMIT_LEN + XIDDATASIZE + sizeof(long) + 9];
+ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
+ DBUG_ENTER("spider_db_mysql::xa_commit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql_str.init_calc_mem(110);
+
+ sql_str.length(0);
+ sql_str.q_append(SPIDER_SQL_XA_COMMIT_STR, SPIDER_SQL_XA_COMMIT_LEN);
+ spider_db_append_xid_str(&sql_str, xid);
+ if (spider_db_query(
+ conn,
+ sql_str.ptr(),
+ sql_str.length(),
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::xa_rollback(
+ XID *xid,
+ int *need_mon
+) {
+ char sql_buf[SPIDER_SQL_XA_ROLLBACK_LEN + XIDDATASIZE + sizeof(long) + 9];
+ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
+ DBUG_ENTER("spider_db_mysql::xa_rollback");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql_str.init_calc_mem(111);
+
+ sql_str.length(0);
+ sql_str.q_append(SPIDER_SQL_XA_ROLLBACK_STR, SPIDER_SQL_XA_ROLLBACK_LEN);
+ spider_db_append_xid_str(&sql_str, xid);
+ if (spider_db_query(
+ conn,
+ sql_str.ptr(),
+ sql_str.length(),
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+bool spider_db_mysql::set_trx_isolation_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_mysql::set_trx_isolation_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+int spider_db_mysql::set_trx_isolation(
+ int trx_isolation,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_mysql::set_trx_isolation");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (trx_isolation)
+ {
+ case ISO_READ_UNCOMMITTED:
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
+ SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ break;
+ case ISO_READ_COMMITTED:
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_ISO_READ_COMMITTED_STR,
+ SPIDER_SQL_ISO_READ_COMMITTED_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ break;
+ case ISO_REPEATABLE_READ:
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_ISO_REPEATABLE_READ_STR,
+ SPIDER_SQL_ISO_REPEATABLE_READ_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ break;
+ case ISO_SERIALIZABLE:
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_ISO_SERIALIZABLE_STR,
+ SPIDER_SQL_ISO_SERIALIZABLE_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ break;
+ default:
+ DBUG_RETURN(HA_ERR_UNSUPPORTED);
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_db_mysql::set_autocommit_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_mysql::set_autocommit_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+int spider_db_mysql::set_autocommit(
+ bool autocommit,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_mysql::set_autocommit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (autocommit)
+ {
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_AUTOCOMMIT_ON_STR,
+ SPIDER_SQL_AUTOCOMMIT_ON_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ } else {
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_AUTOCOMMIT_OFF_STR,
+ SPIDER_SQL_AUTOCOMMIT_OFF_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_db_mysql::set_sql_log_off_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_mysql::set_sql_log_off_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+int spider_db_mysql::set_sql_log_off(
+ bool sql_log_off,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_mysql::set_sql_log_off");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_log_off)
+ {
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_SQL_LOG_ON_STR,
+ SPIDER_SQL_SQL_LOG_ON_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ } else {
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_SQL_LOG_OFF_STR,
+ SPIDER_SQL_SQL_LOG_OFF_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_db_mysql::set_time_zone_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_mysql::set_time_zone_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+int spider_db_mysql::set_time_zone(
+ Time_zone *time_zone,
+ int *need_mon
+) {
+ const String *tz_str = time_zone->get_name();
+ char sql_buf[MAX_FIELD_WIDTH];
+ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
+ DBUG_ENTER("spider_db_mysql::set_time_zone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql_str.init_calc_mem(214);
+ sql_str.length(0);
+ if (sql_str.reserve(SPIDER_SQL_TIME_ZONE_LEN +
+ tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_str.q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
+ sql_str.q_append(tz_str->ptr(), tz_str->length());
+ sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ if (spider_db_query(
+ conn,
+ sql_str.ptr(),
+ sql_str.length(),
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+int spider_db_mysql::append_sql(
+ char *sql,
+ ulong sql_length,
+ st_spider_db_request_key *request_key
+) {
+ DBUG_ENTER("spider_db_mysql::append_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::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
+) {
+ DBUG_ENTER("spider_db_mysql::append_open_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::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
+) {
+ DBUG_ENTER("spider_db_mysql::append_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::append_insert(
+ uint handler_id,
+ SPIDER_DB_HS_STRING_REF_BUFFER *upds,
+ st_spider_db_request_key *request_key
+) {
+ DBUG_ENTER("spider_db_mysql::append_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::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
+) {
+ DBUG_ENTER("spider_db_mysql::append_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::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
+) {
+ DBUG_ENTER("spider_db_mysql::append_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+void spider_db_mysql::reset_request_queue()
+{
+ DBUG_ENTER("spider_db_mysql::reset_request_queue");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+#endif
+
+size_t spider_db_mysql::escape_string(
+ char *to,
+ const char *from,
+ size_t from_length
+) {
+ DBUG_ENTER("spider_db_mysql::escape_string");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (db_conn->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
+ DBUG_RETURN(escape_quotes_for_mysql(db_conn->charset, to, 0,
+ from, from_length));
+ DBUG_RETURN(escape_string_for_mysql(db_conn->charset, to, 0,
+ from, from_length));
+}
+
+bool spider_db_mysql::have_lock_table_list()
+{
+ DBUG_ENTER("spider_db_mysql::have_lock_table_list");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(lock_table_hash.records);
+}
+
+int spider_db_mysql::append_lock_tables(
+ spider_string *str
+) {
+ int error_num;
+ ha_spider *tmp_spider;
+ int lock_type;
+ uint conn_link_idx;
+ int tmp_link_idx;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
+ 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;
+ DBUG_ENTER("spider_db_mysql::lock_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = spider_db_mysql_utility.append_lock_table_head(str)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ while ((tmp_link_for_hash =
+ (SPIDER_LINK_FOR_HASH *) my_hash_element(&lock_table_hash, 0)))
+ {
+ tmp_spider = tmp_link_for_hash->spider;
+ tmp_link_idx = tmp_link_for_hash->link_idx;
+ switch (tmp_spider->lock_type)
+ {
+ case TL_READ:
+ lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL;
+ break;
+ case TL_READ_NO_INSERT:
+ lock_type = SPIDER_DB_TABLE_LOCK_READ;
+ break;
+ case TL_WRITE_LOW_PRIORITY:
+ lock_type = SPIDER_DB_TABLE_LOCK_LOW_PRIORITY_WRITE;
+ break;
+ case TL_WRITE:
+ lock_type = SPIDER_DB_TABLE_LOCK_WRITE;
+ break;
+ default:
+ // no lock
+ DBUG_PRINT("info",("spider lock_type=%d", tmp_spider->lock_type));
+ DBUG_RETURN(0);
+ }
+ conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx];
+ spider_mysql_share *db_share = (spider_mysql_share *)
+ tmp_spider->share->dbton_share[conn->dbton_id];
+ if (&db_share->db_names_str[conn_link_idx])
+ {
+ db_name = db_share->db_names_str[conn_link_idx].ptr();
+ db_name_length = db_share->db_names_str[conn_link_idx].length();
+ db_name_charset = tmp_spider->share->access_charset;
+ } else {
+ db_name = tmp_spider->share->tgt_dbs[conn_link_idx];
+ db_name_length = tmp_spider->share->tgt_dbs_lengths[conn_link_idx];
+ db_name_charset = system_charset_info;
+ }
+ if (&db_share->table_names_str[conn_link_idx])
+ {
+ table_name = db_share->table_names_str[conn_link_idx].ptr();
+ table_name_length = db_share->table_names_str[conn_link_idx].length();
+ table_name_charset = tmp_spider->share->access_charset;
+ } else {
+ table_name = tmp_spider->share->tgt_table_names[conn_link_idx];
+ table_name_length =
+ tmp_spider->share->tgt_table_names_lengths[conn_link_idx];
+ table_name_charset = system_charset_info;
+ }
+ if ((error_num = spider_db_mysql_utility.
+ append_lock_table_body(
+ str,
+ db_name,
+ db_name_length,
+ db_name_charset,
+ table_name,
+ table_name_length,
+ table_name_charset,
+ lock_type
+ )
+ )) {
+ my_hash_reset(&lock_table_hash);
+ DBUG_RETURN(error_num);
+ }
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ my_hash_delete_with_hash_value(&lock_table_hash,
+ tmp_link_for_hash->db_table_str_hash_value, (uchar*) tmp_link_for_hash);
+#else
+ my_hash_delete(&lock_table_hash, (uchar*) tmp_link_for_hash);
+#endif
+ }
+ if ((error_num = spider_db_mysql_utility.append_lock_table_tail(str)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql::append_unlock_tables(
+ spider_string *str
+) {
+ int error_num;
+ DBUG_ENTER("spider_db_mysql::append_unlock_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = spider_db_mysql_utility.append_unlock_table(str)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+uint spider_db_mysql::get_lock_table_hash_count()
+{
+ DBUG_ENTER("spider_db_mysql::get_lock_table_hash_count");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(lock_table_hash.records);
+}
+
+void spider_db_mysql::reset_lock_table_hash()
+{
+ DBUG_ENTER("spider_db_mysql::reset_lock_table_hash");
+ DBUG_PRINT("info",("spider this=%p", this));
+ my_hash_reset(&lock_table_hash);
+ DBUG_VOID_RETURN;
+}
+
+uint spider_db_mysql::get_opened_handler_count()
+{
+ DBUG_ENTER("spider_db_mysql::get_opened_handler_count");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(handler_open_array.elements);
+}
+
+void spider_db_mysql::reset_opened_handler()
+{
+ ha_spider *tmp_spider;
+ int tmp_link_idx;
+ SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
+ DBUG_ENTER("spider_db_mysql::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_mysql::set_dup_key_idx(
+ ha_spider *spider,
+ int link_idx
+) {
+ TABLE *table = spider->get_table();
+ uint roop_count, pk_idx = table->s->primary_key;
+ int key_name_length;
+ int max_length = 0;
+ char *key_name;
+ DBUG_ENTER("spider_db_mysql::set_dup_key_idx");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider error_str=%s", conn->error_str));
+ for (roop_count = 0; roop_count < table->s->keys; roop_count++)
+ {
+ if (roop_count == pk_idx)
+ {
+ DBUG_PRINT("info",("spider pk_idx=%u", roop_count));
+ int all_link_idx = spider->conn_link_idx[link_idx];
+ key_name = spider->share->tgt_pk_names[all_link_idx];
+ key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx];
+ } else {
+ key_name = table->s->key_info[roop_count].name;
+ key_name_length = strlen(key_name);
+ }
+ DBUG_PRINT("info",("spider key_name=%s", key_name));
+ if (
+ max_length < key_name_length &&
+ conn->error_length - 1 >= key_name_length &&
+ *(conn->error_str + conn->error_length - 2 -
+ key_name_length) == '\'' &&
+ !strncasecmp(conn->error_str +
+ conn->error_length - 1 - key_name_length,
+ key_name, key_name_length)
+ ) {
+ max_length = key_name_length;
+ spider->dup_key_idx = roop_count;
+ }
+ }
+ if (max_length == 0)
+ spider->dup_key_idx = (uint) -1;
+ DBUG_PRINT("info",("spider dup_key_idx=%d", spider->dup_key_idx));
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_mysql::cmp_request_key_to_snd(
+ st_spider_db_request_key *request_key
+) {
+ DBUG_ENTER("spider_db_mysql::cmp_request_key_to_snd");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+spider_db_mysql_util::spider_db_mysql_util() : spider_db_util()
+{
+ DBUG_ENTER("spider_db_mysql_util::spider_db_mysql_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mysql_util::~spider_db_mysql_util()
+{
+ DBUG_ENTER("spider_db_mysql_util::~spider_db_mysql_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_mysql_util::append_name(
+ spider_string *str,
+ const char *name,
+ uint name_length
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_name");
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->q_append(name, name_length);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_name_with_charset(
+ spider_string *str,
+ const char *name,
+ uint name_length,
+ CHARSET_INFO *name_charset
+) {
+ DBUG_ENTER("spider_db_mysql_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);
+}
+
+bool spider_db_mysql_util::is_name_quote(
+ const char head_code
+) {
+ DBUG_ENTER("spider_db_mysql_util::is_name_quote");
+ DBUG_RETURN(head_code == *name_quote_str);
+}
+
+int spider_db_mysql_util::append_escaped_name_quote(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_mysql_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_mysql_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_mysql_util::append_column_value");
+ tmp_str.init_calc_mem(113);
+
+ 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);
+*/
+#ifndef DBUG_OFF
+ 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));
+*/
+#endif
+/*
+ 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
+*/
+ if (field->result_type() == STRING_RESULT)
+ {
+ DBUG_PRINT("info", ("spider STRING_RESULT"));
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ if (
+ field->type() == MYSQL_TYPE_VARCHAR ||
+ (field->type() >= MYSQL_TYPE_ENUM &&
+ field->type() <= MYSQL_TYPE_GEOMETRY)
+ ) {
+ DBUG_PRINT("info", ("spider append_escaped"));
+ char buf2[MAX_FIELD_WIDTH];
+ spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, access_charset);
+ tmp_str2.init_calc_mem(114);
+ tmp_str2.length(0);
+ if (
+ tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
+ str->reserve(tmp_str2.length() * 2) ||
+ append_escaped_util(str, tmp_str2.get_str())
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ } else if (str->append(*ptr))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ } else if (field->str_needs_quotes())
+ {
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ append_escaped_util(str, ptr);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ } else if (str->append(*ptr))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_from_with_alias(
+ spider_string *str,
+ const char **table_names,
+ uint *table_name_lengths,
+ const char **table_aliases,
+ uint *table_alias_lengths,
+ uint table_count,
+ int *table_name_pos,
+ bool over_write
+) {
+ uint roop_count, length = 0;
+ DBUG_ENTER("spider_db_mysql_util::append_from_with_alias");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!over_write)
+ {
+ for (roop_count = 0; roop_count < table_count; roop_count++)
+ length += table_name_lengths[roop_count] + SPIDER_SQL_SPACE_LEN +
+ table_alias_lengths[roop_count] + SPIDER_SQL_COMMA_LEN;
+ if (str->reserve(SPIDER_SQL_FROM_LEN + length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ *table_name_pos = str->length();
+ }
+ for (roop_count = 0; roop_count < table_count; roop_count++)
+ {
+ str->q_append(table_names[roop_count], table_name_lengths[roop_count]);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(table_aliases[roop_count], table_alias_lengths[roop_count]);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_trx_isolation(
+ spider_string *str,
+ int trx_isolation
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_trx_isolation");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
+ SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ {
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+ switch (trx_isolation)
+ {
+ case ISO_READ_UNCOMMITTED:
+ str->q_append(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
+ SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN);
+ break;
+ case ISO_READ_COMMITTED:
+ str->q_append(SPIDER_SQL_ISO_READ_COMMITTED_STR,
+ SPIDER_SQL_ISO_READ_COMMITTED_LEN);
+ break;
+ case ISO_REPEATABLE_READ:
+ str->q_append(SPIDER_SQL_ISO_REPEATABLE_READ_STR,
+ SPIDER_SQL_ISO_REPEATABLE_READ_LEN);
+ break;
+ case ISO_SERIALIZABLE:
+ str->q_append(SPIDER_SQL_ISO_SERIALIZABLE_STR,
+ SPIDER_SQL_ISO_SERIALIZABLE_LEN);
+ break;
+ default:
+ DBUG_RETURN(HA_ERR_UNSUPPORTED);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_autocommit(
+ spider_string *str,
+ bool autocommit
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_autocommit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_AUTOCOMMIT_OFF_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ {
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+ if (autocommit)
+ {
+ str->q_append(SPIDER_SQL_AUTOCOMMIT_ON_STR,
+ SPIDER_SQL_AUTOCOMMIT_ON_LEN);
+ } else {
+ str->q_append(SPIDER_SQL_AUTOCOMMIT_OFF_STR,
+ SPIDER_SQL_AUTOCOMMIT_OFF_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_sql_log_off(
+ spider_string *str,
+ bool sql_log_off
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_sql_log_off");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_LOG_OFF_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ {
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+ if (sql_log_off)
+ {
+ str->q_append(SPIDER_SQL_SQL_LOG_ON_STR, SPIDER_SQL_SQL_LOG_ON_LEN);
+ } else {
+ str->q_append(SPIDER_SQL_SQL_LOG_OFF_STR, SPIDER_SQL_SQL_LOG_OFF_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_time_zone(
+ spider_string *str,
+ Time_zone *time_zone
+) {
+ const String *tz_str = time_zone->get_name();
+ DBUG_ENTER("spider_db_mysql_util::append_time_zone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_TIME_ZONE_LEN +
+ tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ str->q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
+ str->q_append(tz_str->ptr(), tz_str->length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_start_transaction(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_start_transaction");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
+ SPIDER_SQL_START_TRANSACTION_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ {
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+ str->q_append(SPIDER_SQL_START_TRANSACTION_STR,
+ SPIDER_SQL_START_TRANSACTION_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_xa_start(
+ spider_string *str,
+ XID *xid
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_xa_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
+ SPIDER_SQL_XA_START_LEN + XIDDATASIZE + sizeof(long) + 9))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ {
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+ str->q_append(SPIDER_SQL_XA_START_STR, SPIDER_SQL_XA_START_LEN);
+ spider_db_append_xid_str(str, xid);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_lock_table_head(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_lock_table_head");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_LOCK_TABLE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_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_mysql_util::append_lock_table_body");
+ DBUG_PRINT("info",("spider this=%p", this));
+ 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);
+ if (
+ str->append(db_name, db_name_length, db_name_charset) ||
+ str->reserve((SPIDER_SQL_NAME_QUOTE_LEN) * 2 + SPIDER_SQL_DOT_LEN)
+ ) {
+ 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_DOT_STR, SPIDER_SQL_DOT_LEN);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if (
+ str->append(table_name, table_name_length, table_name_charset) ||
+ str->reserve(SPIDER_SQL_NAME_QUOTE_LEN +
+ spider_db_table_lock_len[lock_type])
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->q_append(spider_db_table_lock_str[lock_type],
+ spider_db_table_lock_len[lock_type]);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_lock_table_tail(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_lock_table_tail");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::append_unlock_table(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_unlock_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_UNLOCK_TABLE_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_UNLOCK_TABLE_STR, SPIDER_SQL_UNLOCK_TABLE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mysql_util::open_item_func(
+ Item_func *item_func,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ uint dbton_id = spider_dbton_mysql.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,
+ *separete_str = SPIDER_SQL_NULL_CHAR_STR,
+ *last_str = SPIDER_SQL_NULL_CHAR_STR;
+ int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
+ separete_str_length = SPIDER_SQL_NULL_CHAR_LEN,
+ last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
+ int use_pushdown_udf;
+ DBUG_ENTER("spider_db_mysql_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) &&
+ !item_func->arg_count
+ ) {
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
+ alias, alias_length, dbton_id));
+ } 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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, spider, str,
+ alias, alias_length, dbton_id));
+ } 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, spider, str,
+ alias, alias_length, dbton_id));
+ } 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 &&
+ !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 (func_name_length == 12)
+ {
+ if (!strncasecmp("cast_as_date", func_name, func_name_length))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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 &&
+ !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, spider, str,
+ alias, alias_length, dbton_id));
+ } else if (func_name_length == 14)
+ {
+ if (!strncasecmp("cast_as_binary", func_name, func_name_length))
+ {
+ 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 (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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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))
+ {
+ 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 (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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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, spider, str,
+ alias, alias_length, dbton_id));
+ case Item_func::CHAR_TYPECAST_FUNC:
+ {
+ 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 (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:
+ 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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_AND_STR;
+ separete_str_length = SPIDER_SQL_AND_LEN;
+ } else {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ separete_str = SPIDER_SQL_AND_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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));
+ 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, spider, str,
+ alias, alias_length, dbton_id));
+ else
+ DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
+ alias, alias_length, dbton_id));
+ 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);
+ }
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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 separete_str = %s", separete_str));
+ DBUG_PRINT("info",("spider separete_str_length = %d", separete_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, spider, str,
+ alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (roop_count == 1)
+ {
+ func_name = separete_str;
+ func_name_length = separete_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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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->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 (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_mysql_util::open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ uint dbton_id = spider_dbton_mysql.dbton_id;
+ uint roop_count, item_count = item_sum->get_arg_count();
+ int error_num;
+ DBUG_ENTER("spider_db_mysql_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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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_mysql_util::append_escaped_util(
+ spider_string *to,
+ String *from
+) {
+ DBUG_ENTER("spider_db_mysql_util::append_escaped_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ to->get_str()->append_for_single_quote(from);
+ to->mem_calc();
+ DBUG_RETURN(0);
+}
+
+spider_mysql_share::spider_mysql_share(
+ st_spider_share *share
+) : spider_db_share(
+ share
+),
+ table_select(NULL),
+ table_select_pos(0),
+ key_select(NULL),
+ key_select_pos(NULL),
+ key_hint(NULL),
+ show_table_status(NULL),
+ show_records(NULL),
+ show_index(NULL),
+ 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_mysql_share::spider_mysql_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_alloc_calc_mem_init(mem_calc, 71);
+ spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mysql_share::~spider_mysql_share()
+{
+ DBUG_ENTER("spider_mysql_share::~spider_mysql_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (table_select)
+ delete [] table_select;
+ if (key_select)
+ delete [] key_select;
+ if (key_hint)
+ delete [] key_hint;
+ free_show_table_status();
+ free_show_records();
+ free_show_index();
+ free_column_name_str();
+ free_table_names_str();
+ if (key_select_pos)
+ {
+ spider_free(spider_current_trx, key_select_pos, MYF(0));
+ }
+ spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_share::init()
+{
+ int error_num;
+ uint roop_count;
+ TABLE_SHARE *table_share = spider_share->table_share;
+ uint keys = table_share ? table_share->keys : 0;
+ DBUG_ENTER("spider_mysql_share::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(key_select_pos = (int *)
+ spider_bulk_alloc_mem(spider_current_trx, 112,
+ __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
+ &key_select_pos,
+ sizeof(int) * keys,
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ &db_table_str_hash_value,
+ sizeof(my_hash_value_type) * spider_share->all_link_count,
+#endif
+ NullS))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ if (keys > 0 &&
+ !(key_hint = new spider_string[keys])
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ for (roop_count = 0; roop_count < keys; roop_count++)
+ {
+ key_hint[roop_count].init_calc_mem(189);
+ key_hint[roop_count].set_charset(spider_share->access_charset);
+ }
+ DBUG_PRINT("info",("spider key_hint=%p", key_hint));
+
+ if (
+ !(table_select = new spider_string[1]) ||
+ (keys > 0 &&
+ !(key_select = new spider_string[keys])
+ ) ||
+ (error_num = create_table_names_str()) ||
+ (table_share &&
+ (
+ (error_num = create_column_name_str()) ||
+ (error_num = convert_key_hint_str()) ||
+ (error_num = append_show_table_status()) ||
+ (error_num = append_show_records()) ||
+ (error_num = append_show_index())
+ )
+ )
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ table_select->init_calc_mem(96);
+ if (table_share && (error_num = append_table_select()))
+ DBUG_RETURN(error_num);
+
+ for (roop_count = 0; roop_count < keys; roop_count++)
+ {
+ key_select[roop_count].init_calc_mem(97);
+ if ((error_num = append_key_select(roop_count)))
+ DBUG_RETURN(error_num);
+ }
+
+ DBUG_RETURN(error_num);
+}
+
+uint spider_mysql_share::get_column_name_length(
+ uint field_index
+) {
+ DBUG_ENTER("spider_mysql_share::get_column_name_length");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(column_name_str[field_index].length());
+}
+
+int spider_mysql_share::append_column_name(
+ spider_string *str,
+ uint field_index
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_share::append_column_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = spider_db_mysql_utility.append_name(str,
+ column_name_str[field_index].ptr(), column_name_str[field_index].length());
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_share::append_column_name_with_alias(
+ spider_string *str,
+ uint field_index,
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_mysql_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);
+}
+
+int spider_mysql_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_mysql_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_mysql_utility.append_name(str, db_nm, db_nm_len);
+ str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
+ spider_db_mysql_utility.append_name(str, table_nm, table_nm_len);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_share::append_table_name_with_adjusting(
+ 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();
+ uint db_nm_max_len = db_nm_max_length;
+ const char *table_nm = table_names_str[all_link_idx].ptr();
+ uint table_nm_len = table_names_str[all_link_idx].length();
+ uint table_nm_max_len = table_nm_max_length;
+ DBUG_ENTER("spider_mysql_share::append_table_name_with_adjusting");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_db_mysql_utility.append_name(str, db_nm, db_nm_len);
+ str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
+ spider_db_mysql_utility.append_name(str, table_nm, table_nm_len);
+ uint length =
+ db_nm_max_len - db_nm_len +
+ table_nm_max_len - table_nm_len;
+ memset((char *) str->ptr() + str->length(), ' ', length);
+ str->length(str->length() + length);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_share::append_from_with_adjusted_table_name(
+ spider_string *str,
+ int *table_name_pos
+) {
+ const char *db_nm = db_names_str[0].ptr();
+ uint db_nm_len = db_names_str[0].length();
+ uint db_nm_max_len = db_nm_max_length;
+ const char *table_nm = table_names_str[0].ptr();
+ uint table_nm_len = table_names_str[0].length();
+ uint table_nm_max_len = table_nm_max_length;
+ DBUG_ENTER("spider_mysql_share::append_from_with_adjusted_table_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_FROM_LEN + db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ *table_name_pos = str->length();
+ spider_db_mysql_utility.append_name(str, db_nm, db_nm_len);
+ str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
+ spider_db_mysql_utility.append_name(str, table_nm, table_nm_len);
+ uint length =
+ db_nm_max_len - db_nm_len +
+ table_nm_max_len - table_nm_len;
+ memset((char *) str->ptr() + str->length(), ' ', length);
+ str->length(str->length() + length);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_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_mysql.dbton_id;
+ DBUG_ENTER("spider_mysql_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_mysql_share::free_table_names_str()
+{
+ DBUG_ENTER("spider_mysql_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_mysql_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_mysql.dbton_id;
+ DBUG_ENTER("spider_mysql_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(89);
+ str->set_charset(spider_share->access_charset);
+ if ((error_num = spider_db_append_name_with_quote_str(str,
+ (char *) (*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_mysql_share::free_column_name_str()
+{
+ DBUG_ENTER("spider_mysql_share::free_column_name_str");
+ if (column_name_str)
+ {
+ delete [] column_name_str;
+ column_name_str = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_share::convert_key_hint_str()
+{
+ spider_string *tmp_key_hint;
+ int roop_count;
+ TABLE_SHARE *table_share = spider_share->table_share;
+ DBUG_ENTER("spider_mysql_share::convert_key_hint_str");
+ if (spider_share->access_charset->cset != system_charset_info->cset)
+ {
+ /* need convertion */
+ for (roop_count = 0, tmp_key_hint = key_hint;
+ roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
+ {
+ tmp_key_hint->length(0);
+ if (tmp_key_hint->append(spider_share->key_hint->ptr(),
+ spider_share->key_hint->length(), system_charset_info))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ } else {
+ for (roop_count = 0, tmp_key_hint = key_hint;
+ roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
+ {
+ if (tmp_key_hint->copy(spider_share->key_hint[roop_count]))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_share::append_show_table_status()
+{
+ int roop_count;
+ spider_string *str;
+ uint dbton_id = spider_dbton_mysql.dbton_id;
+ DBUG_ENTER("spider_mysql_append_show_table_status");
+ if (!(show_table_status =
+ new spider_string[2 * spider_share->all_link_count]))
+ goto error;
+
+ for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
+ roop_count++)
+ {
+ show_table_status[0 + (2 * roop_count)].init_calc_mem(90);
+ show_table_status[1 + (2 * roop_count)].init_calc_mem(91);
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+
+ if (
+ show_table_status[0 + (2 * roop_count)].reserve(
+ SPIDER_SQL_SHOW_TABLE_STATUS_LEN +
+ db_names_str[roop_count].length() +
+ SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
+ ((SPIDER_SQL_NAME_QUOTE_LEN) * 2) +
+ ((SPIDER_SQL_VALUE_QUOTE_LEN) * 2)) ||
+ show_table_status[1 + (2 * roop_count)].reserve(
+ SPIDER_SQL_SELECT_TABLES_STATUS_LEN +
+ db_names_str[roop_count].length() +
+ SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
+ table_names_str[roop_count].length() +
+ ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4))
+ )
+ goto error;
+ str = &show_table_status[0 + (2 * roop_count)];
+ str->q_append(
+ SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->q_append(db_names_str[roop_count].ptr(),
+ db_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(table_names_str[roop_count].ptr(),
+ table_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str = &show_table_status[1 + (2 * roop_count)];
+ str->q_append(
+ SPIDER_SQL_SELECT_TABLES_STATUS_STR,
+ SPIDER_SQL_SELECT_TABLES_STATUS_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(db_names_str[roop_count].ptr(),
+ db_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(table_names_str[roop_count].ptr(),
+ table_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (show_table_status)
+ {
+ delete [] show_table_status;
+ show_table_status = NULL;
+ }
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+}
+
+void spider_mysql_share::free_show_table_status()
+{
+ DBUG_ENTER("spider_mysql_free_show_table_status");
+ if (show_table_status)
+ {
+ delete [] show_table_status;
+ show_table_status = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_share::append_show_records()
+{
+ int roop_count;
+ spider_string *str;
+ uint dbton_id = spider_dbton_mysql.dbton_id;
+ DBUG_ENTER("spider_mysql_share::append_show_records");
+ if (!(show_records = new spider_string[spider_share->all_link_count]))
+ goto error;
+
+ for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
+ roop_count++)
+ {
+ show_records[roop_count].init_calc_mem(92);
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+
+ if (
+ show_records[roop_count].reserve(
+ SPIDER_SQL_SHOW_RECORDS_LEN +
+ db_names_str[roop_count].length() +
+ SPIDER_SQL_DOT_LEN +
+ table_names_str[roop_count].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)
+ )
+ goto error;
+ str = &show_records[roop_count];
+ str->q_append(SPIDER_SQL_SHOW_RECORDS_STR, SPIDER_SQL_SHOW_RECORDS_LEN);
+ append_table_name(str, roop_count);
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (show_records)
+ {
+ delete [] show_records;
+ show_records = NULL;
+ }
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+}
+
+void spider_mysql_share::free_show_records()
+{
+ DBUG_ENTER("spider_mysql_share::free_show_records");
+ if (show_records)
+ {
+ delete [] show_records;
+ show_records = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_share::append_show_index()
+{
+ int roop_count;
+ spider_string *str;
+ uint dbton_id = spider_dbton_mysql.dbton_id;
+ DBUG_ENTER("spider_mysql_share::append_show_index");
+ if (!(show_index = new spider_string[2 * spider_share->all_link_count]))
+ goto error;
+
+ for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
+ roop_count++)
+ {
+ show_index[0 + (2 * roop_count)].init_calc_mem(93);
+ show_index[1 + (2 * roop_count)].init_calc_mem(94);
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+
+ if (
+ show_index[0 + (2 * roop_count)].reserve(
+ SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
+ SPIDER_SQL_DOT_LEN +
+ table_names_str[roop_count].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4) ||
+ show_index[1 + (2 * roop_count)].reserve(
+ SPIDER_SQL_SELECT_STATISTICS_LEN +
+ db_names_str[roop_count].length() +
+ SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
+ table_names_str[roop_count].length() +
+ ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4) +
+ SPIDER_SQL_GROUP_LEN + SPIDER_SQL_COLUMN_NAME_LEN)
+ )
+ goto error;
+ str = &show_index[0 + (2 * roop_count)];
+ str->q_append(
+ SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
+ append_table_name(str, roop_count);
+ str = &show_index[1 + (2 * roop_count)];
+ str->q_append(
+ SPIDER_SQL_SELECT_STATISTICS_STR, SPIDER_SQL_SELECT_STATISTICS_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(db_names_str[roop_count].ptr(),
+ db_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(table_names_str[roop_count].ptr(),
+ table_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
+ str->q_append(SPIDER_SQL_COLUMN_NAME_STR, SPIDER_SQL_COLUMN_NAME_LEN);
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (show_index)
+ {
+ delete [] show_index;
+ show_index = NULL;
+ }
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+}
+
+void spider_mysql_share::free_show_index()
+{
+ DBUG_ENTER("spider_mysql_share::free_show_index");
+ if (show_index)
+ {
+ delete [] show_index;
+ show_index = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_share::append_table_select()
+{
+ Field **field;
+ uint field_length;
+ spider_string *str = table_select;
+ TABLE_SHARE *table_share = spider_share->table_share;
+ DBUG_ENTER("spider_mysql_share::append_table_select");
+ for (field = table_share->field; *field; field++)
+ {
+ field_length = column_name_str[(*field)->field_index].length();
+ if (str->reserve(field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(append_from_with_adjusted_table_name(str, &table_select_pos));
+}
+
+int spider_mysql_share::append_key_select(
+ uint idx
+) {
+ KEY_PART_INFO *key_part;
+ Field *field;
+ uint part_num;
+ uint field_length;
+ spider_string *str = &key_select[idx];
+ TABLE_SHARE *table_share = spider_share->table_share;
+ const KEY *key_info = &table_share->key_info[idx];
+ DBUG_ENTER("spider_mysql_share::append_key_select");
+ for (key_part = key_info->key_part, part_num = 0;
+ part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
+ {
+ field = key_part->field;
+ field_length = column_name_str[field->field_index].length();
+ if (str->reserve(field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(append_from_with_adjusted_table_name(str, &key_select_pos[idx]));
+}
+
+bool spider_mysql_share::need_change_db_table_name()
+{
+ DBUG_ENTER("spider_mysql_share::need_change_db_table_name");
+ DBUG_RETURN(!same_db_table_name);
+}
+
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+int spider_mysql_share::discover_table_structure(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *spider_share,
+ spider_string *str
+) {
+ int roop_count, error_num = HA_ERR_WRONG_COMMAND;
+ char sql_buf[MAX_FIELD_WIDTH];
+ spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info);
+ uint dbton_id = spider_dbton_mysql.dbton_id;
+ uint strlen = str->length();
+ DBUG_ENTER("spider_mysql_share::discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql_str.init_calc_mem(228);
+ for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
+ roop_count++)
+ {
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ {
+ DBUG_PRINT("info",("spider spider_share->sql_dbton_ids[%d]=%u",
+ roop_count, spider_share->sql_dbton_ids[roop_count]));
+ DBUG_PRINT("info",("spider dbton_id=%u", dbton_id));
+ continue;
+ }
+
+ str->length(strlen);
+ sql_str.length(0);
+ if (sql_str.reserve(
+ SPIDER_SQL_SHOW_COLUMNS_LEN + db_names_str[roop_count].length() +
+ SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
+ SPIDER_SQL_SEMICOLON_LEN +
+ SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
+ SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4
+ )) {
+ DBUG_PRINT("info",("spider alloc sql_str error"));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql_str.q_append(SPIDER_SQL_SHOW_COLUMNS_STR, SPIDER_SQL_SHOW_COLUMNS_LEN);
+ append_table_name(&sql_str, roop_count);
+ sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ sql_str.q_append(SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
+ append_table_name(&sql_str, roop_count);
+
+ SPIDER_CONN *conn;
+ int need_mon;
+ if (!(conn = spider_get_conn(
+ spider_share, 0, spider_share->conn_keys[roop_count], trx, NULL, FALSE,
+ FALSE, SPIDER_CONN_KIND_MYSQL, &error_num))
+ ) {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &need_mon;
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(spider_share, conn, roop_count);
+ spider_conn_set_timeout_from_share(conn, roop_count, trx->thd,
+ spider_share);
+ if (
+ (error_num = spider_db_set_names_internal(trx, spider_share, conn,
+ roop_count, &need_mon)) ||
+ (
+ spider_db_query(
+ conn,
+ sql_str.ptr(),
+ sql_str.length(),
+ -1,
+ &need_mon) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ DBUG_PRINT("info",("spider spider_get_trx error"));
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ continue;
+ }
+ st_spider_db_request_key request_key;
+ request_key.spider_thread_id = trx->spider_thread_id;
+ request_key.query_id = trx->thd->query_id;
+ request_key.handler = NULL;
+ request_key.request_id = 1;
+ request_key.next = NULL;
+ spider_db_result *res;
+ /* get column list */
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ DBUG_PRINT("info",("spider column store error"));
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ continue;
+ }
+ /* no record */
+ DBUG_PRINT("info",("spider column no record error"));
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ continue;
+ }
+ if ((error_num = res->fetch_columns_for_discover_table_structure(str,
+ spider_share->access_charset)))
+ {
+ DBUG_PRINT("info",("spider column fetch error"));
+ res->free_result();
+ delete res;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ continue;
+ }
+ res->free_result();
+ delete res;
+ if (conn->db_conn->next_result())
+ {
+ DBUG_PRINT("info",("spider single result error"));
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ continue;
+ }
+ /* get index list */
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ DBUG_PRINT("info",("spider index store error"));
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ continue;
+ }
+ /* no record */
+ DBUG_PRINT("info",("spider index no record error"));
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ continue;
+ }
+ if ((error_num = res->fetch_index_for_discover_table_structure(str,
+ spider_share->access_charset)))
+ {
+ DBUG_PRINT("info",("spider index fetch error"));
+ res->free_result();
+ delete res;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ continue;
+ }
+ res->free_result();
+ delete res;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ if (!error_num)
+ break;
+ }
+ DBUG_RETURN(error_num);
+}
+#endif
+
+spider_mysql_handler::spider_mysql_handler(
+ ha_spider *spider,
+ spider_mysql_share *db_share
+) : spider_db_handler(
+ spider,
+ db_share
+),
+ where_pos(0),
+ order_pos(0),
+ limit_pos(0),
+ table_name_pos(0),
+ ha_read_pos(0),
+ ha_next_pos(0),
+ ha_where_pos(0),
+ ha_limit_pos(0),
+ ha_table_name_pos(0),
+ insert_pos(0),
+ insert_table_name_pos(0),
+ upd_tmp_tbl(NULL),
+ tmp_sql_pos1(0),
+ tmp_sql_pos2(0),
+ tmp_sql_pos3(0),
+ tmp_sql_pos4(0),
+ tmp_sql_pos5(0),
+ reading_from_bulk_tmp_table(FALSE),
+ union_table_name_pos_first(NULL),
+ union_table_name_pos_current(NULL),
+ mysql_share(db_share),
+ link_for_hash(NULL)
+{
+ DBUG_ENTER("spider_mysql_handler::spider_mysql_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_alloc_calc_mem_init(mem_calc, 183);
+ spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mysql_handler::~spider_mysql_handler()
+{
+ DBUG_ENTER("spider_mysql_handler::~spider_mysql_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ while (union_table_name_pos_first)
+ {
+ SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
+ union_table_name_pos_first = tmp_pos->next;
+ spider_free(spider_current_trx, tmp_pos, MYF(0));
+ }
+ if (link_for_hash)
+ {
+ spider_free(spider_current_trx, link_for_hash, MYF(0));
+ }
+ spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_handler::init()
+{
+ uint roop_count;
+ 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);
+ TABLE *table = spider->get_table();
+ DBUG_ENTER("spider_mysql_handler::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.init_calc_mem(59);
+ sql_part.init_calc_mem(60);
+ sql_part2.init_calc_mem(61);
+ ha_sql.init_calc_mem(62);
+ insert_sql.init_calc_mem(64);
+ update_sql.init_calc_mem(65);
+ tmp_sql.init_calc_mem(66);
+ dup_update_sql.init_calc_mem(166);
+ if (
+ (sql.real_alloc(init_sql_alloc_size)) ||
+ (insert_sql.real_alloc(init_sql_alloc_size)) ||
+ (update_sql.real_alloc(init_sql_alloc_size)) ||
+ (tmp_sql.real_alloc(init_sql_alloc_size))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.set_charset(share->access_charset);
+ sql_part.set_charset(share->access_charset);
+ ha_sql.set_charset(share->access_charset);
+ insert_sql.set_charset(share->access_charset);
+ update_sql.set_charset(share->access_charset);
+ tmp_sql.set_charset(share->access_charset);
+ upd_tmp_tbl_prm.init();
+ upd_tmp_tbl_prm.field_count = 1;
+ if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
+ spider_bulk_alloc_mem(spider_current_trx, 141,
+ __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);
+ }
+ 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 =
+ &mysql_share->db_table_str[roop_count];
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ link_for_hash[roop_count].db_table_str_hash_value =
+ mysql_share->db_table_str_hash_value[roop_count];
+#endif
+ }
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ hs_upds.init();
+#endif
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_table_name_with_adjusting(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+) {
+ int error_num = 0;
+ DBUG_ENTER("spider_mysql_handler::append_table_name_with_adjusting");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type == SPIDER_SQL_TYPE_HANDLER)
+ {
+ str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
+ } else {
+ error_num = mysql_share->append_table_name_with_adjusting(str,
+ spider->conn_link_idx[link_idx]);
+ }
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_key_column_types(
+ const key_range *start_key,
+ spider_string *str
+) {
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ KEY *key_info = result_list->key_info;
+ uint key_name_length, key_count;
+ key_part_map full_key_part_map =
+ make_prev_keypart_map(spider_user_defined_key_parts(key_info));
+ key_part_map start_key_part_map;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ char tmp_buf[MAX_FIELD_WIDTH];
+ spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info);
+ DBUG_ENTER("spider_mysql_handler::append_key_column_types");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_str.init_calc_mem(115);
+
+ start_key_part_map = start_key->keypart_map & full_key_part_map;
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+ DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
+ DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
+
+ if (!start_key_part_map)
+ DBUG_RETURN(0);
+
+ for (
+ key_part = key_info->key_part,
+ key_count = 0;
+ start_key_part_map;
+ start_key_part_map >>= 1,
+ key_part++,
+ key_count++
+ ) {
+ field = key_part->field;
+ key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
+ if (str->reserve(key_name_length + SPIDER_SQL_SPACE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(tmp_buf, key_name_length);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+
+ if (tmp_str.ptr() != tmp_buf)
+ tmp_str.set(tmp_buf, sizeof(tmp_buf), system_charset_info);
+ else
+ tmp_str.set_charset(system_charset_info);
+ field->sql_type(*tmp_str.get_str());
+ tmp_str.mem_calc();
+ str->append(tmp_str);
+ if (field->has_charset())
+ {
+ CHARSET_INFO *cs = field->charset();
+ uint coll_length = strlen(cs->name);
+ if (str->reserve(SPIDER_SQL_COLLATE_LEN + coll_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
+ str->q_append(cs->name, coll_length);
+ }
+
+ 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);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_key_join_columns_for_bka(
+ const key_range *start_key,
+ spider_string *str,
+ const char **table_aliases,
+ uint *table_alias_lengths
+) {
+ KEY *key_info = spider->result_list.key_info;
+ uint length, key_name_length, key_count;
+ key_part_map full_key_part_map =
+ make_prev_keypart_map(spider_user_defined_key_parts(key_info));
+ key_part_map start_key_part_map;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ char tmp_buf[MAX_FIELD_WIDTH];
+ bool start_where = ((int) str->length() == where_pos);
+ DBUG_ENTER("spider_mysql_handler::append_key_join_columns_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ start_key_part_map = start_key->keypart_map & full_key_part_map;
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+ DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
+ DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
+
+ if (!start_key_part_map)
+ DBUG_RETURN(0);
+
+ if (start_where)
+ {
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+
+ for (
+ key_part = key_info->key_part,
+ key_count = 0;
+ start_key_part_map;
+ start_key_part_map >>= 1,
+ key_part++,
+ key_count++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ mysql_share->column_name_str[field->field_index].length();
+ length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
+ if (str->reserve(length + table_alias_lengths[0] + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ table_alias_lengths[1] + SPIDER_SQL_PF_EQUAL_LEN + SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(table_aliases[0], table_alias_lengths[0]);
+ str->q_append(tmp_buf, length);
+ str->q_append(SPIDER_SQL_PF_EQUAL_STR, SPIDER_SQL_PF_EQUAL_LEN);
+ str->q_append(table_aliases[1], table_alias_lengths[1]);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_tmp_table_and_sql_for_bka(
+ const key_range *start_key
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_tmp_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ char tmp_table_name[MAX_FIELD_WIDTH * 2],
+ tgt_table_name[MAX_FIELD_WIDTH * 2];
+ int tmp_table_name_length;
+ spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
+ mysql_share->db_names_str[0].charset());
+ const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
+ uint table_name_lengths[2], table_alias_lengths[2],
+ table_dot_alias_lengths[2];
+ tgt_table_name_str.init_calc_mem(99);
+ tgt_table_name_str.length(0);
+ create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
+ first_link_idx);
+ if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
+ first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ table_names[0] = tmp_table_name;
+ table_names[1] = tgt_table_name_str.c_ptr_safe();
+ table_name_lengths[0] = tmp_table_name_length;
+ table_name_lengths[1] = tgt_table_name_str.length();
+ table_aliases[0] = SPIDER_SQL_A_STR;
+ table_aliases[1] = SPIDER_SQL_B_STR;
+ table_alias_lengths[0] = SPIDER_SQL_A_LEN;
+ table_alias_lengths[1] = SPIDER_SQL_B_LEN;
+ table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
+ table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
+ table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
+ table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
+ if (
+ (error_num = append_drop_tmp_bka_table(
+ &tmp_sql, tmp_table_name, tmp_table_name_length,
+ &tmp_sql_pos1, &tmp_sql_pos5, TRUE)) ||
+ (error_num = append_create_tmp_bka_table(
+ start_key,
+ &tmp_sql, tmp_table_name,
+ tmp_table_name_length,
+ &tmp_sql_pos2, spider->share->table_share->table_charset)) ||
+ (error_num = append_insert_tmp_bka_table(
+ start_key,
+ &tmp_sql, tmp_table_name,
+ tmp_table_name_length, &tmp_sql_pos3))
+ )
+ DBUG_RETURN(error_num);
+ tmp_sql_pos4 = tmp_sql.length();
+ if ((error_num = spider_db_append_select(spider)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
+ sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if (
+ (error_num = append_select_columns_with_alias(&sql,
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) ||
+ (error_num = spider_db_mysql_utility.append_from_with_alias(&sql,
+ table_names, table_name_lengths,
+ table_aliases, table_alias_lengths, 2,
+ &table_name_pos, FALSE))
+ )
+ DBUG_RETURN(error_num);
+ if (
+ mysql_share->key_hint &&
+ (error_num = spider_db_append_hint_after_table(spider,
+ &sql, &mysql_share->key_hint[spider->active_index]))
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ where_pos = sql.length();
+ if (
+ (error_num = append_key_join_columns_for_bka(
+ start_key, &sql,
+ table_dot_aliases, table_dot_alias_lengths)) ||
+ (error_num = append_condition_part(
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
+ SPIDER_SQL_TYPE_SELECT_SQL, FALSE))
+ )
+ DBUG_RETURN(error_num);
+ if (spider->result_list.direct_order_limit)
+ {
+ if ((error_num = append_key_order_for_direct_order_limit_with_alias(&sql,
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
+ DBUG_RETURN(error_num);
+ }
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ else if (spider->result_list.direct_aggregate)
+ {
+ if ((error_num =
+ append_group_by(&sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::reuse_tmp_table_and_sql_for_bka()
+{
+ DBUG_ENTER("spider_mysql_handler::reuse_tmp_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_sql.length(tmp_sql_pos4);
+ sql.length(limit_pos);
+ ha_sql.length(ha_limit_pos);
+ DBUG_RETURN(0);
+}
+
+void spider_mysql_handler::create_tmp_bka_table_name(
+ char *tmp_table_name,
+ int *tmp_table_name_length,
+ int link_idx
+) {
+ uint adjust_length =
+ mysql_share->db_nm_max_length -
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length() +
+ mysql_share->table_nm_max_length -
+ mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length(),
+ length;
+ DBUG_ENTER("spider_mysql_handler::create_tmp_bka_table_name");
+ *tmp_table_name_length = mysql_share->db_nm_max_length +
+ mysql_share->table_nm_max_length;
+ memset(tmp_table_name, ' ', adjust_length);
+ tmp_table_name += adjust_length;
+ memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(),
+ mysql_share->db_names_str[link_idx].length());
+ tmp_table_name += mysql_share->db_names_str[link_idx].length();
+ length = my_sprintf(tmp_table_name, (tmp_table_name,
+ "%s%s%p%s", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider,
+ SPIDER_SQL_UNDERSCORE_STR));
+ *tmp_table_name_length += length;
+ tmp_table_name += length;
+ memcpy(tmp_table_name,
+ mysql_share->table_names_str[spider->conn_link_idx[link_idx]].c_ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length());
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_handler::append_create_tmp_bka_table(
+ const key_range *start_key,
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos,
+ CHARSET_INFO *table_charset
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ THD *thd = spider->trx->thd;
+ char *bka_engine = spider_param_bka_engine(thd, share->bka_engine);
+ uint bka_engine_length = strlen(bka_engine),
+ cset_length = strlen(table_charset->csname),
+ coll_length = strlen(table_charset->name);
+ DBUG_ENTER("spider_mysql_handler::append_create_tmp_bka_table");
+ if (str->reserve(SPIDER_SQL_CREATE_TMP_LEN + tmp_table_name_length +
+ SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_ID_TYPE_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CREATE_TMP_STR, SPIDER_SQL_CREATE_TMP_LEN);
+ *db_name_pos = str->length();
+ str->q_append(tmp_table_name, tmp_table_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ str->q_append(SPIDER_SQL_ID_TYPE_STR, SPIDER_SQL_ID_TYPE_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if ((error_num = append_key_column_types(start_key, str)))
+ DBUG_RETURN(error_num);
+ if (str->reserve(SPIDER_SQL_ENGINE_LEN + bka_engine_length +
+ SPIDER_SQL_DEF_CHARSET_LEN + cset_length + SPIDER_SQL_COLLATE_LEN +
+ coll_length + SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ENGINE_STR, SPIDER_SQL_ENGINE_LEN);
+ str->q_append(bka_engine, bka_engine_length);
+ str->q_append(SPIDER_SQL_DEF_CHARSET_STR, SPIDER_SQL_DEF_CHARSET_LEN);
+ str->q_append(table_charset->csname, cset_length);
+ str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
+ str->q_append(table_charset->name, coll_length);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_drop_tmp_bka_table(
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos,
+ int *drop_table_end_pos,
+ bool with_semicolon
+) {
+ DBUG_ENTER("spider_mysql_handler::append_drop_tmp_bka_table");
+ if (str->reserve(SPIDER_SQL_DROP_TMP_LEN + tmp_table_name_length +
+ (with_semicolon ? SPIDER_SQL_SEMICOLON_LEN : 0)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_DROP_TMP_STR, SPIDER_SQL_DROP_TMP_LEN);
+ *db_name_pos = str->length();
+ str->q_append(tmp_table_name, tmp_table_name_length);
+ *drop_table_end_pos = str->length();
+ if (with_semicolon)
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_insert_tmp_bka_table(
+ const key_range *start_key,
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_insert_tmp_bka_table");
+ if (str->reserve(SPIDER_SQL_INSERT_LEN + SPIDER_SQL_INTO_LEN +
+ tmp_table_name_length + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
+ str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
+ *db_name_pos = str->length();
+ str->q_append(tmp_table_name, tmp_table_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if ((error_num = spider_db_append_key_columns(start_key, spider, str)))
+ DBUG_RETURN(error_num);
+ if (str->reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_union_table_and_sql_for_bka(
+ const key_range *start_key
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_union_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ char tgt_table_name[MAX_FIELD_WIDTH * 2];
+ spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
+ mysql_share->db_names_str[0].charset());
+ const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
+ uint table_name_lengths[2], table_alias_lengths[2],
+ table_dot_alias_lengths[2];
+ tgt_table_name_str.init_calc_mem(233);
+ tgt_table_name_str.length(0);
+ if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
+ first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ table_names[0] = "";
+ table_names[1] = tgt_table_name_str.c_ptr_safe();
+ table_name_lengths[0] = 0;
+ table_name_lengths[1] = tgt_table_name_str.length();
+ table_aliases[0] = SPIDER_SQL_A_STR;
+ table_aliases[1] = SPIDER_SQL_B_STR;
+ table_alias_lengths[0] = SPIDER_SQL_A_LEN;
+ table_alias_lengths[1] = SPIDER_SQL_B_LEN;
+ table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
+ table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
+ table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
+ table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
+
+ if ((error_num = spider_db_append_select(spider)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
+ sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if ((error_num = append_select_columns_with_alias(&sql,
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_FROM_LEN + (SPIDER_SQL_OPEN_PAREN_LEN * 2)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ tmp_sql_pos1 = sql.length();
+
+ if (
+ (error_num = spider_db_mysql_utility.append_from_with_alias(&tmp_sql,
+ table_names, table_name_lengths,
+ table_aliases, table_alias_lengths, 2,
+ &table_name_pos, FALSE))
+ )
+ DBUG_RETURN(error_num);
+ if (
+ mysql_share->key_hint &&
+ (error_num = spider_db_append_hint_after_table(spider,
+ &tmp_sql, &mysql_share->key_hint[spider->active_index]))
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ where_pos = tmp_sql.length();
+ if (
+ (error_num = append_key_join_columns_for_bka(
+ start_key, &tmp_sql,
+ table_dot_aliases, table_dot_alias_lengths)) ||
+ (error_num = append_condition_part(
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
+ SPIDER_SQL_TYPE_TMP_SQL, FALSE))
+ )
+ DBUG_RETURN(error_num);
+ if (spider->result_list.direct_order_limit)
+ {
+ if ((error_num =
+ append_key_order_for_direct_order_limit_with_alias(&tmp_sql,
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))
+ )
+ DBUG_RETURN(error_num);
+ }
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ else if (spider->result_list.direct_aggregate)
+ {
+ if ((error_num =
+ append_group_by(&tmp_sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::reuse_union_table_and_sql_for_bka()
+{
+ DBUG_ENTER("spider_mysql_handler::reuse_union_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.length(tmp_sql_pos1);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_insert_for_recovery(
+ ulong sql_type,
+ int link_idx
+) {
+ const TABLE *table = spider->get_table();
+ SPIDER_SHARE *share = spider->share;
+ Field **field;
+ uint field_name_length = 0;
+ bool add_value = FALSE;
+ spider_string *insert_sql;
+ DBUG_ENTER("spider_mysql_handler::append_insert_for_recovery");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
+ {
+ insert_sql = &spider->result_list.insert_sqls[link_idx];
+ insert_sql->length(0);
+ } else {
+ insert_sql = &spider->result_list.update_sqls[link_idx];
+ }
+ if (insert_sql->reserve(
+ SPIDER_SQL_INSERT_LEN + SPIDER_SQL_SQL_IGNORE_LEN +
+ SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ insert_sql->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
+ insert_sql->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
+ insert_sql->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
+ mysql_share->append_table_name(insert_sql, spider->conn_link_idx[link_idx]);
+ insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ for (field = table->field; *field; field++)
+ {
+ field_name_length =
+ mysql_share->column_name_str[(*field)->field_index].length();
+ if (insert_sql->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(insert_sql, (*field)->field_index);
+ insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (field_name_length)
+ insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
+ if (insert_sql->reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ insert_sql->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
+ insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ for (field = table->field; *field; field++)
+ {
+ add_value = TRUE;
+ if ((*field)->is_null())
+ {
+ if (insert_sql->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ insert_sql->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else {
+ if (
+ spider_db_mysql_utility.
+ append_column_value(spider, insert_sql, *field, NULL,
+ share->access_charset) ||
+ insert_sql->reserve(SPIDER_SQL_COMMA_LEN)
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (add_value)
+ insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
+ if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN, SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
+ {
+ exec_insert_sql = insert_sql;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+) {
+ int error_num;
+ spider_string *str = &update_sql;
+ DBUG_ENTER("spider_mysql_handler::append_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->length() > 0)
+ {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+
+ if (
+ (error_num = append_update(str, 0)) ||
+ (error_num = append_update_set(str)) ||
+ (error_num = append_update_where(str, table, ptr_diff))
+ )
+ DBUG_RETURN(error_num);
+ filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.update_sqls[link_idx];
+ DBUG_ENTER("spider_mysql_handler::append_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->length() > 0)
+ {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+
+ if (
+ (error_num = append_update(str, link_idx)) ||
+ (error_num = append_update_set(str)) ||
+ (error_num = append_update_where(str, table, ptr_diff))
+ )
+ DBUG_RETURN(error_num);
+
+ if (
+ spider->pk_update &&
+ share->link_statuses[link_idx] == SPIDER_LINK_STATUS_RECOVERY
+ ) {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ if ((error_num = append_insert_for_recovery(
+ SPIDER_SQL_TYPE_UPDATE_SQL, link_idx)))
+ DBUG_RETURN(error_num);
+ }
+
+ if (!filled_up)
+ filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+) {
+ int error_num;
+ spider_string *str = &update_sql;
+ DBUG_ENTER("spider_mysql_handler::append_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->length() > 0)
+ {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+
+ if (
+ (error_num = append_delete(str)) ||
+ (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL,
+ first_link_idx)) ||
+ (error_num = append_update_where(str, table, ptr_diff))
+ )
+ DBUG_RETURN(error_num);
+ filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str = &spider->result_list.update_sqls[link_idx];
+ DBUG_ENTER("spider_mysql_handler::append_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->length() > 0)
+ {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+
+ if (
+ (error_num = append_delete(str)) ||
+ (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL, link_idx)) ||
+ (error_num = append_update_where(str, table, ptr_diff))
+ )
+ DBUG_RETURN(error_num);
+ if (!filled_up)
+ filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_insert_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_insert_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_insert(&insert_sql, 0);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_insert(
+ spider_string *str,
+ int link_idx
+) {
+ SPIDER_SHARE *share = spider->share;
+ DBUG_ENTER("spider_mysql_handler::append_insert");
+ if (
+ (
+ spider->write_can_replace ||
+ /* for direct_dup_insert without patch for partition */
+ spider->sql_command == SQLCOM_REPLACE ||
+ spider->sql_command == SQLCOM_REPLACE_SELECT
+ ) &&
+ spider->direct_dup_insert
+ ) {
+ if (str->reserve(SPIDER_SQL_REPLACE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_INSERT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
+ }
+ if (spider->low_priority)
+ {
+ if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
+ }
+ else if (spider->insert_delayed)
+ {
+ if (share->internal_delayed)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_DELAYED_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
+ }
+ }
+ else if (
+ spider->lock_type >= TL_WRITE &&
+ !spider->write_can_replace &&
+ /* for direct_dup_insert without patch for partition */
+ spider->sql_command != SQLCOM_REPLACE &&
+ spider->sql_command != SQLCOM_REPLACE_SELECT
+ ) {
+ if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
+ }
+ if (
+ spider->ignore_dup_key &&
+ spider->direct_dup_insert &&
+ !spider->write_can_replace &&
+ !spider->insert_with_update &&
+ /* for direct_dup_insert without patch for partition */
+ spider->sql_command != SQLCOM_REPLACE &&
+ spider->sql_command != SQLCOM_REPLACE_SELECT
+ ) {
+ if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_update_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_update_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_update(&update_sql, 0);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_update(
+ spider_string *str,
+ int link_idx
+) {
+ DBUG_ENTER("spider_mysql_handler::append_update");
+ if (str->reserve(SPIDER_SQL_UPDATE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_UPDATE_STR, SPIDER_SQL_UPDATE_LEN);
+ if (spider->low_priority)
+ {
+ if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
+ }
+ if (
+ spider->ignore_dup_key &&
+ !spider->insert_with_update
+ ) {
+ if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
+ }
+ if (str->reserve(mysql_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ table_name_pos = str->length();
+ append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_UPDATE_SQL);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_delete_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_delete_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_delete(&update_sql);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_delete(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_delete");
+ if (str->reserve(SPIDER_SQL_DELETE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_DELETE_STR, SPIDER_SQL_DELETE_LEN);
+ if (spider->low_priority)
+ {
+ if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
+ }
+ if (spider->quick_mode)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_QUICK_MODE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_QUICK_MODE_STR,
+ SPIDER_SQL_SQL_QUICK_MODE_LEN);
+ }
+ if (spider->ignore_dup_key)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
+ }
+ str->length(str->length() - 1);
+ DBUG_RETURN(0);
+}
+
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+int spider_mysql_handler::append_increment_update_set_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_increment_update_set_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_increment_update_set(&update_sql);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_increment_update_set(
+ spider_string *str
+) {
+ uint field_name_length;
+ uint roop_count;
+ Field *field;
+ DBUG_ENTER("spider_mysql_handler::append_increment_update_set");
+ if (str->reserve(SPIDER_SQL_SET_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
+ const SPIDER_HS_STRING_REF *value = hs_upds.ptr();
+ for (roop_count = 0; roop_count < hs_upds.size();
+ roop_count++)
+ {
+ if (
+ value[roop_count].size() == 1 &&
+ *(value[roop_count].begin()) == '0'
+ )
+ continue;
+
+ 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;
+ field_name_length =
+ mysql_share->column_name_str[field->field_index].length();
+
+ if (str->reserve(field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
+ SPIDER_SQL_COMMA_LEN + value[roop_count].size()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ mysql_share->append_column_name(str, field->field_index);
+ if (spider->hs_increment)
+ str->q_append(SPIDER_SQL_HS_INCREMENT_STR,
+ SPIDER_SQL_HS_INCREMENT_LEN);
+ else
+ str->q_append(SPIDER_SQL_HS_DECREMENT_STR,
+ SPIDER_SQL_HS_DECREMENT_LEN);
+ str->q_append(value[roop_count].begin(), value[roop_count].size());
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+#endif
+#endif
+
+int spider_mysql_handler::append_update_set_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_update_set_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_update_set(&update_sql);
+ where_pos = update_sql.length();
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_update_set(
+ spider_string *str
+) {
+ uint field_name_length;
+ SPIDER_SHARE *share = spider->share;
+ TABLE *table = spider->get_table();
+ Field **fields;
+ DBUG_ENTER("spider_mysql_handler::append_update_set");
+ if (str->reserve(SPIDER_SQL_SET_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
+ for (fields = table->field; *fields; fields++)
+ {
+ if (bitmap_is_set(table->write_set, (*fields)->field_index))
+ {
+ field_name_length =
+ mysql_share->column_name_str[(*fields)->field_index].length();
+ if ((*fields)->is_null())
+ {
+ if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, (*fields)->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else {
+ if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 2 + SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, (*fields)->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+#ifndef DBUG_OFF
+ my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
+ table->read_set);
+#endif
+ if (
+ spider_db_mysql_utility.
+ append_column_value(spider, str, *fields, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_COMMA_LEN)
+ ) {
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+int spider_mysql_handler::append_direct_update_set_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_direct_update_set_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_direct_update_set(&update_sql);
+ where_pos = update_sql.length();
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_direct_update_set(
+ spider_string *str
+) {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ uint field_name_length;
+ SPIDER_SHARE *share = spider->share;
+#ifndef DBUG_OFF
+ TABLE *table = spider->get_table();
+#endif
+#endif
+ DBUG_ENTER("spider_mysql_handler::append_direct_update_set");
+ if (
+ spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
+ spider->direct_update_fields
+ ) {
+ if (str->reserve(SPIDER_SQL_SET_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
+ DBUG_RETURN(spider_db_append_update_columns(spider, str, NULL, 0,
+ spider_dbton_mysql.dbton_id));
+ }
+
+ if (
+ (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
+ ) {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ size_t roop_count;
+ Field *field;
+ if (str->reserve(SPIDER_SQL_SET_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
+ 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;
+ field_name_length =
+ mysql_share->column_name_str[field->field_index].length();
+ if (top_table_field->is_null())
+ {
+ if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else {
+ if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 2 + SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+#ifndef DBUG_OFF
+ my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
+ table->read_set);
+#endif
+ if (
+ spider_db_mysql_utility.
+ append_column_value(spider, str, top_table_field, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_COMMA_LEN)
+ ) {
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+#else
+ DBUG_ASSERT(0);
+#endif
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_dup_update_pushdown_part(
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_dup_update_pushdown_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ dup_update_sql.length(0);
+ error_num = append_update_columns(&dup_update_sql, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_update_columns_part(
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_update_columns_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_update_columns(&update_sql, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::check_update_columns_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::check_update_columns_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_update_columns(NULL, NULL, 0);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_update_columns(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_update_columns");
+ error_num = spider_db_append_update_columns(spider, str,
+ alias, alias_length, spider_dbton_mysql.dbton_id);
+ DBUG_RETURN(error_num);
+}
+#endif
+
+int spider_mysql_handler::append_select_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_select(str, sql_type);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_select(
+ spider_string *str,
+ ulong sql_type
+) {
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ DBUG_ENTER("spider_mysql_handler::append_select");
+ if (sql_type == SPIDER_SQL_TYPE_HANDLER)
+ {
+ if (str->reserve(SPIDER_SQL_HANDLER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_SELECT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
+ if (result_list->lock_type != F_WRLCK && spider->lock_mode < 1)
+ {
+ /* no lock */
+ if (spider->share->query_cache == 1)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_CACHE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_CACHE_STR, SPIDER_SQL_SQL_CACHE_LEN);
+ } else if (spider->share->query_cache == 2)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR,
+ SPIDER_SQL_SQL_NO_CACHE_LEN);
+ }
+ }
+ if (spider->high_priority)
+ {
+ if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR,
+ SPIDER_SQL_HIGH_PRIORITY_LEN);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_table_select_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_table_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_table_select(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_table_select(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_table_select");
+ table_name_pos = str->length() + mysql_share->table_select_pos;
+ if (str->append(*(mysql_share->table_select)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_key_select_part(
+ ulong sql_type,
+ uint idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_key_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_select(str, idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_key_select(
+ spider_string *str,
+ uint idx
+) {
+ DBUG_ENTER("spider_mysql_handler::append_key_select");
+ table_name_pos = str->length() + mysql_share->key_select_pos[idx];
+ if (str->append(mysql_share->key_select[idx]))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_minimum_select_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_minimum_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_minimum_select(str, sql_type);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_minimum_select(
+ spider_string *str,
+ ulong sql_type
+) {
+ TABLE *table = spider->get_table();
+ Field **field;
+ int field_length;
+ bool appended = FALSE;
+ DBUG_ENTER("spider_mysql_handler::append_minimum_select");
+ 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 =
+ mysql_share->column_name_str[(*field)->field_index].length();
+ if (str->reserve(field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ appended = TRUE;
+ }
+ }
+ if (appended)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ else {
+ if (str->reserve(SPIDER_SQL_ONE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
+ }
+ DBUG_RETURN(append_from(str, sql_type, first_link_idx));
+}
+
+int spider_mysql_handler::append_table_select_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ TABLE *table = spider->get_table();
+ Field **field;
+ int field_length;
+ DBUG_ENTER("spider_mysql_handler::append_table_select_with_alias");
+ for (field = table->field; *field; field++)
+ {
+ field_length =
+ mysql_share->column_name_str[(*field)->field_index].length();
+ if (str->reserve(alias_length + field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_key_select_with_alias(
+ spider_string *str,
+ const KEY *key_info,
+ const char *alias,
+ uint alias_length
+) {
+ KEY_PART_INFO *key_part;
+ Field *field;
+ uint part_num;
+ int field_length;
+ DBUG_ENTER("spider_mysql_handler::append_key_select_with_alias");
+ for (key_part = key_info->key_part, part_num = 0;
+ part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
+ {
+ field = key_part->field;
+ field_length = mysql_share->column_name_str[field->field_index].length();
+ if (str->reserve(alias_length + field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_minimum_select_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ TABLE *table = spider->get_table();
+ Field **field;
+ int field_length;
+ bool appended = FALSE;
+ DBUG_ENTER("spider_mysql_handler::append_minimum_select_with_alias");
+ 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 =
+ mysql_share->column_name_str[(*field)->field_index].length();
+ if (str->reserve(alias_length + field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ appended = TRUE;
+ }
+ }
+ if (appended)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ else {
+ if (str->reserve(SPIDER_SQL_ONE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_select_columns_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ DBUG_ENTER("spider_mysql_handler::append_select_columns_with_alias");
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (
+ result_list->direct_aggregate &&
+ (error_num = append_sum_select(str, alias, alias_length))
+ )
+ DBUG_RETURN(error_num);
+#endif
+ if ((error_num = append_match_select(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ if (!spider->select_column_mode)
+ {
+ if (result_list->keyread)
+ DBUG_RETURN(append_key_select_with_alias(
+ str, result_list->key_info, alias, alias_length));
+ else
+ DBUG_RETURN(append_table_select_with_alias(
+ str, alias, alias_length));
+ }
+ DBUG_RETURN(append_minimum_select_with_alias(str, alias, alias_length));
+}
+
+int spider_mysql_handler::append_hint_after_table_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_hint_after_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_hint_after_table(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_hint_after_table(
+ spider_string *str
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_hint_after_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (
+ mysql_share->key_hint &&
+ (error_num = spider_db_append_hint_after_table(spider,
+ str, &mysql_share->key_hint[spider->active_index]))
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+}
+
+void spider_mysql_handler::set_where_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::set_where_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ where_pos = sql.length();
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ where_pos = update_sql.length();
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ ha_read_pos = ha_sql.length();
+ break;
+ default:
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_mysql_handler::set_where_to_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::set_where_to_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ sql.length(where_pos);
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ update_sql.length(where_pos);
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ ha_sql.length(ha_read_pos);
+ break;
+ default:
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_handler::check_item_type(
+ Item *item
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::check_item_type");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = spider_db_print_item_type(item, spider, NULL, NULL, 0,
+ spider_dbton_mysql.dbton_id);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_values_connector_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_values_connector_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_values_connector(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_values_connector(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_values_connector");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
+ SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_values_terminator_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_values_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_values_terminator(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_values_terminator(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_values_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(str->length() -
+ SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_union_table_connector_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_union_table_connector_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_table_connector(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_union_table_connector(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_union_table_connector");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_union_table_terminator_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_union_table_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_table_terminator(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_union_table_terminator(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_union_table_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(str->length() -
+ ((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN));
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ table_name_pos = str->length() + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_A_LEN +
+ SPIDER_SQL_COMMA_LEN;
+ if (str->reserve(tmp_sql.length() - SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(tmp_sql.ptr() + SPIDER_SQL_FROM_LEN,
+ tmp_sql.length() - SPIDER_SQL_FROM_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_key_column_values_part(
+ const key_range *start_key,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_key_column_values_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_column_values(str, start_key);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_key_column_values(
+ spider_string *str,
+ const key_range *start_key
+) {
+ int error_num;
+ const uchar *ptr;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ SPIDER_SHARE *share = spider->share;
+ KEY *key_info = result_list->key_info;
+ uint length;
+ uint store_length;
+ key_part_map full_key_part_map =
+ make_prev_keypart_map(spider_user_defined_key_parts(key_info));
+ key_part_map start_key_part_map;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ DBUG_ENTER("spider_mysql_handler::append_key_column_values");
+ start_key_part_map = start_key->keypart_map & full_key_part_map;
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+ DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
+ DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
+
+ if (!start_key_part_map)
+ DBUG_RETURN(0);
+
+ for (
+ key_part = key_info->key_part,
+ length = 0;
+ start_key_part_map;
+ start_key_part_map >>= 1,
+ key_part++,
+ length += store_length
+ ) {
+ store_length = key_part->store_length;
+ ptr = start_key->key + length;
+ field = key_part->field;
+ if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
+ {
+ if (error_num > 0)
+ DBUG_RETURN(error_num);
+ } else {
+ if (spider_db_mysql_utility.append_column_value(spider, str, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ 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);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_key_column_values_with_name_part(
+ const key_range *start_key,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_key_column_values_with_name_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_column_values_with_name(str, start_key);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_key_column_values_with_name(
+ spider_string *str,
+ const key_range *start_key
+) {
+ int error_num;
+ const uchar *ptr;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ SPIDER_SHARE *share = spider->share;
+ KEY *key_info = result_list->key_info;
+ uint length;
+ uint key_name_length, key_count;
+ uint store_length;
+ key_part_map full_key_part_map =
+ make_prev_keypart_map(spider_user_defined_key_parts(key_info));
+ key_part_map start_key_part_map;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ char tmp_buf[MAX_FIELD_WIDTH];
+ DBUG_ENTER("spider_mysql_handler::append_key_column_values_with_name");
+ start_key_part_map = start_key->keypart_map & full_key_part_map;
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+ DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
+ DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
+
+ if (!start_key_part_map)
+ DBUG_RETURN(0);
+
+ for (
+ key_part = key_info->key_part,
+ length = 0,
+ key_count = 0;
+ start_key_part_map;
+ start_key_part_map >>= 1,
+ key_part++,
+ length += store_length,
+ key_count++
+ ) {
+ store_length = key_part->store_length;
+ ptr = start_key->key + length;
+ field = key_part->field;
+ if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
+ {
+ if (error_num > 0)
+ DBUG_RETURN(error_num);
+ } else {
+ if (spider_db_mysql_utility.append_column_value(spider, str, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
+ if (str->reserve(SPIDER_SQL_SPACE_LEN + key_name_length +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(tmp_buf, key_name_length);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_key_where_part(
+ const key_range *start_key,
+ const key_range *end_key,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str, *str_part = NULL, *str_part2 = NULL;
+ bool set_order;
+ DBUG_ENTER("spider_mysql_handler::append_key_where_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ set_order = FALSE;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ set_order = FALSE;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ set_order = FALSE;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ ha_read_pos = str->length();
+ str_part = &sql_part;
+ str_part2 = &sql_part2;
+ str_part->length(0);
+ str_part2->length(0);
+ set_order = TRUE;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_where(str, str_part, str_part2, start_key, end_key,
+ sql_type, set_order);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_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_mysql_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_mysql.dbton_id);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_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, *str_part = NULL, *str_part2 = NULL;
+ DBUG_ENTER("spider_mysql_handler::append_is_null_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ str_part = &sql_part;
+ str_part2 = &sql_part2;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_is_null(sql_type, str, str_part, str_part2,
+ key_part, key, ptr, key_eq, tgt_final);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_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_mysql_handler::append_is_null");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider key_eq=%s", key_eq ? "TRUE" : "FALSE"));
+ if (key_part->null_bit)
+ {
+ if (*(*ptr)++)
+ {
+ if (sql_type == SPIDER_SQL_TYPE_HANDLER)
+ {
+ if (
+ key_eq ||
+ key->flag == HA_READ_KEY_EXACT ||
+ key->flag == HA_READ_KEY_OR_NEXT
+ ) {
+ if (tgt_final)
+ {
+ if (str->reserve(SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ }
+ str = str_part;
+ if (str->reserve(SPIDER_SQL_NULL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else {
+ if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
+ {
+ str = str_part;
+ /* first index column */
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ ha_next_pos = str->length();
+ if (str->reserve(SPIDER_SQL_FIRST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
+ spider->result_list.ha_read_kind = 1;
+ } else if (tgt_final)
+ {
+ if (str->reserve(SPIDER_SQL_GT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
+ str = str_part;
+ if (str->reserve(SPIDER_SQL_NULL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ }
+ }
+ str = str_part2;
+ }
+ if (
+ key_eq ||
+ key->flag == HA_READ_KEY_EXACT ||
+ key->flag == HA_READ_KEY_OR_NEXT
+ ) {
+ if (str->reserve(SPIDER_SQL_IS_NULL_LEN +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ mysql_share->column_name_str[key_part->field->field_index].length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, key_part->field->field_index);
+ str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_IS_NOT_NULL_LEN +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ mysql_share->column_name_str[key_part->field->field_index].length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, key_part->field->field_index);
+ str->q_append(SPIDER_SQL_IS_NOT_NULL_STR, SPIDER_SQL_IS_NOT_NULL_LEN);
+ }
+ DBUG_RETURN(-1);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_where_terminator_part(
+ ulong sql_type,
+ bool set_order,
+ int key_count
+) {
+ int error_num;
+ spider_string *str, *str_part = NULL, *str_part2 = NULL;
+ DBUG_ENTER("spider_mysql_handler::append_where_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ str_part = &sql_part;
+ str_part2 = &sql_part2;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_where_terminator(sql_type, str, str_part, str_part2,
+ set_order, key_count);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_where_terminator(
+ ulong sql_type,
+ spider_string *str,
+ spider_string *str_part,
+ spider_string *str_part2,
+ bool set_order,
+ int key_count
+) {
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ DBUG_ENTER("spider_mysql_handler::append_where_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type != SPIDER_SQL_TYPE_HANDLER)
+ {
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+ if (!set_order)
+ result_list->key_order = key_count;
+ } else {
+ str_part2->length(str_part2->length() - SPIDER_SQL_AND_LEN);
+
+ str_part->length(str_part->length() - SPIDER_SQL_COMMA_LEN);
+ if (!result_list->ha_read_kind)
+ str_part->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ if (str->append(*str_part))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ uint clause_length = str->length() - ha_next_pos;
+ if (clause_length < SPIDER_SQL_NEXT_LEN)
+ {
+ int roop_count;
+ clause_length = SPIDER_SQL_NEXT_LEN - clause_length;
+ if (str->reserve(clause_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ for (roop_count = 0; roop_count < (int) clause_length; roop_count++)
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_match_where_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_match_where_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+ }
+ error_num = append_match_where(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_match_where(
+ spider_string *str
+) {
+ int error_num;
+ bool first = TRUE;
+ st_spider_ft_info *ft_info = spider->ft_first;
+ DBUG_ENTER("spider_mysql_handler::append_match_where");
+ if (spider->ft_current)
+ {
+ while (TRUE)
+ {
+ if (ft_info->used_in_where)
+ {
+ if (first)
+ {
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ first = FALSE;
+ }
+ if ((error_num = append_match_against(str, ft_info, NULL, 0)))
+ DBUG_RETURN(error_num);
+ if (str->reserve(SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+
+ if (ft_info == spider->ft_current)
+ break;
+ ft_info = ft_info->next;
+ }
+ if (!first)
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_update_where(
+ spider_string *str,
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+) {
+ uint field_name_length;
+ Field **field;
+ SPIDER_SHARE *share = spider->share;
+ DBUG_ENTER("spider_mysql_handler::append_update_where");
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ for (field = table->field; *field; field++)
+ {
+ if (
+ table->s->primary_key == MAX_KEY ||
+ bitmap_is_set(table->read_set, (*field)->field_index)
+ ) {
+ field_name_length =
+ mysql_share->column_name_str[(*field)->field_index].length();
+ if ((*field)->is_null(ptr_diff))
+ {
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
+ } else {
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ (*field)->move_field_offset(ptr_diff);
+ if (
+ spider_db_mysql_utility.
+ append_column_value(spider, str, *field, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_AND_LEN)
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ (*field)->move_field_offset(-ptr_diff);
+ }
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+ }
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+ if (str->reserve(SPIDER_SQL_LIMIT1_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LIMIT1_STR, SPIDER_SQL_LIMIT1_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_condition_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type,
+ bool test_flg
+) {
+ int error_num;
+ spider_string *str;
+ bool start_where = FALSE;
+ DBUG_ENTER("spider_mysql_handler::append_condition_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ if (test_flg)
+ {
+ str = NULL;
+ } else {
+ str = &sql;
+ start_where = ((int) str->length() == where_pos);
+ }
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ if (test_flg)
+ {
+ str = NULL;
+ } else {
+ str = &tmp_sql;
+ start_where = ((int) str->length() == where_pos);
+ }
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ if (test_flg)
+ {
+ str = NULL;
+ } else {
+ str = &update_sql;
+ start_where = ((int) str->length() == where_pos);
+ }
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ if (test_flg)
+ {
+ str = NULL;
+ } else {
+ str = &ha_sql;
+ start_where = TRUE;
+ if (spider->active_index == MAX_KEY)
+ {
+ set_where_pos(SPIDER_SQL_TYPE_HANDLER);
+ if (str->reserve(SPIDER_SQL_READ_LEN + SPIDER_SQL_FIRST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_READ_STR, SPIDER_SQL_READ_LEN);
+ ha_next_pos = str->length();
+ str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
+ sql_part2.length(0);
+ }
+ ha_where_pos = str->length();
+
+ if (
+ spider->sql_command == SQLCOM_HA_READ ||
+ !spider->result_list.use_both_key
+ ) {
+ if (sql_part2.length())
+ {
+ str->append(sql_part2);
+ start_where = FALSE;
+ }
+ } else {
+ DBUG_RETURN(0);
+ }
+ }
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_condition(str, alias, alias_length, start_where,
+ sql_type);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_condition(
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool start_where,
+ ulong sql_type
+) {
+ int error_num, restart_pos = 0, start_where_pos;
+ SPIDER_CONDITION *tmp_cond = spider->condition;
+ DBUG_ENTER("spider_mysql_handler::append_condition");
+ if (str && start_where)
+ {
+ start_where_pos = str->length();
+ } else {
+ start_where_pos = 0;
+ }
+
+ if (spider->is_clone && !tmp_cond)
+ {
+ tmp_cond = spider->pt_clone_source_handler->condition;
+ }
+
+ while (tmp_cond)
+ {
+ if (str)
+ {
+ restart_pos = str->length();
+ if (start_where)
+ {
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ start_where = FALSE;
+ } else {
+ if (str->reserve(SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+ }
+ if ((error_num = spider_db_print_item_type(
+ (Item *) tmp_cond->cond, spider, str, alias, alias_length,
+ spider_dbton_mysql.dbton_id)))
+ {
+ if (str && error_num == ER_SPIDER_COND_SKIP_NUM)
+ {
+ DBUG_PRINT("info",("spider COND skip"));
+ str->length(restart_pos);
+ start_where = (restart_pos == start_where_pos);
+ } else
+ DBUG_RETURN(error_num);
+ }
+ tmp_cond = tmp_cond->next;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_match_against_part(
+ ulong sql_type,
+ st_spider_ft_info *ft_info,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_match_against_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_match_against(str, ft_info, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_match_against(
+ spider_string *str,
+ st_spider_ft_info *ft_info,
+ const char *alias,
+ uint alias_length
+) {
+ SPIDER_SHARE *share = spider->share;
+ TABLE *table = spider->get_table();
+ String *ft_init_key;
+ KEY *key_info;
+ uint key_name_length;
+ int key_count;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ DBUG_ENTER("spider_mysql_handler::append_match_against");
+ DBUG_PRINT("info",("spider this=%p", this));
+ 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);
+
+ ft_init_key = ft_info->key;
+ key_info = &table->key_info[ft_info->inx];
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+
+ for (
+ key_part = key_info->key_part,
+ key_count = 0;
+ key_count < (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ key_count++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ mysql_share->column_name_str[field->field_index].length();
+ if (alias_length)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ } else {
+ if (str->reserve(key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ if (str->reserve(SPIDER_SQL_AGAINST_LEN + SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+
+ char buf[MAX_FIELD_WIDTH];
+ spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
+ tmp_str.init_calc_mem(116);
+ tmp_str.length(0);
+ if (
+ tmp_str.append(ft_init_key->ptr(), ft_init_key->length(),
+ ft_init_key->charset()) ||
+ str->reserve(tmp_str.length() * 2) ||
+ spider_db_mysql_utility.append_escaped_util(str, tmp_str.get_str())
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->mem_calc();
+
+ if (str->reserve(
+ SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_CLOSE_PAREN_LEN +
+ ((ft_info->flags & FT_BOOL) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
+ ((ft_info->flags & FT_EXPAND) ?
+ SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
+ ))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ if (ft_info->flags & FT_BOOL)
+ str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
+ SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
+ if (ft_info->flags & FT_EXPAND)
+ str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
+ SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_match_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_match_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_match_select(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_match_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_match_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider->ft_current)
+ {
+ st_spider_ft_info *ft_info = spider->ft_first;
+ while (TRUE)
+ {
+ if ((error_num = append_match_against(str, ft_info,
+ alias, alias_length)))
+ DBUG_RETURN(error_num);
+ 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 (ft_info == spider->ft_current)
+ break;
+ ft_info = ft_info->next;
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_mysql_handler::append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_sum_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_sum_select(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_sum_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ st_select_lex *select_lex;
+ DBUG_ENTER("spider_mysql_handler::append_sum_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ select_lex = spider_get_select_lex(spider);
+ JOIN *join = select_lex->join;
+ Item_sum **item_sum_ptr;
+ for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
+ {
+ if ((error_num = spider_db_mysql_utility.open_item_sum_func(*item_sum_ptr,
+ spider, str, alias, alias_length)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ 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);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
+void spider_mysql_handler::set_order_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::set_order_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ order_pos = sql.length();
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ order_pos = update_sql.length();
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ ha_next_pos = ha_sql.length();
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_mysql_handler::set_order_to_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::set_order_to_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ sql.length(order_pos);
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ update_sql.length(order_pos);
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ ha_sql.length(ha_next_pos);
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_mysql_handler::append_group_by_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_group_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_group_by(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_group_by(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ st_select_lex *select_lex;
+ DBUG_ENTER("spider_mysql_handler::append_group_by");
+ DBUG_PRINT("info",("spider this=%p", this));
+ select_lex = spider_get_select_lex(spider);
+ ORDER *group = (ORDER *) select_lex->group_list.first;
+ if (group)
+ {
+ if (str->reserve(SPIDER_SQL_GROUP_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
+ for (; group; group = group->next)
+ {
+ if ((error_num = spider_db_print_item_type((*group->item), spider, str,
+ alias, alias_length, spider_dbton_mysql.dbton_id)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ 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);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
+int spider_mysql_handler::append_key_order_for_merge_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_key_order_for_merge_with_alias_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ ha_limit_pos = ha_sql.length();
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_order_for_merge_with_alias(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_key_order_for_merge_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ /* sort for index merge */
+ TABLE *table = spider->get_table();
+ int length;
+ Field *field;
+ uint key_name_length;
+ DBUG_ENTER("spider_mysql_handler::append_key_order_for_merge_with_alias");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ int error_num;
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+ if (table->s->primary_key < MAX_KEY)
+ {
+ /* sort by primary key */
+ KEY *key_info = &table->key_info[table->s->primary_key];
+ KEY_PART_INFO *key_part;
+ for (
+ key_part = key_info->key_part,
+ length = 1;
+ length <= (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ mysql_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (length > 1)
+ {
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ } else {
+ /* sort by all columns */
+ Field **fieldp;
+ for (
+ fieldp = table->field, length = 1;
+ *fieldp;
+ fieldp++, length++
+ ) {
+ key_name_length =
+ mysql_share->column_name_str[(*fieldp)->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, (*fieldp)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (length > 1)
+ {
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_order_for_direct_order_limit_with_alias(
+ str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ ORDER *order;
+ st_select_lex *select_lex;
+ longlong select_limit;
+ longlong offset_limit;
+ DBUG_ENTER("spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+ spider_get_select_limit(spider, &select_lex, &select_limit,
+ &offset_limit);
+ if (select_lex->order_list.first)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ for (order = (ORDER *) select_lex->order_list.first; order;
+ order = order->next)
+ {
+ if ((error_num =
+ spider_db_print_item_type((*order->item), spider, str, alias,
+ alias_length, spider_dbton_mysql.dbton_id)))
+ {
+ DBUG_PRINT("info",("spider error=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if (order->asc)
+ {
+ 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);
+ } else {
+ if (str->reserve(SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_key_order_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_key_order_with_alias_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ error_num = append_key_order_for_handler(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_order_with_alias(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_key_order_for_handler(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_mysql_handler::append_key_order_for_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider ha_next_pos=%d", ha_next_pos));
+ DBUG_PRINT("info",("spider ha_where_pos=%d", ha_where_pos));
+ str->q_append(alias, alias_length);
+ memset((char *) str->ptr() + str->length(), ' ',
+ ha_where_pos - ha_next_pos - alias_length);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_key_order_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ KEY *key_info = result_list->key_info;
+ int length;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ uint key_name_length;
+ DBUG_ENTER("spider_mysql_handler::append_key_order_with_alias");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ int error_num;
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+ if (result_list->sorted == TRUE)
+ {
+ if (result_list->desc_flg == TRUE)
+ {
+ for (
+ key_part = key_info->key_part + result_list->key_order,
+ length = 1;
+ length + result_list->key_order <
+ (int) spider_user_defined_key_parts(key_info) &&
+ length < result_list->max_order;
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ mysql_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ if (
+ length + result_list->key_order <=
+ (int) spider_user_defined_key_parts(key_info) &&
+ length <= result_list->max_order
+ ) {
+ field = key_part->field;
+ key_name_length =
+ mysql_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ } else {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ }
+ }
+ } else {
+ for (
+ key_part = key_info->key_part + result_list->key_order,
+ length = 1;
+ length + result_list->key_order <
+ (int) spider_user_defined_key_parts(key_info) &&
+ length < result_list->max_order;
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ mysql_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ if (
+ length + result_list->key_order <=
+ (int) spider_user_defined_key_parts(key_info) &&
+ length <= result_list->max_order
+ ) {
+ field = key_part->field;
+ key_name_length =
+ mysql_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ } else {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ mysql_share->append_column_name(str, field->field_index);
+ }
+ }
+ }
+ }
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_limit_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ limit_pos = str->length();
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ limit_pos = str->length();
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ limit_pos = str->length();
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ ha_limit_pos = str->length();
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_limit(str, offset, limit);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::reappend_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::reappend_limit_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ str->length(limit_pos);
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ str->length(limit_pos);
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ str->length(limit_pos);
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ str->length(ha_limit_pos);
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_limit(str, offset, limit);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_limit(
+ spider_string *str,
+ longlong offset,
+ longlong limit
+) {
+ char buf[SPIDER_LONGLONG_LEN + 1];
+ uint32 length;
+ DBUG_ENTER("spider_mysql_handler::append_limit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info", ("spider offset=%lld", offset));
+ DBUG_PRINT("info", ("spider limit=%lld", limit));
+ if (offset || limit < 9223372036854775807LL)
+ {
+ if (str->reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
+ ((SPIDER_LONGLONG_LEN) * 2)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
+ if (offset)
+ {
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
+ str->q_append(buf, length);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
+ str->q_append(buf, length);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_select_lock_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_select_lock_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_select_lock(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_select_lock(
+ spider_string *str
+) {
+ int lock_mode = spider_conn_lock_mode(spider);
+ DBUG_ENTER("spider_mysql_handler::append_select_lock");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
+ {
+ if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
+ } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
+ {
+ if (str->reserve(SPIDER_SQL_SHARED_LOCK_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_union_all_start_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_union_all_start_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_all_start(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_union_all_start(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_union_all_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ 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_RETURN(0);
+}
+
+int spider_mysql_handler::append_union_all_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_union_all_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_all(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_union_all(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_union_all");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_UNION_ALL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_union_all_end_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_union_all_end_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_all_end(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_union_all_end(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_union_all_end");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(str->length() -
+ SPIDER_SQL_UNION_ALL_LEN + SPIDER_SQL_CLOSE_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_multi_range_cnt_part(
+ ulong sql_type,
+ uint multi_range_cnt,
+ bool with_comma
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_multi_range_cnt(str, multi_range_cnt, with_comma);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_multi_range_cnt(
+ spider_string *str,
+ uint multi_range_cnt,
+ bool with_comma
+) {
+ int range_cnt_length;
+ char range_cnt_str[SPIDER_SQL_INT_LEN];
+ DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt");
+ DBUG_PRINT("info",("spider this=%p", this));
+ range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
+ multi_range_cnt));
+ if (with_comma)
+ {
+ if (str->reserve(range_cnt_length + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(range_cnt_str, range_cnt_length);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (str->reserve(range_cnt_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(range_cnt_str, range_cnt_length);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_multi_range_cnt_with_name_part(
+ ulong sql_type,
+ uint multi_range_cnt
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt_with_name_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_multi_range_cnt_with_name(str, multi_range_cnt);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_multi_range_cnt_with_name(
+ spider_string *str,
+ uint multi_range_cnt
+) {
+ int range_cnt_length;
+ char range_cnt_str[SPIDER_SQL_INT_LEN];
+ DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt_with_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
+ multi_range_cnt));
+ if (str->reserve(range_cnt_length + SPIDER_SQL_SPACE_LEN +
+ SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(range_cnt_str, range_cnt_length);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_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_mysql_handler::append_open_handler_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_open_handler(str, handler_id, conn, link_idx);
+ exec_ha_sql = str;
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_open_handler(
+ spider_string *str,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_open_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider link_idx=%d", link_idx));
+ DBUG_PRINT("info",("spider m_handler_cid=%s",
+ spider->m_handler_cid[link_idx]));
+ if (str->reserve(SPIDER_SQL_HANDLER_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
+ if ((error_num = mysql_share->append_table_name(str,
+ spider->conn_link_idx[link_idx])))
+ DBUG_RETURN(error_num);
+ if (str->reserve(SPIDER_SQL_OPEN_LEN + SPIDER_SQL_AS_LEN +
+ SPIDER_SQL_HANDLER_CID_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_OPEN_STR, SPIDER_SQL_OPEN_LEN);
+ str->q_append(SPIDER_SQL_AS_STR, SPIDER_SQL_AS_LEN);
+ str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_close_handler_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_close_handler_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_close_handler(str, link_idx);
+ exec_ha_sql = str;
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_close_handler(
+ spider_string *str,
+ int link_idx
+) {
+ DBUG_ENTER("spider_mysql_handler::append_close_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_HANDLER_LEN + SPIDER_SQL_CLOSE_LEN +
+ SPIDER_SQL_HANDLER_CID_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
+ str->q_append(spider->m_handler_cid[link_idx],
+ SPIDER_SQL_HANDLER_CID_LEN);
+ str->q_append(SPIDER_SQL_CLOSE_STR, SPIDER_SQL_CLOSE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_insert_terminator_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_insert_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ str = &insert_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_insert_terminator(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_insert_terminator(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_mysql_handler::append_insert_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider->result_list.insert_dup_update_pushdown)
+ {
+ DBUG_PRINT("info",("spider add duplicate key update"));
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ if (str->reserve(SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN +
+ dup_update_sql.length()))
+ {
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_DUPLICATE_KEY_UPDATE_STR,
+ SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN);
+ if (str->append(dup_update_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ } else {
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_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_SQL:
+ str = &insert_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_insert_values(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_insert_values(
+ spider_string *str
+) {
+ SPIDER_SHARE *share = spider->share;
+ TABLE *table = spider->get_table();
+ Field **field;
+ bool add_value = FALSE;
+ DBUG_ENTER("spider_mysql_handler::append_insert_values");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ 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
+ add_value = TRUE;
+ 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
+ )
+ ) {
+ if (str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
+ {
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else {
+ if (
+ spider_db_mysql_utility.
+ append_column_value(spider, str, *field, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_COMMA_LEN)
+ ) {
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ }
+ }
+ if (add_value)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
+ {
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_into_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_into_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ str = &insert_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_into(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_into(
+ spider_string *str
+) {
+ const TABLE *table = spider->get_table();
+ Field **field;
+ uint field_name_length = 0;
+ DBUG_ENTER("spider_mysql_handler::append_into");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
+ insert_table_name_pos = str->length();
+ append_table_name_with_adjusting(str, first_link_idx,
+ SPIDER_SQL_TYPE_INSERT_SQL);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ for (field = table->field; *field; field++)
+ {
+ if (
+ bitmap_is_set(table->write_set, (*field)->field_index) ||
+ bitmap_is_set(table->read_set, (*field)->field_index)
+ ) {
+ field_name_length =
+ mysql_share->column_name_str[(*field)->field_index].length();
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ if (field_name_length)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ if (str->reserve(SPIDER_SQL_VALUES_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
+ insert_pos = str->length();
+ DBUG_RETURN(0);
+}
+
+void spider_mysql_handler::set_insert_to_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::set_insert_to_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ insert_sql.length(insert_pos);
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_handler::append_from_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_from_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ default:
+ str = &sql;
+ break;
+ }
+ error_num = append_from(str, sql_type, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_from(
+ spider_string *str,
+ ulong sql_type,
+ int link_idx
+) {
+ DBUG_ENTER("spider_mysql_handler::append_from");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider link_idx=%d", link_idx));
+ if (sql_type == SPIDER_SQL_TYPE_HANDLER)
+ {
+ ha_table_name_pos = str->length();
+ DBUG_PRINT("info",("spider ha_table_name_pos=%u", ha_table_name_pos));
+ ha_sql_handler_id = spider->m_handler_id[link_idx];
+ DBUG_PRINT("info",("spider ha_sql_handler_id=%u", ha_sql_handler_id));
+ if (str->reserve(SPIDER_SQL_HANDLER_CID_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
+ DBUG_PRINT("info",("spider m_handler_cid=%s",
+ spider->m_handler_cid[link_idx]));
+ } else {
+ if (str->reserve(SPIDER_SQL_FROM_LEN + mysql_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ table_name_pos = str->length();
+ append_table_name_with_adjusting(str, link_idx, sql_type);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_flush_tables_part(
+ ulong sql_type,
+ int link_idx,
+ bool lock
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_flush_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_flush_tables(str, link_idx, lock);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_flush_tables(
+ spider_string *str,
+ int link_idx,
+ bool lock
+) {
+ DBUG_ENTER("spider_mysql_handler::append_flush_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (lock)
+ {
+ if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN +
+ SPIDER_SQL_WITH_READ_LOCK_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
+ str->q_append(SPIDER_SQL_WITH_READ_LOCK_STR,
+ SPIDER_SQL_WITH_READ_LOCK_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_optimize_table_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_optimize_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_optimize_table(str, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_optimize_table(
+ spider_string *str,
+ int link_idx
+) {
+ SPIDER_SHARE *share = spider->share;
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ int local_length = spider_param_internal_optimize_local(spider->trx->thd,
+ share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
+ DBUG_ENTER("spider_mysql_handler::append_optimize_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_OPTIMIZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
+ local_length +
+ mysql_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ mysql_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_OPTIMIZE_STR, SPIDER_SQL_SQL_OPTIMIZE_LEN);
+ if (local_length)
+ str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
+ str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
+ mysql_share->append_table_name(str, conn_link_idx);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_analyze_table_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_analyze_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_analyze_table(str, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_analyze_table(
+ spider_string *str,
+ int link_idx
+) {
+ SPIDER_SHARE *share = spider->share;
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ int local_length = spider_param_internal_optimize_local(spider->trx->thd,
+ share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
+ DBUG_ENTER("spider_mysql_handler::append_analyze_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_ANALYZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
+ local_length +
+ mysql_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ mysql_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_ANALYZE_STR, SPIDER_SQL_SQL_ANALYZE_LEN);
+ if (local_length)
+ str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
+ str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
+ mysql_share->append_table_name(str, conn_link_idx);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_repair_table_part(
+ ulong sql_type,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_repair_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_repair_table(str, link_idx, check_opt);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_repair_table(
+ spider_string *str,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ SPIDER_SHARE *share = spider->share;
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ int local_length = spider_param_internal_optimize_local(spider->trx->thd,
+ share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
+ DBUG_ENTER("spider_mysql_handler::append_repair_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_REPAIR_LEN + SPIDER_SQL_SQL_TABLE_LEN +
+ local_length +
+ mysql_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ mysql_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_REPAIR_STR, SPIDER_SQL_SQL_REPAIR_LEN);
+ if (local_length)
+ str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
+ str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
+ mysql_share->append_table_name(str, conn_link_idx);
+ if (check_opt->flags & T_QUICK)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
+ }
+ if (check_opt->flags & T_EXTEND)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
+ }
+ if (check_opt->sql_flags & TT_USEFRM)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_USE_FRM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_USE_FRM_STR, SPIDER_SQL_SQL_USE_FRM_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_check_table_part(
+ ulong sql_type,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_check_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_check_table(str, link_idx, check_opt);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_check_table(
+ spider_string *str,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_mysql_handler::append_check_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_CHECK_TABLE_LEN +
+ mysql_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ mysql_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_CHECK_TABLE_STR,
+ SPIDER_SQL_SQL_CHECK_TABLE_LEN);
+ mysql_share->append_table_name(str, conn_link_idx);
+ if (check_opt->flags & T_QUICK)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
+ }
+ if (check_opt->flags & T_FAST)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_FAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_FAST_STR, SPIDER_SQL_SQL_FAST_LEN);
+ }
+ if (check_opt->flags & T_MEDIUM)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_MEDIUM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_MEDIUM_STR, SPIDER_SQL_SQL_MEDIUM_LEN);
+ }
+ if (check_opt->flags & T_EXTEND)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_enable_keys_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_enable_keys_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_enable_keys(str, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_enable_keys(
+ spider_string *str,
+ int link_idx
+) {
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_mysql_handler::append_enable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
+ mysql_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ mysql_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_ENABLE_KEYS_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
+ SPIDER_SQL_SQL_ALTER_TABLE_LEN);
+ mysql_share->append_table_name(str, conn_link_idx);
+ str->q_append(SPIDER_SQL_SQL_ENABLE_KEYS_STR,
+ SPIDER_SQL_SQL_ENABLE_KEYS_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_disable_keys_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_disable_keys_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_disable_keys(str, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_disable_keys(
+ spider_string *str,
+ int link_idx
+) {
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_mysql_handler::append_disable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
+ mysql_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ mysql_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_DISABLE_KEYS_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
+ SPIDER_SQL_SQL_ALTER_TABLE_LEN);
+ mysql_share->append_table_name(str, conn_link_idx);
+ str->q_append(SPIDER_SQL_SQL_DISABLE_KEYS_STR,
+ SPIDER_SQL_SQL_DISABLE_KEYS_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_delete_all_rows_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_delete_all_rows_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ str = &update_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_delete_all_rows(str, sql_type);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_delete_all_rows(
+ spider_string *str,
+ ulong sql_type
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_delete_all_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider->sql_command == SQLCOM_TRUNCATE)
+ {
+ if ((error_num = append_truncate(str, sql_type, first_link_idx)))
+ DBUG_RETURN(error_num);
+ } else {
+ if (
+ (error_num = append_delete(str)) ||
+ (error_num = append_from(str, sql_type, first_link_idx))
+ )
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_truncate(
+ spider_string *str,
+ ulong sql_type,
+ int link_idx
+) {
+ DBUG_ENTER("spider_mysql_handler::append_truncate");
+ if (str->reserve(SPIDER_SQL_TRUNCATE_TABLE_LEN +
+ mysql_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_TRUNCATE_TABLE_STR, SPIDER_SQL_TRUNCATE_TABLE_LEN);
+ table_name_pos = str->length();
+ append_table_name_with_adjusting(str, link_idx, sql_type);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_explain_select_part(
+ key_range *start_key,
+ key_range *end_key,
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mysql_handler::append_explain_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num =
+ append_explain_select(str, start_key, end_key, sql_type, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::append_explain_select(
+ spider_string *str,
+ key_range *start_key,
+ key_range *end_key,
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::append_explain_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_EXPLAIN_SELECT_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_EXPLAIN_SELECT_STR, SPIDER_SQL_EXPLAIN_SELECT_LEN);
+ if (
+ (error_num = append_from(str, sql_type, link_idx)) ||
+ (error_num = append_key_where(str, NULL, NULL, start_key, end_key,
+ sql_type, FALSE))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_mysql_handler::is_bulk_insert_exec_period(
+ bool bulk_end
+) {
+ DBUG_ENTER("spider_mysql_handler::is_bulk_insert_exec_period");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider insert_sql.length=%u", insert_sql.length()));
+ DBUG_PRINT("info",("spider insert_pos=%d", insert_pos));
+ DBUG_PRINT("info",("spider insert_sql=%s", insert_sql.c_ptr_safe()));
+ if (
+ (bulk_end || (int) insert_sql.length() >= spider->bulk_size) &&
+ (int) insert_sql.length() > insert_pos
+ ) {
+ DBUG_RETURN(TRUE);
+ }
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_mysql_handler::sql_is_filled_up(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::sql_is_filled_up");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(filled_up);
+}
+
+bool spider_mysql_handler::sql_is_empty(
+ ulong sql_type
+) {
+ bool is_empty;
+ DBUG_ENTER("spider_mysql_handler::sql_is_empty");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ is_empty = (sql.length() == 0);
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ is_empty = (insert_sql.length() == 0);
+ break;
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ is_empty = (update_sql.length() == 0);
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ is_empty = (tmp_sql.length() == 0);
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ is_empty = (ha_sql.length() == 0);
+ break;
+ default:
+ is_empty = TRUE;
+ break;
+ }
+ DBUG_RETURN(is_empty);
+}
+
+bool spider_mysql_handler::support_multi_split_read()
+{
+ DBUG_ENTER("spider_mysql_handler::support_multi_split_read");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+bool spider_mysql_handler::support_bulk_update()
+{
+ DBUG_ENTER("spider_mysql_handler::support_bulk_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+int spider_mysql_handler::bulk_tmp_table_insert()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = store_sql_to_bulk_tmp_table(&update_sql, upd_tmp_tbl);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::bulk_tmp_table_insert(
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = store_sql_to_bulk_tmp_table(
+ &spider->result_list.update_sqls[link_idx],
+ spider->result_list.upd_tmp_tbls[link_idx]);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::bulk_tmp_table_end_bulk_insert()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_end_bulk_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = upd_tmp_tbl->file->ha_end_bulk_insert()))
+ {
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::bulk_tmp_table_rnd_init()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_rnd_init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ upd_tmp_tbl->file->extra(HA_EXTRA_CACHE);
+ if ((error_num = upd_tmp_tbl->file->ha_rnd_init(TRUE)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ reading_from_bulk_tmp_table = TRUE;
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::bulk_tmp_table_rnd_next()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_rnd_next");
+ DBUG_PRINT("info",("spider this=%p", this));
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
+ error_num = upd_tmp_tbl->file->ha_rnd_next(upd_tmp_tbl->record[0]);
+#else
+ error_num = upd_tmp_tbl->file->rnd_next(upd_tmp_tbl->record[0]);
+#endif
+ if (!error_num)
+ {
+ error_num = restore_sql_from_bulk_tmp_table(&insert_sql, upd_tmp_tbl);
+ }
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_handler::bulk_tmp_table_rnd_end()
+{
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_rnd_end");
+ DBUG_PRINT("info",("spider this=%p", this));
+ reading_from_bulk_tmp_table = FALSE;
+ if ((error_num = upd_tmp_tbl->file->ha_rnd_end()))
+ {
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_mysql_handler::need_copy_for_update(
+ int link_idx
+) {
+ int all_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_mysql_handler::need_copy_for_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(!mysql_share->same_db_table_name ||
+ spider->share->link_statuses[all_link_idx] == SPIDER_LINK_STATUS_RECOVERY);
+}
+
+bool spider_mysql_handler::bulk_tmp_table_created()
+{
+ DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_created");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(upd_tmp_tbl);
+}
+
+int spider_mysql_handler::mk_bulk_tmp_table_and_bulk_start()
+{
+ THD *thd = spider->trx->thd;
+ TABLE *table = spider->get_table();
+ DBUG_ENTER("spider_mysql_handler::mk_bulk_tmp_table_and_bulk_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!upd_tmp_tbl)
+ {
+ if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
+ thd, table, &upd_tmp_tbl_prm, "a", update_sql.charset())))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ upd_tmp_tbl->file->extra(HA_EXTRA_WRITE_CACHE);
+ upd_tmp_tbl->file->ha_start_bulk_insert((ha_rows) 0);
+ }
+ DBUG_RETURN(0);
+}
+
+void spider_mysql_handler::rm_bulk_tmp_table()
+{
+ DBUG_ENTER("spider_mysql_handler::rm_bulk_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (upd_tmp_tbl)
+ {
+ spider_rm_sys_tmp_table(spider->trx->thd, upd_tmp_tbl, &upd_tmp_tbl_prm);
+ upd_tmp_tbl = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_handler::store_sql_to_bulk_tmp_table(
+ spider_string *str,
+ TABLE *tmp_table
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::store_sql_to_bulk_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_table->field[0]->set_notnull();
+ tmp_table->field[0]->store(str->ptr(), str->length(), str->charset());
+ if ((error_num = tmp_table->file->ha_write_row(tmp_table->record[0])))
+ DBUG_RETURN(error_num);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::restore_sql_from_bulk_tmp_table(
+ spider_string *str,
+ TABLE *tmp_table
+) {
+ DBUG_ENTER("spider_mysql_handler::restore_sql_from_bulk_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_table->field[0]->val_str(str->get_str());
+ str->mem_calc();
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::insert_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash2 = &link_for_hash[link_idx];
+ DBUG_ENTER("spider_mysql_handler::insert_lock_tables_list");
+ DBUG_PRINT("info",("spider this=%p", this));
+ uint old_elements =
+ db_conn->lock_table_hash.array.max_element;
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ if (my_hash_insert_with_hash_value(
+ &db_conn->lock_table_hash,
+ tmp_link_for_hash2->db_table_str_hash_value,
+ (uchar*) tmp_link_for_hash2))
+#else
+ if (my_hash_insert(&db_conn->lock_table_hash,
+ (uchar*) tmp_link_for_hash2))
+#endif
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (db_conn->lock_table_hash.array.max_element > old_elements)
+ {
+ spider_alloc_calc_mem(spider_current_trx,
+ db_conn->lock_table_hash,
+ (db_conn->lock_table_hash.array.max_element - old_elements) *
+ db_conn->lock_table_hash.array.size_of_element);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::append_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx,
+ int *appended
+) {
+ int error_num;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash, *tmp_link_for_hash2;
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
+ DBUG_ENTER("spider_mysql_handler::append_lock_tables_list");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_link_for_hash2 = &link_for_hash[link_idx];
+ tmp_link_for_hash2->db_table_str =
+ &mysql_share->db_table_str[conn_link_idx];
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ tmp_link_for_hash2->db_table_str_hash_value =
+ mysql_share->db_table_str_hash_value[conn_link_idx];
+ if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *)
+ my_hash_search_using_hash_value(
+ &db_conn->lock_table_hash,
+ tmp_link_for_hash2->db_table_str_hash_value,
+ (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
+ tmp_link_for_hash2->db_table_str->length())))
+#else
+ if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *) my_hash_search(
+ &db_conn->lock_table_hash,
+ (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
+ tmp_link_for_hash2->db_table_str->length())))
+#endif
+ {
+ if ((error_num = insert_lock_tables_list(conn, link_idx)))
+ DBUG_RETURN(error_num);
+ *appended = 1;
+ } else {
+ if (tmp_link_for_hash->spider->lock_type < spider->lock_type)
+ {
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ my_hash_delete_with_hash_value(
+ &db_conn->lock_table_hash,
+ tmp_link_for_hash->db_table_str_hash_value,
+ (uchar*) tmp_link_for_hash);
+#else
+ my_hash_delete(&db_conn->lock_table_hash,
+ (uchar*) tmp_link_for_hash);
+#endif
+ uint old_elements =
+ db_conn->lock_table_hash.array.max_element;
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ if (my_hash_insert_with_hash_value(
+ &db_conn->lock_table_hash,
+ tmp_link_for_hash2->db_table_str_hash_value,
+ (uchar*) tmp_link_for_hash2))
+#else
+ if (my_hash_insert(&db_conn->lock_table_hash,
+ (uchar*) tmp_link_for_hash2))
+#endif
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (db_conn->lock_table_hash.array.max_element > old_elements)
+ {
+ spider_alloc_calc_mem(spider_current_trx,
+ db_conn->lock_table_hash,
+ (db_conn->lock_table_hash.array.max_element - old_elements) *
+ db_conn->lock_table_hash.array.size_of_element);
+ }
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_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_mysql_handler::realloc_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((int) sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ sql.free();
+ if (sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
+ }
+ if ((int) ha_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ ha_sql.free();
+ if (ha_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
+ }
+ if ((int) dup_update_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ dup_update_sql.free();
+ if (dup_update_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if ((int) insert_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ insert_sql.free();
+ if (insert_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= SPIDER_SQL_TYPE_INSERT_SQL;
+ }
+ if ((int) update_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ update_sql.free();
+ if (update_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL);
+ }
+ update_sql.length(0);
+ if ((int) tmp_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ tmp_sql.free();
+ if (tmp_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= SPIDER_SQL_TYPE_TMP_SQL;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::reset_sql(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::reset_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
+ {
+ sql.length(0);
+ }
+ if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
+ {
+ insert_sql.length(0);
+ }
+ if (sql_type & (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL |
+ SPIDER_SQL_TYPE_BULK_UPDATE_SQL))
+ {
+ update_sql.length(0);
+ }
+ if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
+ {
+ tmp_sql.length(0);
+ }
+ if (sql_type & SPIDER_SQL_TYPE_HANDLER)
+ {
+ ha_sql.length(0);
+ }
+ DBUG_RETURN(0);
+}
+
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+int spider_mysql_handler::reset_keys(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::reset_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::reset_upds(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::reset_upds");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_upds.clear();
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::reset_strs(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::reset_strs");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::reset_strs_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::reset_strs_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::push_back_upds(
+ SPIDER_HS_STRING_REF &info
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_handler::push_back_upds");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = hs_upds.push_back(info);
+ DBUG_RETURN(error_num);
+}
+#endif
+
+bool spider_mysql_handler::need_lock_before_set_sql_for_exec(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::need_lock_before_set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_mysql_handler::set_sql_for_exec(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ uint tmp_pos;
+ SPIDER_SHARE *share = spider->share;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ int all_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_mysql_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & (SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL))
+ {
+ if (mysql_share->same_db_table_name || link_idx == first_link_idx)
+ {
+ if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
+ exec_sql = &sql;
+ if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
+ exec_tmp_sql = &tmp_sql;
+ } else {
+ char tmp_table_name[MAX_FIELD_WIDTH * 2],
+ tgt_table_name[MAX_FIELD_WIDTH * 2];
+ int tmp_table_name_length;
+ spider_string tgt_table_name_str(tgt_table_name,
+ MAX_FIELD_WIDTH * 2,
+ mysql_share->db_names_str[link_idx].charset());
+ const char *table_names[2], *table_aliases[2];
+ uint table_name_lengths[2], table_alias_lengths[2];
+ tgt_table_name_str.init_calc_mem(104);
+ tgt_table_name_str.length(0);
+ if (result_list->tmp_table_join && spider->bka_mode != 2)
+ {
+ create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
+ link_idx);
+ append_table_name_with_adjusting(&tgt_table_name_str, link_idx,
+ SPIDER_SQL_TYPE_TMP_SQL);
+ table_names[0] = tmp_table_name;
+ table_names[1] = tgt_table_name_str.ptr();
+ table_name_lengths[0] = tmp_table_name_length;
+ table_name_lengths[1] = tgt_table_name_str.length();
+ table_aliases[0] = SPIDER_SQL_A_STR;
+ table_aliases[1] = SPIDER_SQL_B_STR;
+ table_alias_lengths[0] = SPIDER_SQL_A_LEN;
+ table_alias_lengths[1] = SPIDER_SQL_B_LEN;
+ }
+ if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
+ {
+ exec_sql = &result_list->sqls[link_idx];
+ if (exec_sql->copy(sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ else if (result_list->use_union)
+ {
+ if ((error_num = reset_union_table_name(exec_sql, link_idx,
+ SPIDER_SQL_TYPE_SELECT_SQL)))
+ DBUG_RETURN(error_num);
+ } else {
+ tmp_pos = exec_sql->length();
+ exec_sql->length(table_name_pos);
+ if (result_list->tmp_table_join && spider->bka_mode != 2)
+ {
+ if ((error_num = spider_db_mysql_utility.append_from_with_alias(
+ exec_sql, table_names, table_name_lengths,
+ table_aliases, table_alias_lengths, 2,
+ &table_name_pos, TRUE))
+ )
+ DBUG_RETURN(error_num);
+ exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ } else {
+ append_table_name_with_adjusting(exec_sql, link_idx,
+ SPIDER_SQL_TYPE_SELECT_SQL);
+ }
+ exec_sql->length(tmp_pos);
+ }
+ }
+ if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
+ {
+ exec_tmp_sql = &result_list->tmp_sqls[link_idx];
+ if (result_list->tmp_table_join && spider->bka_mode != 2)
+ {
+ if (exec_tmp_sql->copy(tmp_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ else {
+ tmp_pos = exec_tmp_sql->length();
+ exec_tmp_sql->length(tmp_sql_pos1);
+ exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
+ exec_tmp_sql->length(tmp_sql_pos2);
+ exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
+ exec_tmp_sql->length(tmp_sql_pos3);
+ exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
+ exec_tmp_sql->length(tmp_pos);
+ }
+ }
+ }
+ }
+ }
+ if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
+ {
+ if (mysql_share->same_db_table_name || link_idx == first_link_idx)
+ exec_insert_sql = &insert_sql;
+ else {
+ exec_insert_sql = &result_list->insert_sqls[link_idx];
+ if (exec_insert_sql->copy(insert_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_PRINT("info",("spider exec_insert_sql=%s",
+ exec_insert_sql->c_ptr_safe()));
+ tmp_pos = exec_insert_sql->length();
+ exec_insert_sql->length(insert_table_name_pos);
+ append_table_name_with_adjusting(exec_insert_sql, link_idx,
+ sql_type);
+ exec_insert_sql->length(tmp_pos);
+ DBUG_PRINT("info",("spider exec_insert_sql->length=%u",
+ exec_insert_sql->length()));
+ DBUG_PRINT("info",("spider exec_insert_sql=%s",
+ exec_insert_sql->c_ptr_safe()));
+ }
+ }
+ if (sql_type & SPIDER_SQL_TYPE_BULK_UPDATE_SQL)
+ {
+ if (reading_from_bulk_tmp_table)
+ {
+ if (
+ mysql_share->same_db_table_name &&
+ share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
+ ) {
+ exec_update_sql = &insert_sql;
+ } else if (!spider->result_list.upd_tmp_tbls[link_idx])
+ {
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ } else {
+ exec_update_sql = &spider->result_list.insert_sqls[link_idx];
+ if ((error_num = restore_sql_from_bulk_tmp_table(exec_update_sql,
+ spider->result_list.upd_tmp_tbls[link_idx])))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ } else {
+ if (
+ mysql_share->same_db_table_name &&
+ share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
+ ) {
+ exec_update_sql = &update_sql;
+ } else {
+ exec_update_sql = &spider->result_list.update_sqls[link_idx];
+ }
+ }
+ } else if (sql_type &
+ (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL))
+ {
+ if (mysql_share->same_db_table_name || link_idx == first_link_idx)
+ exec_update_sql = &update_sql;
+ else {
+ exec_update_sql = &spider->result_list.update_sqls[link_idx];
+ if (exec_update_sql->copy(update_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ tmp_pos = exec_update_sql->length();
+ exec_update_sql->length(table_name_pos);
+ append_table_name_with_adjusting(exec_update_sql, link_idx,
+ sql_type);
+ exec_update_sql->length(tmp_pos);
+ }
+ }
+ if (sql_type & SPIDER_SQL_TYPE_HANDLER)
+ {
+ if (spider->m_handler_id[link_idx] == ha_sql_handler_id)
+ exec_ha_sql = &ha_sql;
+ else {
+ exec_ha_sql = &result_list->sqls[link_idx];
+ if (exec_ha_sql->copy(ha_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ else {
+ tmp_pos = exec_ha_sql->length();
+ exec_ha_sql->length(ha_table_name_pos);
+ append_table_name_with_adjusting(exec_ha_sql, link_idx,
+ SPIDER_SQL_TYPE_HANDLER);
+ exec_ha_sql->length(tmp_pos);
+ }
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::set_sql_for_exec(
+ spider_db_copy_table *tgt_ct,
+ ulong sql_type
+) {
+ spider_mysql_copy_table *mysql_ct = (spider_mysql_copy_table *) tgt_ct;
+ DBUG_ENTER("spider_mysql_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ exec_insert_sql = &mysql_ct->sql;
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::execute_sql(
+ ulong sql_type,
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+) {
+ spider_string *tgt_sql;
+ uint tgt_length;
+ DBUG_ENTER("spider_mysql_handler::execute_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
+ tgt_sql = exec_sql;
+ tgt_length = tgt_sql->length();
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
+ tgt_sql = exec_insert_sql;
+ tgt_length = tgt_sql->length();
+ break;
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ DBUG_PRINT("info",("spider %s",
+ sql_type == SPIDER_SQL_TYPE_UPDATE_SQL ? "SPIDER_SQL_TYPE_UPDATE_SQL" :
+ sql_type == SPIDER_SQL_TYPE_DELETE_SQL ? "SPIDER_SQL_TYPE_DELETE_SQL" :
+ "SPIDER_SQL_TYPE_BULK_UPDATE_SQL"
+ ));
+ tgt_sql = exec_update_sql;
+ tgt_length = tgt_sql->length();
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_TMP_SQL"));
+ tgt_sql = exec_tmp_sql;
+ tgt_length = tgt_sql->length();
+ break;
+ case SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL"));
+ tgt_sql = exec_tmp_sql;
+ tgt_length = tmp_sql_pos5;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_HANDLER"));
+ tgt_sql = exec_ha_sql;
+ tgt_length = tgt_sql->length();
+ break;
+ default:
+ /* nothing to do */
+ DBUG_PRINT("info",("spider default"));
+ DBUG_RETURN(0);
+ }
+ DBUG_RETURN(spider_db_query(
+ conn,
+ tgt_sql->ptr(),
+ tgt_length,
+ quick_mode,
+ need_mon
+ ));
+}
+
+int spider_mysql_handler::reset()
+{
+ DBUG_ENTER("spider_mysql_handler::reset");
+ DBUG_PRINT("info",("spider this=%p", this));
+ update_sql.length(0);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::sts_mode_exchange(
+ int sts_mode
+) {
+ DBUG_ENTER("spider_mysql_handler::sts_mode_exchange");
+ DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
+ DBUG_RETURN(sts_mode);
+}
+
+int spider_mysql_handler::show_table_status(
+ int link_idx,
+ int sts_mode,
+ uint flag
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_DB_RESULT *res;
+ SPIDER_SHARE *share = spider->share;
+ uint pos = (2 * spider->conn_link_idx[link_idx]);
+ DBUG_ENTER("spider_mysql_handler::show_table_status");
+ DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
+ if (sts_mode == 1)
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ mysql_share->show_table_status[0 + pos].ptr(),
+ mysql_share->show_table_status[0 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ mysql_share->show_table_status[0 + pos].ptr(),
+ mysql_share->show_table_status[0 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (spider_param_dry_access())
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+ }
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ DBUG_RETURN(error_num);
+ else {
+ my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
+ ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
+ }
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ error_num = res->fetch_table_status(
+ sts_mode,
+ share->records,
+ share->mean_rec_length,
+ share->data_file_length,
+ share->max_data_file_length,
+ share->index_file_length,
+ share->auto_increment_value,
+ share->create_time,
+ share->update_time,
+ share->check_time
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ {
+ switch (error_num)
+ {
+ case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
+ my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
+ ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ break;
+ case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
+ my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
+ ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ break;
+ default:
+ break;
+ }
+ DBUG_RETURN(error_num);
+ }
+ } else {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ mysql_share->show_table_status[1 + pos].ptr(),
+ mysql_share->show_table_status[1 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ mysql_share->show_table_status[1 + pos].ptr(),
+ mysql_share->show_table_status[1 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (spider_param_dry_access())
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+ }
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ DBUG_RETURN(error_num);
+ else
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ error_num = res->fetch_table_status(
+ sts_mode,
+ share->records,
+ share->mean_rec_length,
+ share->data_file_length,
+ share->max_data_file_length,
+ share->index_file_length,
+ share->auto_increment_value,
+ share->create_time,
+ share->update_time,
+ share->check_time
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ {
+ switch (error_num)
+ {
+ case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
+ my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
+ ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ break;
+ case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
+ my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
+ ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ break;
+ default:
+ break;
+ }
+ DBUG_RETURN(error_num);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::crd_mode_exchange(
+ int crd_mode
+) {
+ DBUG_ENTER("spider_mysql_handler::crd_mode_exchange");
+ DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
+ DBUG_RETURN(crd_mode);
+}
+
+int spider_mysql_handler::show_index(
+ int link_idx,
+ int crd_mode
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_SHARE *share = spider->share;
+ TABLE *table = spider->get_table();
+ SPIDER_DB_RESULT *res;
+ int roop_count;
+ longlong *tmp_cardinality;
+ uint pos = (2 * spider->conn_link_idx[link_idx]);
+ DBUG_ENTER("spider_mysql_handler::show_index");
+ DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
+ if (crd_mode == 1)
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ mysql_share->show_index[0 + pos].ptr(),
+ mysql_share->show_index[0 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ mysql_share->show_index[0 + pos].ptr(),
+ mysql_share->show_index[0 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ /* no record is ok */
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ if (res)
+ {
+ error_num = res->fetch_table_cardinality(
+ crd_mode,
+ table,
+ share->cardinality,
+ share->cardinality_upd,
+ share->bitmap_size
+ );
+ }
+ for (roop_count = 0, tmp_cardinality = share->cardinality;
+ roop_count < (int) table->s->fields;
+ roop_count++, tmp_cardinality++)
+ {
+ if (!spider_bit_is_set(share->cardinality_upd, roop_count))
+ {
+ DBUG_PRINT("info",
+ ("spider init column cardinality id=%d", roop_count));
+ *tmp_cardinality = 1;
+ }
+ }
+ if (res)
+ {
+ res->free_result();
+ delete res;
+ }
+ if (error_num)
+ {
+ switch (error_num)
+ {
+ case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
+ my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
+ ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ break;
+ case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
+ my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
+ ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ break;
+ default:
+ break;
+ }
+ DBUG_RETURN(error_num);
+ }
+ } else {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ mysql_share->show_index[1 + pos].ptr(),
+ mysql_share->show_index[1 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ mysql_share->show_index[1 + pos].ptr(),
+ mysql_share->show_index[1 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ /* no record is ok */
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ if (res)
+ {
+ error_num = res->fetch_table_cardinality(
+ crd_mode,
+ table,
+ share->cardinality,
+ share->cardinality_upd,
+ share->bitmap_size
+ );
+ }
+ for (roop_count = 0, tmp_cardinality = share->cardinality;
+ roop_count < (int) table->s->fields;
+ roop_count++, tmp_cardinality++)
+ {
+ if (!spider_bit_is_set(share->cardinality_upd, roop_count))
+ {
+ DBUG_PRINT("info",
+ ("spider init column cardinality id=%d", roop_count));
+ *tmp_cardinality = 1;
+ }
+ }
+ if (res)
+ {
+ res->free_result();
+ delete res;
+ }
+ if (error_num)
+ {
+ switch (error_num)
+ {
+ case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
+ my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
+ ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ break;
+ case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
+ my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
+ ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
+ mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ mysql_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ break;
+ default:
+ break;
+ }
+ DBUG_RETURN(error_num);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::show_records(
+ int link_idx
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_DB_RESULT *res;
+ SPIDER_SHARE *share = spider->share;
+ uint pos = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_mysql_handler::show_records");
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ mysql_share->show_records[pos].ptr(),
+ mysql_share->show_records[pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ mysql_share->show_records[pos].ptr(),
+ mysql_share->show_records[pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
+ DBUG_RETURN(error_num);
+ } else {
+ DBUG_PRINT("info", ("spider error_num=%d 6",
+ ER_QUERY_ON_FOREIGN_DATA_SOURCE));
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ error_num = res->fetch_table_records(
+ 1,
+ spider->table_rows
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider->trx->direct_aggregate_count++;
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::show_last_insert_id(
+ int link_idx,
+ ulonglong &last_insert_id
+) {
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ DBUG_ENTER("spider_mysql_handler::show_last_insert_id");
+ last_insert_id = conn->db_conn->last_insert_id();
+ DBUG_RETURN(0);
+}
+
+ha_rows spider_mysql_handler::explain_select(
+ key_range *start_key,
+ key_range *end_key,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ spider_string *str = &result_list->sqls[link_idx];
+ SPIDER_DB_RESULT *res;
+ ha_rows rows;
+ spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
+ DBUG_ENTER("spider_mysql_handler::explain_select");
+ if ((error_num = dbton_hdl->append_explain_select_part(
+ start_key, end_key, SPIDER_SQL_TYPE_OTHER_SQL, link_idx)))
+ {
+ my_errno = error_num;
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(spider->share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ spider->share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ spider->share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ error_num = spider_db_errorno(conn);
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ } else {
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ } else {
+ my_errno = ER_QUERY_ON_FOREIGN_DATA_SOURCE;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ error_num = res->fetch_table_records(
+ 2,
+ rows
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ {
+ my_errno = error_num;
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ DBUG_RETURN(rows);
+}
+
+int spider_mysql_handler::lock_tables(
+ int link_idx
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ spider_string *str = &sql;
+ DBUG_ENTER("spider_mysql_handler::lock_tables");
+ str->length(0);
+ if ((error_num = conn->db_conn->append_lock_tables(str)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->length())
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ spider->share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ if (!conn->table_locked)
+ {
+ conn->table_locked = TRUE;
+ spider->trx->locked_connections++;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::unlock_tables(
+ int link_idx
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ DBUG_ENTER("spider_mysql_handler::unlock_tables");
+ if (conn->table_locked)
+ {
+ spider_string *str = &sql;
+ conn->table_locked = FALSE;
+ spider->trx->locked_connections--;
+
+ str->length(0);
+ if ((error_num = conn->db_conn->append_unlock_tables(str)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->length())
+ {
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ spider->share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::disable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_mysql_handler::disable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_disable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::enable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_mysql_handler::enable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_enable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::check_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_mysql_handler::check_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_check_table_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx, check_opt)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::repair_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_mysql_handler::repair_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_repair_table_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx, check_opt)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::analyze_table(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_mysql_handler::analyze_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_analyze_table_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::optimize_table(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_mysql_handler::optimize_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_optimize_table_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::flush_tables(
+ SPIDER_CONN *conn,
+ int link_idx,
+ bool lock
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_mysql_handler::flush_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_flush_tables_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx, lock)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::flush_logs(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ DBUG_ENTER("spider_mysql_handler::flush_logs");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_FLUSH_LOGS_STR,
+ SPIDER_SQL_FLUSH_LOGS_LEN,
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::insert_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ spider_db_mysql *db_conn = (spider_db_mysql *) 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_mysql_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_mysql_handler::delete_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
+ uint roop_count, elements = db_conn->handler_open_array.elements;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
+ DBUG_ENTER("spider_mysql_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_mysql_handler::sync_from_clone_source(
+ spider_db_handler *dbton_hdl
+) {
+ DBUG_ENTER("spider_mysql_handler::sync_from_clone_source");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+bool spider_mysql_handler::support_use_handler(
+ int use_handler
+) {
+ DBUG_ENTER("spider_mysql_handler::support_use_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+void spider_mysql_handler::minimum_select_bitmap_create()
+{
+ TABLE *table = spider->get_table();
+ Field **field_p;
+ DBUG_ENTER("spider_mysql_handler::minimum_select_bitmap_create");
+ DBUG_PRINT("info",("spider this=%p", this));
+ memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
+ if (
+ spider->has_clone_for_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;
+ DBUG_PRINT("info",("spider field_index=%u", field_index));
+ DBUG_PRINT("info",("spider ft_discard_bitmap=%s",
+ spider_bit_is_set(spider->ft_discard_bitmap, field_index) ?
+ "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider searched_bitmap=%s",
+ spider_bit_is_set(spider->searched_bitmap, field_index) ?
+ "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider read_set=%s",
+ bitmap_is_set(table->read_set, field_index) ?
+ "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider write_set=%s",
+ bitmap_is_set(table->write_set, field_index) ?
+ "TRUE" : "FALSE"));
+ if (
+ spider_bit_is_set(spider->ft_discard_bitmap, field_index) &
+ (
+ 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_mysql_handler::minimum_select_bit_is_set(
+ uint field_index
+) {
+ DBUG_ENTER("spider_mysql_handler::minimum_select_bit_is_set");
+ DBUG_PRINT("info",("spider this=%p", this));
+ 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_mysql_handler::copy_minimum_select_bitmap(
+ uchar *bitmap
+) {
+ int roop_count;
+ TABLE *table = spider->get_table();
+ DBUG_ENTER("spider_mysql_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_mysql_handler::init_union_table_name_pos()
+{
+ DBUG_ENTER("spider_mysql_handler::init_union_table_name_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!union_table_name_pos_first)
+ {
+ if (!spider_bulk_malloc(spider_current_trx, 236, MYF(MY_WME),
+ &union_table_name_pos_first, sizeof(SPIDER_INT_HLD),
+ NullS)
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ union_table_name_pos_first->next = NULL;
+ }
+ union_table_name_pos_current = union_table_name_pos_first;
+ union_table_name_pos_current->tgt_num = 0;
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::set_union_table_name_pos()
+{
+ DBUG_ENTER("spider_mysql_handler::set_union_table_name_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE)
+ {
+ if (!union_table_name_pos_current->next)
+ {
+ if (!spider_bulk_malloc(spider_current_trx, 237, MYF(MY_WME),
+ &union_table_name_pos_current->next, sizeof(SPIDER_INT_HLD),
+ NullS)
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ union_table_name_pos_current->next->next = NULL;
+ }
+ union_table_name_pos_current = union_table_name_pos_current->next;
+ union_table_name_pos_current->tgt_num = 0;
+ }
+ union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] =
+ table_name_pos;
+ ++union_table_name_pos_current->tgt_num;
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_handler::reset_union_table_name(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_mysql_handler::reset_union_table_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!union_table_name_pos_current)
+ DBUG_RETURN(0);
+
+ SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
+ uint cur_num, pos_backup = str->length();
+ while(TRUE)
+ {
+ for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num)
+ {
+ str->length(tmp_pos->tgt[cur_num]);
+ append_table_name_with_adjusting(str, link_idx, sql_type);
+ }
+ if (tmp_pos == union_table_name_pos_current)
+ break;
+ tmp_pos = tmp_pos->next;
+ }
+ str->length(pos_backup);
+ DBUG_RETURN(0);
+}
+
+spider_mysql_copy_table::spider_mysql_copy_table(
+ spider_mysql_share *db_share
+) : spider_db_copy_table(
+ db_share
+),
+ mysql_share(db_share)
+{
+ DBUG_ENTER("spider_mysql_copy_table::spider_mysql_copy_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mysql_copy_table::~spider_mysql_copy_table()
+{
+ DBUG_ENTER("spider_mysql_copy_table::~spider_mysql_copy_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_copy_table::init()
+{
+ DBUG_ENTER("spider_mysql_copy_table::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.init_calc_mem(78);
+ DBUG_RETURN(0);
+}
+
+void spider_mysql_copy_table::set_sql_charset(
+ CHARSET_INFO *cs
+) {
+ DBUG_ENTER("spider_mysql_copy_table::set_sql_charset");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.set_charset(cs);
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_copy_table::append_select_str()
+{
+ DBUG_ENTER("spider_mysql_copy_table::append_select_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_SELECT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_insert_str(
+ int insert_flg
+) {
+ DBUG_ENTER("spider_mysql_copy_table::append_insert_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (insert_flg & SPIDER_DB_INSERT_REPLACE)
+ {
+ if (sql.reserve(SPIDER_SQL_REPLACE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
+ } else {
+ if (sql.reserve(SPIDER_SQL_INSERT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
+ }
+ if (insert_flg & SPIDER_DB_INSERT_LOW_PRIORITY)
+ {
+ if (sql.reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
+ }
+ else if (insert_flg & SPIDER_DB_INSERT_DELAYED)
+ {
+ if (sql.reserve(SPIDER_SQL_SQL_DELAYED_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
+ }
+ else if (insert_flg & SPIDER_DB_INSERT_HIGH_PRIORITY)
+ {
+ if (sql.reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
+ }
+ if (insert_flg & SPIDER_DB_INSERT_IGNORE)
+ {
+ if (sql.reserve(SPIDER_SQL_SQL_IGNORE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_table_columns(
+ TABLE_SHARE *table_share
+) {
+ int error_num;
+ Field **field;
+ DBUG_ENTER("spider_mysql_copy_table::append_table_columns");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (field = table_share->field; *field; field++)
+ {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql,
+ (char *) (*field)->field_name, spider_dbton_mysql.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_from_str()
+{
+ DBUG_ENTER("spider_mysql_copy_table::append_from_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_table_name(
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_copy_table::append_table_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = mysql_share->append_table_name(&sql, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+void spider_mysql_copy_table::set_sql_pos()
+{
+ DBUG_ENTER("spider_mysql_copy_table::set_sql_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ pos = sql.length();
+ DBUG_VOID_RETURN;
+}
+
+void spider_mysql_copy_table::set_sql_to_pos()
+{
+ DBUG_ENTER("spider_mysql_copy_table::set_sql_to_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.length(pos);
+ DBUG_VOID_RETURN;
+}
+
+int spider_mysql_copy_table::append_copy_where(
+ spider_db_copy_table *source_ct,
+ KEY *key_info,
+ ulong *last_row_pos,
+ ulong *last_lengths
+) {
+ int error_num, roop_count, roop_count2;
+ DBUG_ENTER("spider_mysql_copy_table::append_copy_where");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ Field *field;
+ KEY_PART_INFO *key_part = key_info->key_part;
+ for (roop_count = spider_user_defined_key_parts(key_info) - 1;
+ roop_count >= 0; roop_count--)
+ {
+ for (roop_count2 = 0; roop_count2 < roop_count; roop_count2++)
+ {
+ field = key_part[roop_count2].field;
+ if ((error_num = copy_key_row(source_ct,
+ field, &last_row_pos[field->field_index],
+ &last_lengths[field->field_index],
+ SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ field = key_part[roop_count2].field;
+ if ((error_num = copy_key_row(source_ct,
+ field, &last_row_pos[field->field_index],
+ &last_lengths[field->field_index],
+ SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ sql.length(sql.length() - SPIDER_SQL_AND_LEN);
+ if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
+ SPIDER_SQL_OR_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ sql.q_append(SPIDER_SQL_OR_STR, SPIDER_SQL_OR_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ sql.length(sql.length() - SPIDER_SQL_OR_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_key_order_str(
+ KEY *key_info,
+ int start_pos,
+ bool desc_flg
+) {
+ int length, error_num;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ DBUG_ENTER("spider_mysql_copy_table::append_key_order_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((int) spider_user_defined_key_parts(key_info) > start_pos)
+ {
+ if (sql.reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ if (desc_flg == TRUE)
+ {
+ for (
+ key_part = key_info->key_part + start_pos,
+ length = 0;
+ length + start_pos < (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql,
+ (char *) field->field_name, spider_dbton_mysql.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ } else {
+ for (
+ key_part = key_info->key_part + start_pos,
+ length = 0;
+ length + start_pos < (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql,
+ (char *) field->field_name, spider_dbton_mysql.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ }
+ sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_limit(
+ longlong offset,
+ longlong limit
+) {
+ char buf[SPIDER_LONGLONG_LEN + 1];
+ uint32 length;
+ DBUG_ENTER("spider_mysql_copy_table::append_limit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (offset || limit < 9223372036854775807LL)
+ {
+ if (sql.reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
+ ((SPIDER_LONGLONG_LEN) * 2)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
+ if (offset)
+ {
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
+ sql.q_append(buf, length);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
+ sql.q_append(buf, length);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_into_str()
+{
+ DBUG_ENTER("spider_mysql_copy_table::append_into_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_INTO_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_open_paren_str()
+{
+ DBUG_ENTER("spider_mysql_copy_table::append_open_paren_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_values_str()
+{
+ DBUG_ENTER("spider_mysql_copy_table::append_values_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_select_lock_str(
+ int lock_mode
+) {
+ DBUG_ENTER("spider_mysql_copy_table::append_select_lock_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
+ {
+ if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
+ } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
+ {
+ if (sql.reserve(SPIDER_SQL_SHARED_LOCK_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::exec_query(
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_copy_table::exec_query");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = spider_db_query(conn, sql.ptr(), sql.length(), quick_mode,
+ need_mon);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mysql_copy_table::copy_key_row(
+ spider_db_copy_table *source_ct,
+ Field *field,
+ ulong *row_pos,
+ ulong *length,
+ const char *joint_str,
+ const int joint_length
+) {
+ int error_num;
+ spider_string *source_str = &((spider_mysql_copy_table *) source_ct)->sql;
+ DBUG_ENTER("spider_mysql_copy_table::copy_key_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql,
+ (char *) field->field_name, spider_dbton_mysql.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length +
+ SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(joint_str, joint_length);
+ sql.q_append(source_str->ptr() + *row_pos, *length);
+ sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::copy_row(
+ Field *field,
+ SPIDER_DB_ROW *row
+) {
+ int error_num;
+ DBUG_ENTER("spider_mysql_copy_table::copy_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (row->is_null())
+ {
+ if (sql.reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else if (field->str_needs_quotes())
+ {
+ if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ if ((error_num = row->append_escaped_to_str(&sql,
+ spider_dbton_mysql.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ } else {
+ if ((error_num = row->append_to_str(&sql)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::copy_rows(
+ TABLE *table,
+ SPIDER_DB_ROW *row,
+ ulong **last_row_pos,
+ ulong **last_lengths
+) {
+ int error_num;
+ Field **field;
+ ulong *lengths2, *row_pos2;
+ DBUG_ENTER("spider_mysql_copy_table::copy_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ row_pos2 = *last_row_pos;
+ lengths2 = *last_lengths;
+
+ for (
+ field = table->field;
+ *field;
+ field++,
+ lengths2++
+ ) {
+ *row_pos2 = sql.length();
+ if ((error_num =
+ copy_row(*field, row)))
+ DBUG_RETURN(error_num);
+ *lengths2 = sql.length() - *row_pos2 - SPIDER_SQL_COMMA_LEN;
+ row->next();
+ row_pos2++;
+ }
+ sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
+ if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
+ SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::copy_rows(
+ TABLE *table,
+ SPIDER_DB_ROW *row
+) {
+ int error_num;
+ Field **field;
+ DBUG_ENTER("spider_mysql_copy_table::copy_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (
+ field = table->field;
+ *field;
+ field++
+ ) {
+ if ((error_num =
+ copy_row(*field, row)))
+ DBUG_RETURN(error_num);
+ row->next();
+ }
+ sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
+ if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
+ SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::append_insert_terminator()
+{
+ DBUG_ENTER("spider_mysql_copy_table::append_insert_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.length(sql.length() - SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_mysql_copy_table::copy_insert_values(
+ spider_db_copy_table *source_ct
+) {
+ spider_mysql_copy_table *tmp_ct = (spider_mysql_copy_table *) source_ct;
+ spider_string *source_str = &tmp_ct->sql;
+ int values_length = source_str->length() - tmp_ct->pos;
+ const char *values_ptr = source_str->ptr() + tmp_ct->pos;
+ DBUG_ENTER("spider_mysql_copy_table::copy_insert_values");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(values_length))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.q_append(values_ptr, values_length);
+ DBUG_RETURN(0);
+}
diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h
index b95d4e6e1a2..e536e2dd214 100644
--- a/storage/spider/spd_db_mysql.h
+++ b/storage/spider/spd_db_mysql.h
@@ -1,1374 +1,1386 @@
-/* Copyright (C) 2012-2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-class spider_db_mysql_util: public spider_db_util
-{
-public:
- spider_db_mysql_util();
- ~spider_db_mysql_util();
- int append_name(
- spider_string *str,
- const char *name,
- uint name_length
- );
- int append_name_with_charset(
- spider_string *str,
- const char *name,
- uint name_length,
- CHARSET_INFO *name_charset
- );
- bool is_name_quote(
- const char head_code
- );
- int append_escaped_name_quote(
- spider_string *str
- );
- int append_column_value(
- ha_spider *spider,
- spider_string *str,
- Field *field,
- const uchar *new_ptr,
- CHARSET_INFO *access_charset
- );
- int append_from_with_alias(
- spider_string *str,
- const char **table_names,
- uint *table_name_lengths,
- const char **table_aliases,
- uint *table_alias_lengths,
- uint table_count,
- int *table_name_pos,
- bool over_write
- );
- int append_trx_isolation(
- spider_string *str,
- int trx_isolation
- );
- int append_autocommit(
- spider_string *str,
- bool autocommit
- );
- int append_sql_log_off(
- spider_string *str,
- bool sql_log_off
- );
- int append_time_zone(
- spider_string *str,
- Time_zone *time_zone
- );
- int append_start_transaction(
- spider_string *str
- );
- int append_xa_start(
- spider_string *str,
- XID *xid
- );
- int append_lock_table_head(
- spider_string *str
- );
- int 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
- );
- int append_lock_table_tail(
- spider_string *str
- );
- int append_unlock_table(
- spider_string *str
- );
- int open_item_func(
- Item_func *item_func,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int open_item_sum_func(
- Item_sum *item_sum,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#endif
- int append_escaped_util(
- spider_string *to,
- String *from
- );
-};
-
-class spider_db_mysql_row: public spider_db_row
-{
-public:
- MYSQL_ROW row;
- MYSQL_ROW row_first;
- ulong *lengths;
- ulong *lengths_first;
- uint field_count;
- bool cloned;
- spider_db_mysql_row();
- ~spider_db_mysql_row();
- int store_to_field(
- Field *field,
- CHARSET_INFO *access_charset
- );
- int append_to_str(
- spider_string *str
- );
- int append_escaped_to_str(
- spider_string *str,
- uint dbton_id
- );
- void first();
- void next();
- bool is_null();
- int val_int();
- double val_real();
- my_decimal *val_decimal(
- my_decimal *decimal_value,
- CHARSET_INFO *access_charset
- );
- SPIDER_DB_ROW *clone();
- int store_to_tmp_table(
- TABLE *tmp_table,
- spider_string *str
- );
-};
-
-class spider_db_mysql_result: public spider_db_result
-{
-public:
- MYSQL_RES *db_result;
- spider_db_mysql_row row;
- MYSQL_ROW_OFFSET first_row;
- int store_error_num;
- spider_db_mysql_result();
- ~spider_db_mysql_result();
- bool has_result();
- void free_result();
- SPIDER_DB_ROW *current_row();
- SPIDER_DB_ROW *fetch_row();
- SPIDER_DB_ROW *fetch_row_from_result_buffer(
- spider_db_result_buffer *spider_res_buf
- );
- SPIDER_DB_ROW *fetch_row_from_tmp_table(
- TABLE *tmp_table
- );
- int fetch_table_status(
- int mode,
- ha_rows &records,
- ulong &mean_rec_length,
- ulonglong &data_file_length,
- ulonglong &max_data_file_length,
- ulonglong &index_file_length,
- ulonglong &auto_increment_value,
- time_t &create_time,
- time_t &update_time,
- time_t &check_time
- );
- int fetch_table_records(
- int mode,
- ha_rows &records
- );
- int fetch_table_cardinality(
- int mode,
- TABLE *table,
- longlong *cardinality,
- uchar *cardinality_upd,
- int bitmap_size
- );
- int fetch_table_mon_status(
- int &status
- );
- longlong num_rows();
- uint num_fields();
- void move_to_pos(
- longlong pos
- );
- int get_errno();
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
- int fetch_columns_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
- );
- int fetch_index_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
- );
-#endif
-};
-
-class spider_db_mysql: public spider_db_conn
-{
- MYSQL *db_conn;
- int stored_error;
-public:
- HASH lock_table_hash;
- bool lock_table_hash_inited;
- uint lock_table_hash_id;
- const char *lock_table_hash_func_name;
- const char *lock_table_hash_file_name;
- ulong lock_table_hash_line_no;
- DYNAMIC_ARRAY handler_open_array;
- bool handler_open_array_inited;
- uint handler_open_array_id;
- const char *handler_open_array_func_name;
- const char *handler_open_array_file_name;
- ulong handler_open_array_line_no;
- spider_db_mysql(
- SPIDER_CONN *conn
- );
- ~spider_db_mysql();
- int init();
- bool is_connected();
- void bg_connect();
- int 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
- );
- int ping();
- void bg_disconnect();
- void disconnect();
- int set_net_timeout();
- int exec_query(
- const char *query,
- uint length,
- int quick_mode
- );
- int get_errno();
- const char *get_error();
- bool is_server_gone_error(
- int error_num
- );
- bool is_dup_entry_error(
- int error_num
- );
- bool is_xa_nota_error(
- int error_num
- );
- spider_db_result *store_result(
- spider_db_result_buffer **spider_res_buf,
- st_spider_db_request_key *request_key,
- int *error_num
- );
- spider_db_result *use_result(
- st_spider_db_request_key *request_key,
- int *error_num
- );
- int next_result();
- uint affected_rows();
- ulonglong last_insert_id();
- int set_character_set(
- const char *csname
- );
- int select_db(
- const char *dbname
- );
- int consistent_snapshot(
- int *need_mon
- );
- bool trx_start_in_bulk_sql();
- int start_transaction(
- int *need_mon
- );
- int commit(
- int *need_mon
- );
- int rollback(
- int *need_mon
- );
- bool xa_start_in_bulk_sql();
- int xa_start(
- XID *xid,
- int *need_mon
- );
- int xa_end(
- XID *xid,
- int *need_mon
- );
- int xa_prepare(
- XID *xid,
- int *need_mon
- );
- int xa_commit(
- XID *xid,
- int *need_mon
- );
- int xa_rollback(
- XID *xid,
- int *need_mon
- );
- bool set_trx_isolation_in_bulk_sql();
- int set_trx_isolation(
- int trx_isolation,
- int *need_mon
- );
- bool set_autocommit_in_bulk_sql();
- int set_autocommit(
- bool autocommit,
- int *need_mon
- );
- bool set_sql_log_off_in_bulk_sql();
- int set_sql_log_off(
- bool sql_log_off,
- int *need_mon
- );
- bool set_time_zone_in_bulk_sql();
- int set_time_zone(
- Time_zone *time_zone,
- int *need_mon
- );
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
- );
- int 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 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 append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
- );
- int 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 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
- );
- void reset_request_queue();
-#endif
- size_t escape_string(
- char *to,
- const char *from,
- size_t from_length
- );
- bool have_lock_table_list();
- int append_lock_tables(
- spider_string *str
- );
- int append_unlock_tables(
- spider_string *str
- );
- uint get_lock_table_hash_count();
- void reset_lock_table_hash();
- uint get_opened_handler_count();
- void reset_opened_handler();
- void set_dup_key_idx(
- ha_spider *spider,
- int link_idx
- );
- bool cmp_request_key_to_snd(
- st_spider_db_request_key *request_key
- );
-};
-
-class spider_mysql_share: public spider_db_share
-{
-public:
- spider_string *table_select;
- int table_select_pos;
- spider_string *key_select;
- int *key_select_pos;
- spider_string *key_hint;
- spider_string *show_table_status;
- spider_string *show_records;
- spider_string *show_index;
- spider_string *table_names_str;
- spider_string *db_names_str;
- spider_string *db_table_str;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- my_hash_value_type *db_table_str_hash_value;
-#endif
- uint table_nm_max_length;
- uint db_nm_max_length;
- spider_string *column_name_str;
- bool same_db_table_name;
- int first_all_link_idx;
-
- spider_mysql_share(
- st_spider_share *share
- );
- ~spider_mysql_share();
- int init();
- uint get_column_name_length(
- uint field_index
- );
- int append_column_name(
- spider_string *str,
- uint field_index
- );
- int append_column_name_with_alias(
- spider_string *str,
- uint field_index,
- const char *alias,
- uint alias_length
- );
- int append_table_name(
- spider_string *str,
- int all_link_idx
- );
- int append_table_name_with_adjusting(
- spider_string *str,
- int all_link_idx
- );
- int append_from_with_adjusted_table_name(
- spider_string *str,
- int *table_name_pos
- );
- bool need_change_db_table_name();
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
- int discover_table_structure(
- SPIDER_TRX *trx,
- SPIDER_SHARE *spider_share,
- spider_string *str
- );
-#endif
-private:
- int create_table_names_str();
- void free_table_names_str();
- int create_column_name_str();
- void free_column_name_str();
- int convert_key_hint_str();
- int append_show_table_status();
- void free_show_table_status();
- int append_show_records();
- void free_show_records();
- int append_show_index();
- void free_show_index();
- int append_table_select();
- int append_key_select(
- uint idx
- );
-};
-
-class spider_mysql_handler: public spider_db_handler
-{
- spider_string sql;
- spider_string sql_part;
- spider_string sql_part2;
- spider_string ha_sql;
- int where_pos;
- int order_pos;
- int limit_pos;
- int table_name_pos;
- int ha_read_pos;
- int ha_next_pos;
- int ha_where_pos;
- int ha_limit_pos;
- int ha_table_name_pos;
- uint ha_sql_handler_id;
- spider_string insert_sql;
- int insert_pos;
- int insert_table_name_pos;
- spider_string update_sql;
- TABLE *upd_tmp_tbl;
- TMP_TABLE_PARAM upd_tmp_tbl_prm;
- spider_string tmp_sql;
- int tmp_sql_pos1; /* drop db nm pos at tmp_table_join */
- int tmp_sql_pos2; /* create db nm pos at tmp_table_join */
- int tmp_sql_pos3; /* insert db nm pos at tmp_table_join */
- int tmp_sql_pos4; /* insert val pos at tmp_table_join */
- int tmp_sql_pos5; /* end of drop tbl at tmp_table_join */
- spider_string dup_update_sql;
- spider_string *exec_sql;
- spider_string *exec_insert_sql;
- spider_string *exec_update_sql;
- spider_string *exec_tmp_sql;
- spider_string *exec_ha_sql;
- bool reading_from_bulk_tmp_table;
- bool filled_up;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
-#endif
- SPIDER_INT_HLD *union_table_name_pos_first;
- SPIDER_INT_HLD *union_table_name_pos_current;
-public:
- spider_mysql_share *mysql_share;
- SPIDER_LINK_FOR_HASH *link_for_hash;
- spider_mysql_handler(
- ha_spider *spider,
- spider_mysql_share *share
- );
- ~spider_mysql_handler();
- int init();
- int append_table_name_with_adjusting(
- spider_string *str,
- int link_idx,
- ulong sql_type
- );
- int append_key_column_types(
- const key_range *start_key,
- spider_string *str
- );
- int append_key_join_columns_for_bka(
- const key_range *start_key,
- spider_string *str,
- const char **table_aliases,
- uint *table_alias_lengths
- );
- int append_tmp_table_and_sql_for_bka(
- const key_range *start_key
- );
- int reuse_tmp_table_and_sql_for_bka();
- void create_tmp_bka_table_name(
- char *tmp_table_name,
- int *tmp_table_name_length,
- int link_idx
- );
- int append_create_tmp_bka_table(
- const key_range *start_key,
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos,
- CHARSET_INFO *table_charset
- );
- int append_drop_tmp_bka_table(
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos,
- int *drop_table_end_pos,
- bool with_semicolon
- );
- int append_insert_tmp_bka_table(
- const key_range *start_key,
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos
- );
- int append_union_table_and_sql_for_bka(
- const key_range *start_key
- );
- int reuse_union_table_and_sql_for_bka();
- int append_insert_for_recovery(
- ulong sql_type,
- int link_idx
- );
- int append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
- );
- int append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
- );
- int append_insert_part();
- int append_insert(
- spider_string *str,
- int link_idx
- );
- int append_update_part();
- int append_update(
- spider_string *str,
- int link_idx
- );
- int append_delete_part();
- int append_delete(
- spider_string *str
- );
- #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_increment_update_set_part();
- int append_increment_update_set(
- spider_string *str
- );
- #endif
- #endif
- int append_update_set_part();
- int append_update_set(
- spider_string *str
- );
- #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_direct_update_set_part();
- int append_direct_update_set(
- spider_string *str
- );
- int append_dup_update_pushdown_part(
- const char *alias,
- uint alias_length
- );
- int append_update_columns_part(
- const char *alias,
- uint alias_length
- );
- int check_update_columns_part();
- int append_update_columns(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- #endif
- int append_select_part(
- ulong sql_type
- );
- int append_select(
- spider_string *str,
- ulong sql_type
- );
- int append_table_select_part(
- ulong sql_type
- );
- int append_table_select(
- spider_string *str
- );
- int append_key_select_part(
- ulong sql_type,
- uint idx
- );
- int append_key_select(
- spider_string *str,
- uint idx
- );
- int append_minimum_select_part(
- ulong sql_type
- );
- int append_minimum_select(
- spider_string *str,
- ulong sql_type
- );
- int append_table_select_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_key_select_with_alias(
- spider_string *str,
- const KEY *key_info,
- const char *alias,
- uint alias_length
- );
- int append_minimum_select_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_select_columns_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_hint_after_table_part(
- ulong sql_type
- );
- int append_hint_after_table(
- spider_string *str
- );
- void set_where_pos(
- ulong sql_type
- );
- void set_where_to_pos(
- ulong sql_type
- );
- int check_item_type(
- Item *item
- );
- int append_values_connector_part(
- ulong sql_type
- );
- int append_values_connector(
- spider_string *str
- );
- int append_values_terminator_part(
- ulong sql_type
- );
- int append_values_terminator(
- spider_string *str
- );
- int append_union_table_connector_part(
- ulong sql_type
- );
- int append_union_table_connector(
- spider_string *str
- );
- int append_union_table_terminator_part(
- ulong sql_type
- );
- int append_union_table_terminator(
- spider_string *str
- );
- int append_key_column_values_part(
- const key_range *start_key,
- ulong sql_type
- );
- int append_key_column_values(
- spider_string *str,
- const key_range *start_key
- );
- int append_key_column_values_with_name_part(
- const key_range *start_key,
- ulong sql_type
- );
- int append_key_column_values_with_name(
- spider_string *str,
- const key_range *start_key
- );
- int append_key_where_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type
- );
- int 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 append_is_null_part(
- ulong sql_type,
- KEY_PART_INFO *key_part,
- const key_range *key,
- const uchar **ptr,
- bool key_eq
- );
- int 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
- );
- int append_where_terminator_part(
- ulong sql_type,
- bool set_order,
- int key_count
- );
- int append_where_terminator(
- ulong sql_type,
- spider_string *str,
- spider_string *str_part,
- spider_string *str_part2,
- bool set_order,
- int key_count
- );
- int append_match_where_part(
- ulong sql_type
- );
- int append_match_where(
- spider_string *str
- );
- int append_update_where(
- spider_string *str,
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_condition_part(
- const char *alias,
- uint alias_length,
- ulong sql_type,
- bool test_flg
- );
- int append_condition(
- spider_string *str,
- const char *alias,
- uint alias_length,
- bool start_where,
- ulong sql_type
- );
- int append_match_against_part(
- ulong sql_type,
- st_spider_ft_info *ft_info,
- const char *alias,
- uint alias_length
- );
- int append_match_against(
- spider_string *str,
- st_spider_ft_info *ft_info,
- const char *alias,
- uint alias_length
- );
- int append_match_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
- );
- int append_match_select(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int append_sum_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
- );
- int append_sum_select(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#endif
- void set_order_pos(
- ulong sql_type
- );
- void set_order_to_pos(
- ulong sql_type
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int append_group_by(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#endif
- int append_key_order_for_merge_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_for_merge_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_key_order_for_direct_order_limit_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_for_direct_order_limit_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_key_order_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_for_handler(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_key_order_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
- );
- int reappend_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
- );
- int append_limit(
- spider_string *str,
- longlong offset,
- longlong limit
- );
- int append_select_lock_part(
- ulong sql_type
- );
- int append_select_lock(
- spider_string *str
- );
- int append_union_all_start_part(
- ulong sql_type
- );
- int append_union_all_start(
- spider_string *str
- );
- int append_union_all_part(
- ulong sql_type
- );
- int append_union_all(
- spider_string *str
- );
- int append_union_all_end_part(
- ulong sql_type
- );
- int append_union_all_end(
- spider_string *str
- );
- int append_multi_range_cnt_part(
- ulong sql_type,
- uint multi_range_cnt,
- bool with_comma
- );
- int append_multi_range_cnt(
- spider_string *str,
- uint multi_range_cnt,
- bool with_comma
- );
- int append_multi_range_cnt_with_name_part(
- ulong sql_type,
- uint multi_range_cnt
- );
- int append_multi_range_cnt_with_name(
- spider_string *str,
- uint multi_range_cnt
- );
- int append_open_handler_part(
- ulong sql_type,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_open_handler(
- spider_string *str,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_close_handler_part(
- ulong sql_type,
- int link_idx
- );
- int append_close_handler(
- spider_string *str,
- int link_idx
- );
- int append_insert_terminator_part(
- ulong sql_type
- );
- int append_insert_terminator(
- spider_string *str
- );
- int append_insert_values_part(
- ulong sql_type
- );
- int append_insert_values(
- spider_string *str
- );
- int append_into_part(
- ulong sql_type
- );
- int append_into(
- spider_string *str
- );
- void set_insert_to_pos(
- ulong sql_type
- );
- int append_from_part(
- ulong sql_type,
- int link_idx
- );
- int append_from(
- spider_string *str,
- ulong sql_type,
- int link_idx
- );
- int append_flush_tables_part(
- ulong sql_type,
- int link_idx,
- bool lock
- );
- int append_flush_tables(
- spider_string *str,
- int link_idx,
- bool lock
- );
- int append_optimize_table_part(
- ulong sql_type,
- int link_idx
- );
- int append_optimize_table(
- spider_string *str,
- int link_idx
- );
- int append_analyze_table_part(
- ulong sql_type,
- int link_idx
- );
- int append_analyze_table(
- spider_string *str,
- int link_idx
- );
- int append_repair_table_part(
- ulong sql_type,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int append_repair_table(
- spider_string *str,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int append_check_table_part(
- ulong sql_type,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int append_check_table(
- spider_string *str,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int append_enable_keys_part(
- ulong sql_type,
- int link_idx
- );
- int append_enable_keys(
- spider_string *str,
- int link_idx
- );
- int append_disable_keys_part(
- ulong sql_type,
- int link_idx
- );
- int append_disable_keys(
- spider_string *str,
- int link_idx
- );
- int append_delete_all_rows_part(
- ulong sql_type
- );
- int append_delete_all_rows(
- spider_string *str,
- ulong sql_type
- );
- int append_truncate(
- spider_string *str,
- ulong sql_type,
- int link_idx
- );
- int append_explain_select_part(
- key_range *start_key,
- key_range *end_key,
- ulong sql_type,
- int link_idx
- );
- int append_explain_select(
- spider_string *str,
- key_range *start_key,
- key_range *end_key,
- ulong sql_type,
- int link_idx
- );
- bool is_bulk_insert_exec_period(
- bool bulk_end
- );
- bool sql_is_filled_up(
- ulong sql_type
- );
- bool sql_is_empty(
- ulong sql_type
- );
- bool support_multi_split_read();
- bool support_bulk_update();
- int bulk_tmp_table_insert();
- int bulk_tmp_table_insert(
- int link_idx
- );
- int bulk_tmp_table_end_bulk_insert();
- int bulk_tmp_table_rnd_init();
- int bulk_tmp_table_rnd_next();
- int bulk_tmp_table_rnd_end();
- bool need_copy_for_update(
- int link_idx
- );
- bool bulk_tmp_table_created();
- int mk_bulk_tmp_table_and_bulk_start();
- void rm_bulk_tmp_table();
- int store_sql_to_bulk_tmp_table(
- spider_string *str,
- TABLE *tmp_table
- );
- int restore_sql_from_bulk_tmp_table(
- spider_string *str,
- TABLE *tmp_table
- );
- int insert_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx,
- int *appended
- );
- int realloc_sql(
- ulong *realloced
- );
- int reset_sql(
- ulong sql_type
- );
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int reset_keys(
- ulong sql_type
- );
- int reset_upds(
- ulong sql_type
- );
- int reset_strs(
- ulong sql_type
- );
- int reset_strs_pos(
- ulong sql_type
- );
- int push_back_upds(
- SPIDER_HS_STRING_REF &info
- );
-#endif
- bool need_lock_before_set_sql_for_exec(
- ulong sql_type
- );
- int set_sql_for_exec(
- ulong sql_type,
- int link_idx
- );
- int set_sql_for_exec(
- spider_db_copy_table *tgt_ct,
- ulong sql_type
- );
- int execute_sql(
- ulong sql_type,
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
- );
- int reset();
- int sts_mode_exchange(
- int sts_mode
- );
- int show_table_status(
- int link_idx,
- int sts_mode,
- uint flag
- );
- int crd_mode_exchange(
- int crd_mode
- );
- int show_index(
- int link_idx,
- int crd_mode
- );
- int show_records(
- int link_idx
- );
- int show_last_insert_id(
- int link_idx,
- ulonglong &last_insert_id
- );
- ha_rows explain_select(
- key_range *start_key,
- key_range *end_key,
- int link_idx
- );
- int lock_tables(
- int link_idx
- );
- int unlock_tables(
- int link_idx
- );
- int disable_keys(
- SPIDER_CONN *conn,
- int link_idx
- );
- int enable_keys(
- SPIDER_CONN *conn,
- int link_idx
- );
- int check_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int repair_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int analyze_table(
- SPIDER_CONN *conn,
- int link_idx
- );
- int optimize_table(
- SPIDER_CONN *conn,
- int link_idx
- );
- int flush_tables(
- SPIDER_CONN *conn,
- int link_idx,
- bool lock
- );
- int flush_logs(
- SPIDER_CONN *conn,
- int link_idx
- );
- int insert_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
- );
- int delete_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
- );
- int sync_from_clone_source(
- spider_db_handler *dbton_hdl
- );
- bool support_use_handler(
- int use_handler
- );
- bool minimum_select_bit_is_set(
- uint field_index
- );
- void copy_minimum_select_bitmap(
- uchar *bitmap
- );
- int init_union_table_name_pos();
- int set_union_table_name_pos();
- int reset_union_table_name(
- spider_string *str,
- int link_idx,
- ulong sql_type
- );
-};
-
-class spider_mysql_copy_table: public spider_db_copy_table
-{
-public:
- spider_mysql_share *mysql_share;
- spider_string sql;
- uint pos;
- spider_mysql_copy_table(
- spider_mysql_share *db_share
- );
- ~spider_mysql_copy_table();
- int init();
- void set_sql_charset(
- CHARSET_INFO *cs
- );
- int append_select_str();
- int append_insert_str(
- int insert_flg
- );
- int append_table_columns(
- TABLE_SHARE *table_share
- );
- int append_from_str();
- int append_table_name(
- int link_idx
- );
- void set_sql_pos();
- void set_sql_to_pos();
- int append_copy_where(
- spider_db_copy_table *source_ct,
- KEY *key_info,
- ulong *last_row_pos,
- ulong *last_lengths
- );
- int append_key_order_str(
- KEY *key_info,
- int start_pos,
- bool desc_flg
- );
- int append_limit(
- longlong offset,
- longlong limit
- );
- int append_into_str();
- int append_open_paren_str();
- int append_values_str();
- int append_select_lock_str(
- int lock_mode
- );
- int exec_query(
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
- );
- int copy_key_row(
- spider_db_copy_table *source_ct,
- Field *field,
- ulong *row_pos,
- ulong *length,
- const char *joint_str,
- const int joint_length
- );
- int copy_row(
- Field *field,
- SPIDER_DB_ROW *row
- );
- int copy_rows(
- TABLE *table,
- SPIDER_DB_ROW *row,
- ulong **last_row_pos,
- ulong **last_lengths
- );
- int copy_rows(
- TABLE *table,
- SPIDER_DB_ROW *row
- );
- int append_insert_terminator();
- int copy_insert_values(
- spider_db_copy_table *source_ct
- );
-};
+/* Copyright (C) 2012-2014 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+class spider_db_mysql_util: public spider_db_util
+{
+public:
+ spider_db_mysql_util();
+ ~spider_db_mysql_util();
+ int append_name(
+ spider_string *str,
+ const char *name,
+ uint name_length
+ );
+ int append_name_with_charset(
+ spider_string *str,
+ const char *name,
+ uint name_length,
+ CHARSET_INFO *name_charset
+ );
+ bool is_name_quote(
+ const char head_code
+ );
+ int append_escaped_name_quote(
+ spider_string *str
+ );
+ int append_column_value(
+ ha_spider *spider,
+ spider_string *str,
+ Field *field,
+ const uchar *new_ptr,
+ CHARSET_INFO *access_charset
+ );
+ int append_from_with_alias(
+ spider_string *str,
+ const char **table_names,
+ uint *table_name_lengths,
+ const char **table_aliases,
+ uint *table_alias_lengths,
+ uint table_count,
+ int *table_name_pos,
+ bool over_write
+ );
+ int append_trx_isolation(
+ spider_string *str,
+ int trx_isolation
+ );
+ int append_autocommit(
+ spider_string *str,
+ bool autocommit
+ );
+ int append_sql_log_off(
+ spider_string *str,
+ bool sql_log_off
+ );
+ int append_time_zone(
+ spider_string *str,
+ Time_zone *time_zone
+ );
+ int append_start_transaction(
+ spider_string *str
+ );
+ int append_xa_start(
+ spider_string *str,
+ XID *xid
+ );
+ int append_lock_table_head(
+ spider_string *str
+ );
+ int 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
+ );
+ int append_lock_table_tail(
+ spider_string *str
+ );
+ int append_unlock_table(
+ spider_string *str
+ );
+ int open_item_func(
+ Item_func *item_func,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
+ int append_escaped_util(
+ spider_string *to,
+ String *from
+ );
+};
+
+class spider_db_mysql_row: public spider_db_row
+{
+public:
+ MYSQL_ROW row;
+ MYSQL_ROW row_first;
+ ulong *lengths;
+ ulong *lengths_first;
+ uint field_count;
+ bool cloned;
+ spider_db_mysql_row();
+ ~spider_db_mysql_row();
+ int store_to_field(
+ Field *field,
+ CHARSET_INFO *access_charset
+ );
+ int append_to_str(
+ spider_string *str
+ );
+ int append_escaped_to_str(
+ spider_string *str,
+ uint dbton_id
+ );
+ void first();
+ void next();
+ bool is_null();
+ int val_int();
+ double val_real();
+ my_decimal *val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+ );
+ SPIDER_DB_ROW *clone();
+ int store_to_tmp_table(
+ TABLE *tmp_table,
+ spider_string *str
+ );
+};
+
+class spider_db_mysql_result: public spider_db_result
+{
+public:
+ MYSQL_RES *db_result;
+ spider_db_mysql_row row;
+ MYSQL_ROW_OFFSET first_row;
+ int store_error_num;
+ spider_db_mysql_result();
+ ~spider_db_mysql_result();
+ bool has_result();
+ void free_result();
+ SPIDER_DB_ROW *current_row();
+ SPIDER_DB_ROW *fetch_row();
+ SPIDER_DB_ROW *fetch_row_from_result_buffer(
+ spider_db_result_buffer *spider_res_buf
+ );
+ SPIDER_DB_ROW *fetch_row_from_tmp_table(
+ TABLE *tmp_table
+ );
+ int fetch_table_status(
+ int mode,
+ ha_rows &records,
+ ulong &mean_rec_length,
+ ulonglong &data_file_length,
+ ulonglong &max_data_file_length,
+ ulonglong &index_file_length,
+ ulonglong &auto_increment_value,
+ time_t &create_time,
+ time_t &update_time,
+ time_t &check_time
+ );
+ int fetch_table_records(
+ int mode,
+ ha_rows &records
+ );
+ int fetch_table_cardinality(
+ int mode,
+ TABLE *table,
+ longlong *cardinality,
+ uchar *cardinality_upd,
+ int bitmap_size
+ );
+ int fetch_table_mon_status(
+ int &status
+ );
+ longlong num_rows();
+ uint num_fields();
+ void move_to_pos(
+ longlong pos
+ );
+ int get_errno();
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+ int fetch_columns_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+ );
+ int fetch_index_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+ );
+#endif
+};
+
+class spider_db_mysql: public spider_db_conn
+{
+ MYSQL *db_conn;
+ int stored_error;
+public:
+ HASH lock_table_hash;
+ bool lock_table_hash_inited;
+ uint lock_table_hash_id;
+ const char *lock_table_hash_func_name;
+ const char *lock_table_hash_file_name;
+ ulong lock_table_hash_line_no;
+ DYNAMIC_ARRAY handler_open_array;
+ bool handler_open_array_inited;
+ uint handler_open_array_id;
+ const char *handler_open_array_func_name;
+ const char *handler_open_array_file_name;
+ ulong handler_open_array_line_no;
+ spider_db_mysql(
+ SPIDER_CONN *conn
+ );
+ ~spider_db_mysql();
+ int init();
+ bool is_connected();
+ void bg_connect();
+ int 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
+ );
+ int ping();
+ void bg_disconnect();
+ void disconnect();
+ int set_net_timeout();
+ int exec_query(
+ const char *query,
+ uint length,
+ int quick_mode
+ );
+ int get_errno();
+ const char *get_error();
+ bool is_server_gone_error(
+ int error_num
+ );
+ bool is_dup_entry_error(
+ int error_num
+ );
+ bool is_xa_nota_error(
+ int error_num
+ );
+ void print_warnings(
+ struct tm *l_time
+ );
+ spider_db_result *store_result(
+ spider_db_result_buffer **spider_res_buf,
+ st_spider_db_request_key *request_key,
+ int *error_num
+ );
+ spider_db_result *use_result(
+ st_spider_db_request_key *request_key,
+ int *error_num
+ );
+ int next_result();
+ uint affected_rows();
+ ulonglong last_insert_id();
+ int set_character_set(
+ const char *csname
+ );
+ int select_db(
+ const char *dbname
+ );
+ int consistent_snapshot(
+ int *need_mon
+ );
+ bool trx_start_in_bulk_sql();
+ int start_transaction(
+ int *need_mon
+ );
+ int commit(
+ int *need_mon
+ );
+ int rollback(
+ int *need_mon
+ );
+ bool xa_start_in_bulk_sql();
+ int xa_start(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_end(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_prepare(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_commit(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_rollback(
+ XID *xid,
+ int *need_mon
+ );
+ bool set_trx_isolation_in_bulk_sql();
+ int set_trx_isolation(
+ int trx_isolation,
+ int *need_mon
+ );
+ bool set_autocommit_in_bulk_sql();
+ int set_autocommit(
+ bool autocommit,
+ int *need_mon
+ );
+ bool set_sql_log_off_in_bulk_sql();
+ int set_sql_log_off(
+ bool sql_log_off,
+ int *need_mon
+ );
+ bool set_time_zone_in_bulk_sql();
+ int set_time_zone(
+ Time_zone *time_zone,
+ int *need_mon
+ );
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ int append_sql(
+ char *sql,
+ ulong sql_length,
+ st_spider_db_request_key *request_key
+ );
+ int 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 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 append_insert(
+ uint handler_id,
+ SPIDER_DB_HS_STRING_REF_BUFFER *upds,
+ st_spider_db_request_key *request_key
+ );
+ int 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 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
+ );
+ void reset_request_queue();
+#endif
+ size_t escape_string(
+ char *to,
+ const char *from,
+ size_t from_length
+ );
+ bool have_lock_table_list();
+ int append_lock_tables(
+ spider_string *str
+ );
+ int append_unlock_tables(
+ spider_string *str
+ );
+ uint get_lock_table_hash_count();
+ void reset_lock_table_hash();
+ uint get_opened_handler_count();
+ void reset_opened_handler();
+ void set_dup_key_idx(
+ ha_spider *spider,
+ int link_idx
+ );
+ bool cmp_request_key_to_snd(
+ st_spider_db_request_key *request_key
+ );
+};
+
+class spider_mysql_share: public spider_db_share
+{
+public:
+ spider_string *table_select;
+ int table_select_pos;
+ spider_string *key_select;
+ int *key_select_pos;
+ spider_string *key_hint;
+ spider_string *show_table_status;
+ spider_string *show_records;
+ spider_string *show_index;
+ spider_string *table_names_str;
+ spider_string *db_names_str;
+ spider_string *db_table_str;
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ my_hash_value_type *db_table_str_hash_value;
+#endif
+ uint table_nm_max_length;
+ uint db_nm_max_length;
+ spider_string *column_name_str;
+ bool same_db_table_name;
+ int first_all_link_idx;
+
+ spider_mysql_share(
+ st_spider_share *share
+ );
+ ~spider_mysql_share();
+ int init();
+ uint get_column_name_length(
+ uint field_index
+ );
+ int append_column_name(
+ spider_string *str,
+ uint field_index
+ );
+ int append_column_name_with_alias(
+ spider_string *str,
+ uint field_index,
+ const char *alias,
+ uint alias_length
+ );
+ int append_table_name(
+ spider_string *str,
+ int all_link_idx
+ );
+ int append_table_name_with_adjusting(
+ spider_string *str,
+ int all_link_idx
+ );
+ int append_from_with_adjusted_table_name(
+ spider_string *str,
+ int *table_name_pos
+ );
+ bool need_change_db_table_name();
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+ int discover_table_structure(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *spider_share,
+ spider_string *str
+ );
+#endif
+private:
+ int create_table_names_str();
+ void free_table_names_str();
+ int create_column_name_str();
+ void free_column_name_str();
+ int convert_key_hint_str();
+ int append_show_table_status();
+ void free_show_table_status();
+ int append_show_records();
+ void free_show_records();
+ int append_show_index();
+ void free_show_index();
+ int append_table_select();
+ int append_key_select(
+ uint idx
+ );
+};
+
+class spider_mysql_handler: public spider_db_handler
+{
+ spider_string sql;
+ spider_string sql_part;
+ spider_string sql_part2;
+ spider_string ha_sql;
+ int where_pos;
+ int order_pos;
+ int limit_pos;
+ int table_name_pos;
+ int ha_read_pos;
+ int ha_next_pos;
+ int ha_where_pos;
+ int ha_limit_pos;
+ int ha_table_name_pos;
+ uint ha_sql_handler_id;
+ spider_string insert_sql;
+ int insert_pos;
+ int insert_table_name_pos;
+ spider_string update_sql;
+ TABLE *upd_tmp_tbl;
+ TMP_TABLE_PARAM upd_tmp_tbl_prm;
+ spider_string tmp_sql;
+ int tmp_sql_pos1; /* drop db nm pos at tmp_table_join */
+ int tmp_sql_pos2; /* create db nm pos at tmp_table_join */
+ int tmp_sql_pos3; /* insert db nm pos at tmp_table_join */
+ int tmp_sql_pos4; /* insert val pos at tmp_table_join */
+ int tmp_sql_pos5; /* end of drop tbl at tmp_table_join */
+ spider_string dup_update_sql;
+ spider_string *exec_sql;
+ spider_string *exec_insert_sql;
+ spider_string *exec_update_sql;
+ spider_string *exec_tmp_sql;
+ spider_string *exec_ha_sql;
+ bool reading_from_bulk_tmp_table;
+ bool filled_up;
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
+#endif
+ SPIDER_INT_HLD *union_table_name_pos_first;
+ SPIDER_INT_HLD *union_table_name_pos_current;
+public:
+ spider_mysql_share *mysql_share;
+ SPIDER_LINK_FOR_HASH *link_for_hash;
+ uchar *minimum_select_bitmap;
+ spider_mysql_handler(
+ ha_spider *spider,
+ spider_mysql_share *share
+ );
+ ~spider_mysql_handler();
+ int init();
+ int append_table_name_with_adjusting(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ );
+ int append_key_column_types(
+ const key_range *start_key,
+ spider_string *str
+ );
+ int append_key_join_columns_for_bka(
+ const key_range *start_key,
+ spider_string *str,
+ const char **table_aliases,
+ uint *table_alias_lengths
+ );
+ int append_tmp_table_and_sql_for_bka(
+ const key_range *start_key
+ );
+ int reuse_tmp_table_and_sql_for_bka();
+ void create_tmp_bka_table_name(
+ char *tmp_table_name,
+ int *tmp_table_name_length,
+ int link_idx
+ );
+ int append_create_tmp_bka_table(
+ const key_range *start_key,
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos,
+ CHARSET_INFO *table_charset
+ );
+ int append_drop_tmp_bka_table(
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos,
+ int *drop_table_end_pos,
+ bool with_semicolon
+ );
+ int append_insert_tmp_bka_table(
+ const key_range *start_key,
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos
+ );
+ int append_union_table_and_sql_for_bka(
+ const key_range *start_key
+ );
+ int reuse_union_table_and_sql_for_bka();
+ int append_insert_for_recovery(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+ );
+ int append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+ );
+ int append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+ );
+ int append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+ );
+ int append_insert_part();
+ int append_insert(
+ spider_string *str,
+ int link_idx
+ );
+ int append_update_part();
+ int append_update(
+ spider_string *str,
+ int link_idx
+ );
+ int append_delete_part();
+ int append_delete(
+ spider_string *str
+ );
+ #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ int append_increment_update_set_part();
+ int append_increment_update_set(
+ spider_string *str
+ );
+ #endif
+ #endif
+ int append_update_set_part();
+ int append_update_set(
+ spider_string *str
+ );
+ #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ int append_direct_update_set_part();
+ int append_direct_update_set(
+ spider_string *str
+ );
+ int append_dup_update_pushdown_part(
+ const char *alias,
+ uint alias_length
+ );
+ int append_update_columns_part(
+ const char *alias,
+ uint alias_length
+ );
+ int check_update_columns_part();
+ int append_update_columns(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ #endif
+ int append_select_part(
+ ulong sql_type
+ );
+ int append_select(
+ spider_string *str,
+ ulong sql_type
+ );
+ int append_table_select_part(
+ ulong sql_type
+ );
+ int append_table_select(
+ spider_string *str
+ );
+ int append_key_select_part(
+ ulong sql_type,
+ uint idx
+ );
+ int append_key_select(
+ spider_string *str,
+ uint idx
+ );
+ int append_minimum_select_part(
+ ulong sql_type
+ );
+ int append_minimum_select(
+ spider_string *str,
+ ulong sql_type
+ );
+ int append_table_select_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_key_select_with_alias(
+ spider_string *str,
+ const KEY *key_info,
+ const char *alias,
+ uint alias_length
+ );
+ int append_minimum_select_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_select_columns_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_hint_after_table_part(
+ ulong sql_type
+ );
+ int append_hint_after_table(
+ spider_string *str
+ );
+ void set_where_pos(
+ ulong sql_type
+ );
+ void set_where_to_pos(
+ ulong sql_type
+ );
+ int check_item_type(
+ Item *item
+ );
+ int append_values_connector_part(
+ ulong sql_type
+ );
+ int append_values_connector(
+ spider_string *str
+ );
+ int append_values_terminator_part(
+ ulong sql_type
+ );
+ int append_values_terminator(
+ spider_string *str
+ );
+ int append_union_table_connector_part(
+ ulong sql_type
+ );
+ int append_union_table_connector(
+ spider_string *str
+ );
+ int append_union_table_terminator_part(
+ ulong sql_type
+ );
+ int append_union_table_terminator(
+ spider_string *str
+ );
+ int append_key_column_values_part(
+ const key_range *start_key,
+ ulong sql_type
+ );
+ int append_key_column_values(
+ spider_string *str,
+ const key_range *start_key
+ );
+ int append_key_column_values_with_name_part(
+ const key_range *start_key,
+ ulong sql_type
+ );
+ int append_key_column_values_with_name(
+ spider_string *str,
+ const key_range *start_key
+ );
+ int append_key_where_part(
+ const key_range *start_key,
+ const key_range *end_key,
+ ulong sql_type
+ );
+ int 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 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 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
+ );
+ int append_where_terminator_part(
+ ulong sql_type,
+ bool set_order,
+ int key_count
+ );
+ int append_where_terminator(
+ ulong sql_type,
+ spider_string *str,
+ spider_string *str_part,
+ spider_string *str_part2,
+ bool set_order,
+ int key_count
+ );
+ int append_match_where_part(
+ ulong sql_type
+ );
+ int append_match_where(
+ spider_string *str
+ );
+ int append_update_where(
+ spider_string *str,
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+ );
+ int append_condition_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type,
+ bool test_flg
+ );
+ int append_condition(
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool start_where,
+ ulong sql_type
+ );
+ int append_match_against_part(
+ ulong sql_type,
+ st_spider_ft_info *ft_info,
+ const char *alias,
+ uint alias_length
+ );
+ int append_match_against(
+ spider_string *str,
+ st_spider_ft_info *ft_info,
+ const char *alias,
+ uint alias_length
+ );
+ int append_match_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+ int append_match_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+ int append_sum_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
+ void set_order_pos(
+ ulong sql_type
+ );
+ void set_order_to_pos(
+ ulong sql_type
+ );
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_group_by_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_group_by(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
+ int append_key_order_for_merge_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_key_order_for_merge_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_key_order_for_direct_order_limit_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_key_order_for_direct_order_limit_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_key_order_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_key_order_for_handler(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_key_order_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+ );
+ int reappend_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+ );
+ int append_limit(
+ spider_string *str,
+ longlong offset,
+ longlong limit
+ );
+ int append_select_lock_part(
+ ulong sql_type
+ );
+ int append_select_lock(
+ spider_string *str
+ );
+ int append_union_all_start_part(
+ ulong sql_type
+ );
+ int append_union_all_start(
+ spider_string *str
+ );
+ int append_union_all_part(
+ ulong sql_type
+ );
+ int append_union_all(
+ spider_string *str
+ );
+ int append_union_all_end_part(
+ ulong sql_type
+ );
+ int append_union_all_end(
+ spider_string *str
+ );
+ int append_multi_range_cnt_part(
+ ulong sql_type,
+ uint multi_range_cnt,
+ bool with_comma
+ );
+ int append_multi_range_cnt(
+ spider_string *str,
+ uint multi_range_cnt,
+ bool with_comma
+ );
+ int append_multi_range_cnt_with_name_part(
+ ulong sql_type,
+ uint multi_range_cnt
+ );
+ int append_multi_range_cnt_with_name(
+ spider_string *str,
+ uint multi_range_cnt
+ );
+ int append_open_handler_part(
+ ulong sql_type,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int append_open_handler(
+ spider_string *str,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int append_close_handler_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_close_handler(
+ spider_string *str,
+ int link_idx
+ );
+ int append_insert_terminator_part(
+ ulong sql_type
+ );
+ int append_insert_terminator(
+ spider_string *str
+ );
+ int append_insert_values_part(
+ ulong sql_type
+ );
+ int append_insert_values(
+ spider_string *str
+ );
+ int append_into_part(
+ ulong sql_type
+ );
+ int append_into(
+ spider_string *str
+ );
+ void set_insert_to_pos(
+ ulong sql_type
+ );
+ int append_from_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_from(
+ spider_string *str,
+ ulong sql_type,
+ int link_idx
+ );
+ int append_flush_tables_part(
+ ulong sql_type,
+ int link_idx,
+ bool lock
+ );
+ int append_flush_tables(
+ spider_string *str,
+ int link_idx,
+ bool lock
+ );
+ int append_optimize_table_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_optimize_table(
+ spider_string *str,
+ int link_idx
+ );
+ int append_analyze_table_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_analyze_table(
+ spider_string *str,
+ int link_idx
+ );
+ int append_repair_table_part(
+ ulong sql_type,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int append_repair_table(
+ spider_string *str,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int append_check_table_part(
+ ulong sql_type,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int append_check_table(
+ spider_string *str,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int append_enable_keys_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_enable_keys(
+ spider_string *str,
+ int link_idx
+ );
+ int append_disable_keys_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_disable_keys(
+ spider_string *str,
+ int link_idx
+ );
+ int append_delete_all_rows_part(
+ ulong sql_type
+ );
+ int append_delete_all_rows(
+ spider_string *str,
+ ulong sql_type
+ );
+ int append_truncate(
+ spider_string *str,
+ ulong sql_type,
+ int link_idx
+ );
+ int append_explain_select_part(
+ key_range *start_key,
+ key_range *end_key,
+ ulong sql_type,
+ int link_idx
+ );
+ int append_explain_select(
+ spider_string *str,
+ key_range *start_key,
+ key_range *end_key,
+ ulong sql_type,
+ int link_idx
+ );
+ bool is_bulk_insert_exec_period(
+ bool bulk_end
+ );
+ bool sql_is_filled_up(
+ ulong sql_type
+ );
+ bool sql_is_empty(
+ ulong sql_type
+ );
+ bool support_multi_split_read();
+ bool support_bulk_update();
+ int bulk_tmp_table_insert();
+ int bulk_tmp_table_insert(
+ int link_idx
+ );
+ int bulk_tmp_table_end_bulk_insert();
+ int bulk_tmp_table_rnd_init();
+ int bulk_tmp_table_rnd_next();
+ int bulk_tmp_table_rnd_end();
+ bool need_copy_for_update(
+ int link_idx
+ );
+ bool bulk_tmp_table_created();
+ int mk_bulk_tmp_table_and_bulk_start();
+ void rm_bulk_tmp_table();
+ int store_sql_to_bulk_tmp_table(
+ spider_string *str,
+ TABLE *tmp_table
+ );
+ int restore_sql_from_bulk_tmp_table(
+ spider_string *str,
+ TABLE *tmp_table
+ );
+ int insert_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int append_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx,
+ int *appended
+ );
+ int realloc_sql(
+ ulong *realloced
+ );
+ int reset_sql(
+ ulong sql_type
+ );
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ int reset_keys(
+ ulong sql_type
+ );
+ int reset_upds(
+ ulong sql_type
+ );
+ int reset_strs(
+ ulong sql_type
+ );
+ int reset_strs_pos(
+ ulong sql_type
+ );
+ int push_back_upds(
+ SPIDER_HS_STRING_REF &info
+ );
+#endif
+ bool need_lock_before_set_sql_for_exec(
+ ulong sql_type
+ );
+ int set_sql_for_exec(
+ ulong sql_type,
+ int link_idx
+ );
+ int set_sql_for_exec(
+ spider_db_copy_table *tgt_ct,
+ ulong sql_type
+ );
+ int execute_sql(
+ ulong sql_type,
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+ );
+ int reset();
+ int sts_mode_exchange(
+ int sts_mode
+ );
+ int show_table_status(
+ int link_idx,
+ int sts_mode,
+ uint flag
+ );
+ int crd_mode_exchange(
+ int crd_mode
+ );
+ int show_index(
+ int link_idx,
+ int crd_mode
+ );
+ int show_records(
+ int link_idx
+ );
+ int show_last_insert_id(
+ int link_idx,
+ ulonglong &last_insert_id
+ );
+ ha_rows explain_select(
+ key_range *start_key,
+ key_range *end_key,
+ int link_idx
+ );
+ int lock_tables(
+ int link_idx
+ );
+ int unlock_tables(
+ int link_idx
+ );
+ int disable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int enable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int check_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int repair_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int analyze_table(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int optimize_table(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int flush_tables(
+ SPIDER_CONN *conn,
+ int link_idx,
+ bool lock
+ );
+ int flush_logs(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int insert_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int delete_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int sync_from_clone_source(
+ spider_db_handler *dbton_hdl
+ );
+ bool support_use_handler(
+ int use_handler
+ );
+ void minimum_select_bitmap_create();
+ bool minimum_select_bit_is_set(
+ uint field_index
+ );
+ void copy_minimum_select_bitmap(
+ uchar *bitmap
+ );
+ int init_union_table_name_pos();
+ int set_union_table_name_pos();
+ int reset_union_table_name(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ );
+};
+
+class spider_mysql_copy_table: public spider_db_copy_table
+{
+public:
+ spider_mysql_share *mysql_share;
+ spider_string sql;
+ uint pos;
+ spider_mysql_copy_table(
+ spider_mysql_share *db_share
+ );
+ ~spider_mysql_copy_table();
+ int init();
+ void set_sql_charset(
+ CHARSET_INFO *cs
+ );
+ int append_select_str();
+ int append_insert_str(
+ int insert_flg
+ );
+ int append_table_columns(
+ TABLE_SHARE *table_share
+ );
+ int append_from_str();
+ int append_table_name(
+ int link_idx
+ );
+ void set_sql_pos();
+ void set_sql_to_pos();
+ int append_copy_where(
+ spider_db_copy_table *source_ct,
+ KEY *key_info,
+ ulong *last_row_pos,
+ ulong *last_lengths
+ );
+ int append_key_order_str(
+ KEY *key_info,
+ int start_pos,
+ bool desc_flg
+ );
+ int append_limit(
+ longlong offset,
+ longlong limit
+ );
+ int append_into_str();
+ int append_open_paren_str();
+ int append_values_str();
+ int append_select_lock_str(
+ int lock_mode
+ );
+ int exec_query(
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+ );
+ int copy_key_row(
+ spider_db_copy_table *source_ct,
+ Field *field,
+ ulong *row_pos,
+ ulong *length,
+ const char *joint_str,
+ const int joint_length
+ );
+ int copy_row(
+ Field *field,
+ SPIDER_DB_ROW *row
+ );
+ int copy_rows(
+ TABLE *table,
+ SPIDER_DB_ROW *row,
+ ulong **last_row_pos,
+ ulong **last_lengths
+ );
+ int copy_rows(
+ TABLE *table,
+ SPIDER_DB_ROW *row
+ );
+ int append_insert_terminator();
+ int copy_insert_values(
+ spider_db_copy_table *source_ct
+ );
+};
diff --git a/storage/spider/spd_db_oracle.cc b/storage/spider/spd_db_oracle.cc
index 9631f6505d5..9ebf42859a7 100644
--- a/storage/spider/spd_db_oracle.cc
+++ b/storage/spider/spd_db_oracle.cc
@@ -1,12421 +1,12538 @@
-/* Copyright (C) 2012-2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-#define MYSQL_SERVER 1
-#include "mysql_version.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_partition.h"
-#include "sql_analyse.h"
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-#include "sql_select.h"
-#endif
-#endif
-
-#ifdef HAVE_ORACLE_OCI
-#include <oci.h>
-#include "spd_err.h"
-#include "spd_param.h"
-#include "spd_db_include.h"
-#include "spd_include.h"
-#include "spd_db_oracle.h"
-#include "ha_spider.h"
-#include "spd_conn.h"
-#include "spd_db_conn.h"
-#include "spd_malloc.h"
-#include "spd_sys_table.h"
-#include "spd_table.h"
-
-extern struct charset_info_st *spd_charset_utf8_bin;
-
-extern handlerton *spider_hton_ptr;
-extern pthread_mutex_t spider_open_conn_mutex;
-extern HASH spider_open_connections;
-extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
-extern const char spider_dig_upper[];
-
-#define SPIDER_DB_WRAPPER_ORACLE "oracle"
-
-#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_ISO_READ_COMMITTED_STR "set transaction isolation level read committed"
-#define SPIDER_SQL_ISO_READ_COMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_COMMITTED_STR) - 1
-#define SPIDER_SQL_ISO_SERIALIZABLE_STR "set transaction isolation level serializable"
-#define SPIDER_SQL_ISO_SERIALIZABLE_LEN sizeof(SPIDER_SQL_ISO_SERIALIZABLE_STR) - 1
-
-#define SPIDER_SQL_START_TRANSACTION_STR "set transaction read write"
-#define SPIDER_SQL_START_TRANSACTION_LEN sizeof(SPIDER_SQL_START_TRANSACTION_STR) - 1
-
-#define SPIDER_SQL_AUTOCOMMIT_OFF_STR "set autocommit off"
-#define SPIDER_SQL_AUTOCOMMIT_OFF_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_OFF_STR) - 1
-#define SPIDER_SQL_AUTOCOMMIT_ON_STR "set autocommit on"
-#define SPIDER_SQL_AUTOCOMMIT_ON_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_ON_STR) - 1
-
-#define SPIDER_SQL_LOCK_TABLE_STR "lock table "
-#define SPIDER_SQL_LOCK_TABLE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_STR) - 1)
-#define SPIDER_SQL_UNLOCK_TABLE_STR "unlock tables"
-#define SPIDER_SQL_UNLOCK_TABLE_LEN (sizeof(SPIDER_SQL_UNLOCK_TABLE_STR) - 1)
-#define SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR " in share mode"
-#define SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR) - 1)
-#define SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR " in exclusive mode"
-#define SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR) - 1)
-
-#define SPIDER_SQL_COMMIT_STR "commit"
-#define SPIDER_SQL_COMMIT_LEN sizeof(SPIDER_SQL_COMMIT_STR) - 1
-
-#define SPIDER_SQL_SET_NLS_DATE_FORMAT_STR "alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'"
-#define SPIDER_SQL_SET_NLS_DATE_FORMAT_LEN sizeof(SPIDER_SQL_SET_NLS_DATE_FORMAT_STR) - 1
-#define SPIDER_SQL_SET_NLS_TIME_FORMAT_STR "alter session set nls_time_format='HH24:MI:SSXFF'"
-#define SPIDER_SQL_SET_NLS_TIME_FORMAT_LEN sizeof(SPIDER_SQL_SET_NLS_TIME_FORMAT_STR) - 1
-#define SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_STR "alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SSXFF'"
-#define SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_LEN sizeof(SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_STR) - 1
-
-#define SPIDER_SQL_SELECT_WRAPPER_HEAD_STR "select * from ("
-#define SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN sizeof(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR) - 1
-#define SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR " where rowid in (select rowid from (select rowid, row_number() over (order by "
-#define SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN sizeof(SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR) - 1
-#define SPIDER_SQL_ROW_NUMBER_HEAD_STR ", row_number() over (order by "
-#define SPIDER_SQL_ROW_NUMBER_HEAD_LEN sizeof(SPIDER_SQL_ROW_NUMBER_HEAD_STR) - 1
-#define SPIDER_SQL_ROW_NUMBER_TAIL_STR "rowid) row_num"
-#define SPIDER_SQL_ROW_NUMBER_TAIL_LEN sizeof(SPIDER_SQL_ROW_NUMBER_TAIL_STR) - 1
-#define SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR "rowid desc) row_num"
-#define SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN sizeof(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR) - 1
-#define SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ") where row_num "
-#define SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN sizeof(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR) - 1
-#define SPIDER_SQL_ROW_NUM_STR "row_num"
-#define SPIDER_SQL_ROW_NUM_LEN sizeof(SPIDER_SQL_ROW_NUM_STR) - 1
-#define SPIDER_SQL_ROWNUM_STR "rownum"
-#define SPIDER_SQL_ROWNUM_LEN sizeof(SPIDER_SQL_ROWNUM_STR) - 1
-#define SPIDER_SQL_NEXTVAL_STR ".nextval"
-#define SPIDER_SQL_NEXTVAL_LEN sizeof(SPIDER_SQL_NEXTVAL_STR) - 1
-#define SPIDER_SQL_CURRVAL_STR ".currval"
-#define SPIDER_SQL_CURRVAL_LEN sizeof(SPIDER_SQL_CURRVAL_STR) - 1
-#define SPIDER_SQL_FROM_DUAL_STR " from dual"
-#define SPIDER_SQL_FROM_DUAL_LEN sizeof(SPIDER_SQL_FROM_DUAL_STR) - 1
-
-#define SPIDER_SQL_SHOW_TABLE_STATUS_STR "show table status from "
-#define SPIDER_SQL_SHOW_TABLE_STATUS_LEN sizeof(SPIDER_SQL_SHOW_TABLE_STATUS_STR) - 1
-#define SPIDER_SQL_SELECT_TABLES_STATUS_STR "select `table_rows`,`avg_row_length`,`data_length`,`max_data_length`,`index_length`,`auto_increment`,`create_time`,`update_time`,`check_time` from `information_schema`.`tables` where `table_schema` = "
-#define SPIDER_SQL_SELECT_TABLES_STATUS_LEN sizeof(SPIDER_SQL_SELECT_TABLES_STATUS_STR) - 1
-
-#define SPIDER_SQL_LIKE_STR " like "
-#define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1)
-#define SPIDER_SQL_LIMIT1_STR "rownum = 1"
-#define SPIDER_SQL_LIMIT1_LEN (sizeof(SPIDER_SQL_LIMIT1_STR) - 1)
-
-#define SPIDER_SQL_ADD_MONTHS_STR "add_months"
-#define SPIDER_SQL_ADD_MONTHS_LEN (sizeof(SPIDER_SQL_ADD_MONTHS_STR) - 1)
-
-#define SPIDER_ORACLE_ERR_BUF_LEN 512
-
-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_table_lock_str[] =
-{
- " in share mode",
- " in share mode",
- " in exclusive mode",
- " in exclusive mode"
-};
-static const int spider_db_table_lock_len[] =
-{
- sizeof(" in share mode") - 1,
- sizeof(" in share mode") - 1,
- sizeof(" in exclusive mode") - 1,
- sizeof(" in exclusive mode") - 1
-};
-
-int spider_db_oracle_get_error(
- sword res,
- dvoid *hndlp,
- int error_num,
- const char *error1,
- const char *error2,
- CHARSET_INFO *access_charset,
- char *stored_error_msg
-) {
- sb4 error_code;
- char buf[SPIDER_ORACLE_ERR_BUF_LEN];
- char buf2[SPIDER_ORACLE_ERR_BUF_LEN];
- spider_string tmp_str(buf2, SPIDER_ORACLE_ERR_BUF_LEN, system_charset_info);
- DBUG_ENTER("spider_db_oracle_get_error");
- tmp_str.init_calc_mem(176);
- tmp_str.length(0);
-
- switch (res)
- {
- case OCI_SUCCESS:
- DBUG_PRINT("info",("spider res=OCI_SUCCESS"));
- break;
- case OCI_SUCCESS_WITH_INFO:
- DBUG_PRINT("info",("spider res=OCI_SUCCESS_WITH_INFO"));
- OCIErrorGet(hndlp, 1, NULL, &error_code, (OraText *) buf, sizeof(buf),
- OCI_HTYPE_ERROR);
- DBUG_PRINT("info",("spider error_code=%d error='%s'",error_code ,buf));
- if (access_charset && access_charset->cset != system_charset_info->cset)
- {
- tmp_str.append(buf, strlen(buf), access_charset);
- } else {
- tmp_str.set(buf, strlen(buf), system_charset_info);
- }
- push_warning_printf(current_thd, SPIDER_WARN_LEVEL_WARN,
- ER_SPIDER_ORACLE_NUM, ER_SPIDER_ORACLE_STR, res, error_code,
- tmp_str.c_ptr_safe());
- break;
- case OCI_NO_DATA:
- DBUG_PRINT("info",("spider res=OCI_NO_DATA"));
- DBUG_RETURN(HA_ERR_END_OF_FILE);
- case OCI_ERROR:
- DBUG_PRINT("info",("spider res=OCI_ERROR"));
- OCIErrorGet(hndlp, 1, NULL, &error_code, (OraText *) buf, sizeof(buf),
- OCI_HTYPE_ERROR);
- DBUG_PRINT("info",("spider error_code=%d error='%s'",error_code ,buf));
- if (error_code == 1)
- {
- DBUG_PRINT("info",("spider found dupp key"));
- if (stored_error_msg)
- strmov(stored_error_msg, buf);
- DBUG_RETURN(HA_ERR_FOUND_DUPP_KEY);
- }
- if (error_num)
- {
- if (error1)
- {
- if (error2)
- {
- my_printf_error(error_num, error1, MYF(0), error2);
- } else {
- my_printf_error(error_num, error1, MYF(0));
- }
- } else if (error2) {
- my_error(error_num, MYF(0), error2);
- } else {
- my_error(error_num, MYF(0));
- }
- }
- if (access_charset && access_charset->cset != system_charset_info->cset)
- {
- tmp_str.append(buf, strlen(buf), access_charset);
- } else {
- tmp_str.set(buf, strlen(buf), system_charset_info);
- }
- my_printf_error(ER_SPIDER_ORACLE_NUM, ER_SPIDER_ORACLE_STR, MYF(0),
- res, error_code, tmp_str.c_ptr_safe());
- if (error_num)
- {
- DBUG_RETURN(error_num);
- } else {
- DBUG_RETURN(ER_SPIDER_ORACLE_NUM);
- }
- case OCI_INVALID_HANDLE:
- case OCI_NEED_DATA:
- if (res == OCI_INVALID_HANDLE)
- DBUG_PRINT("info",("spider res=OCI_INVALID_HANDLE"));
- else
- DBUG_PRINT("info",("spider res=OCI_NEED_DATA"));
- default:
- DBUG_PRINT("info",("spider res=%d", res));
- if (error_num)
- {
- if (error1)
- {
- if (error2)
- {
- my_printf_error(error_num, error1, MYF(0), error2);
- } else {
- my_printf_error(error_num, error1, MYF(0));
- }
- } else if (error2) {
- my_error(error_num, MYF(0), error2);
- } else {
- my_error(error_num, MYF(0));
- }
- }
- my_printf_error(ER_SPIDER_ORACLE_NUM, ER_SPIDER_ORACLE_STR, MYF(0),
- res, 0, "");
- if (error_num)
- {
- DBUG_RETURN(error_num);
- } else {
- DBUG_RETURN(ER_SPIDER_ORACLE_NUM);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_init()
-{
- DBUG_ENTER("spider_oracle_init");
- DBUG_RETURN(0);
-}
-
-int spider_oracle_deinit()
-{
- DBUG_ENTER("spider_oracle_deinit");
- DBUG_RETURN(0);
-}
-
-spider_db_share *spider_oracle_create_share(
- SPIDER_SHARE *share
-) {
- DBUG_ENTER("spider_oracle_create_share");
- DBUG_RETURN(new spider_oracle_share(share));
-}
-
-spider_db_handler *spider_oracle_create_handler(
- ha_spider *spider,
- spider_db_share *db_share
-) {
- DBUG_ENTER("spider_oracle_create_handler");
- DBUG_RETURN(new spider_oracle_handler(spider,
- (spider_oracle_share *) db_share));
-}
-
-spider_db_copy_table *spider_oracle_create_copy_table(
- spider_db_share *db_share
-) {
- DBUG_ENTER("spider_oracle_create_copy_table");
- DBUG_RETURN(new spider_oracle_copy_table(
- (spider_oracle_share *) db_share));
-}
-
-SPIDER_DB_CONN *spider_oracle_create_conn(
- SPIDER_CONN *conn
-) {
- DBUG_ENTER("spider_oracle_create_conn");
- DBUG_RETURN(new spider_db_oracle(conn));
-}
-
-spider_db_oracle_util spider_db_oracle_utility;
-
-SPIDER_DBTON spider_dbton_oracle = {
- 0,
- SPIDER_DB_WRAPPER_ORACLE,
- SPIDER_DB_ACCESS_TYPE_SQL,
- spider_oracle_init,
- spider_oracle_deinit,
- spider_oracle_create_share,
- spider_oracle_create_handler,
- spider_oracle_create_copy_table,
- spider_oracle_create_conn,
- &spider_db_oracle_utility
-};
-
-spider_db_oracle_row::spider_db_oracle_row() :
- spider_db_row(spider_dbton_oracle.dbton_id),
- db_conn(NULL), result(NULL),
- ind(NULL), val(NULL), rlen(NULL), ind_first(NULL), val_first(NULL),
- rlen_first(NULL), val_str(NULL), val_str_first(NULL), defnp(NULL),
- lobhp(NULL), colhp(NULL), coltp(NULL), colsz(NULL), field_count(0),
- row_size(NULL), row_size_first(NULL), access_charset(NULL), cloned(FALSE)
-{
- DBUG_ENTER("spider_db_oracle_row::spider_db_oracle_row");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_oracle_row::~spider_db_oracle_row()
-{
- DBUG_ENTER("spider_db_oracle_row::~spider_db_oracle_row");
- DBUG_PRINT("info",("spider this=%p", this));
- deinit();
- DBUG_VOID_RETURN;
-}
-
-int spider_db_oracle_row::store_to_field(
- Field *field,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_oracle_row::store_to_field");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider ind=%d", *ind));
- if (*ind == -1)
- {
- DBUG_PRINT("info", ("spider field is null"));
- field->set_null();
- field->reset();
- } else {
- DBUG_PRINT("info", ("spider field->type()=%u", field->type()));
- field->set_notnull();
- if (field->type() == MYSQL_TYPE_YEAR)
- {
- field->store(val_str->ptr(), 4,
- field->table->s->table_charset);
- } else if (field->type() == MYSQL_TYPE_DATE)
- {
- field->store(val_str->ptr(), 10,
- field->table->s->table_charset);
- } else if (field->type() == MYSQL_TYPE_TIME)
- {
- field->store(val_str->ptr() + 11, 8,
- field->table->s->table_charset);
- } else {
- DBUG_PRINT("info", ("spider val_str->length()=%u", val_str->length()));
- if (field->flags & BLOB_FLAG)
- {
- DBUG_PRINT("info", ("spider blob field"));
- ((Field_blob *)field)->set_ptr(
- val_str->length(), (uchar *) val_str->ptr());
- } else {
- field->store(val_str->ptr(), val_str->length(),
- field->table->s->table_charset);
- }
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_row::append_to_str(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_oracle_row::append_to_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(val_str->length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(val_str->ptr(), val_str->length());
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_row::append_escaped_to_str(
- spider_string *str,
- uint dbton_id
-) {
- DBUG_ENTER("spider_db_oracle_row::append_escaped_to_str");
- DBUG_PRINT("info",("spider this=%p", this));
-/*
- spider_string tmp_str(*val, *rlen, str->charset());
- tmp_str.init_calc_mem(174);
- tmp_str.length(*rlen);
-#ifndef DBUG_OFF
- tmp_str.c_ptr_safe();
-#endif
- if (str->reserve(*rlen * 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- util.append_escaped(str, tmp_str.get_str());
-*/
- if (str->reserve(val_str->length() * 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- spider_dbton[dbton_id].db_util->append_escaped_util(str, val_str->get_str());
- DBUG_RETURN(0);
-}
-
-void spider_db_oracle_row::first()
-{
- DBUG_ENTER("spider_db_oracle_row::first");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider ind_first=%p", ind_first));
- ind = ind_first;
- DBUG_PRINT("info",("spider val_first=%p", val_first));
- val = val_first;
- DBUG_PRINT("info",("spider rlen_first=%p", rlen_first));
- rlen = rlen_first;
- DBUG_PRINT("info",("spider row_size_first=%p", row_size_first));
- row_size = row_size_first;
- DBUG_PRINT("info",("spider val_str_first=%p", val_str_first));
- val_str = val_str_first;
- DBUG_VOID_RETURN;
-}
-
-void spider_db_oracle_row::next()
-{
- DBUG_ENTER("spider_db_oracle_row::next");
- DBUG_PRINT("info",("spider this=%p", this));
- ind++;
- val++;
- rlen++;
- row_size++;
- val_str++;
- DBUG_VOID_RETURN;
-}
-
-bool spider_db_oracle_row::is_null()
-{
- DBUG_ENTER("spider_db_oracle_row::is_null");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((*ind == -1));
-}
-
-int spider_db_oracle_row::val_int()
-{
- DBUG_ENTER("spider_db_oracle_row::val_int");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((*ind != -1) ? atoi(*val) : 0);
-}
-
-double spider_db_oracle_row::val_real()
-{
- DBUG_ENTER("spider_db_oracle_row::val_real");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((*ind != -1) ? my_atof(*val) : 0.0);
-}
-
-my_decimal *spider_db_oracle_row::val_decimal(
- my_decimal *decimal_value,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_oracle_row::val_decimal");
- DBUG_PRINT("info",("spider this=%p", this));
- if (*ind == -1)
- DBUG_RETURN(NULL);
-
-#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
- decimal_operation_results(str2my_decimal(0, *val, *rlen, access_charset,
- decimal_value), "", "");
-#else
- decimal_operation_results(str2my_decimal(0, *val, *rlen, access_charset,
- decimal_value));
-#endif
-
- DBUG_RETURN(decimal_value);
-}
-
-SPIDER_DB_ROW *spider_db_oracle_row::clone()
-{
- uint i;
- spider_db_oracle_row *clone_row;
- DBUG_ENTER("spider_db_oracle_row::clone");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(clone_row = new spider_db_oracle_row()))
- {
- DBUG_RETURN(NULL);
- }
- clone_row->db_conn = db_conn;
- clone_row->result = result;
- clone_row->field_count = field_count;
- clone_row->access_charset = access_charset;
- clone_row->cloned = TRUE;
- if (clone_row->init())
- {
- delete clone_row;
- DBUG_RETURN(NULL);
- }
- memcpy(clone_row->ind, ind_first, sizeof(ub2) * field_count * 4 +
- sizeof(ulong) * field_count);
- for (i = 0; i < field_count; i++)
- {
- if (clone_row->val_str[i].copy(val_str_first[i]))
- {
- delete clone_row;
- DBUG_RETURN(NULL);
- }
- }
- DBUG_RETURN((SPIDER_DB_ROW *) clone_row);
-}
-
-int spider_db_oracle_row::store_to_tmp_table(
- TABLE *tmp_table,
- spider_string *str
-) {
- uint i;
- DBUG_ENTER("spider_db_oracle_row::store_to_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- for (i = 0; i < field_count; i++)
- {
- if (row_size_first[i])
- {
- if (str->reserve(val_str_first[i].length()))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(val_str_first[i].ptr(), val_str_first[i].length());
- }
- }
- tmp_table->field[0]->set_notnull();
- tmp_table->field[0]->store(
- (const char *) row_size_first,
- sizeof(ulong) * 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_notnull();
- tmp_table->field[2]->store(
- (char *) ind_first, (uint) (sizeof(sb2) * field_count), &my_charset_bin);
- DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
-}
-
-int spider_db_oracle_row::init()
-{
- char *tmp_val;
- uint i;
- DBUG_ENTER("spider_db_oracle_row::init");
- DBUG_PRINT("info",("spider this=%p", this));
- if (
- !(ind = (sb2 *)
- spider_bulk_malloc(spider_current_trx, 161, MYF(MY_WME | MY_ZEROFILL),
- &ind, sizeof(sb2) * field_count,
- &rlen, sizeof(ub2) * field_count,
- &coltp, sizeof(ub2) * field_count,
- &colsz, sizeof(ub2) * field_count,
- &row_size, sizeof(ulong) * field_count,
- &val, sizeof(char *) * field_count,
- &tmp_val, MAX_FIELD_WIDTH * field_count,
- &defnp, sizeof(OCIDefine *) * field_count,
- &lobhp, sizeof(OCILobLocator *) * field_count,
- &colhp, sizeof(OCIParam *) * field_count,
- NullS)
- ) ||
- !(val_str = new spider_string[field_count])
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- ind_first = ind;
- val_first = val;
- rlen_first = rlen;
- row_size_first = row_size;
- val_str_first = val_str;
- for (i = 0; i < field_count; i++)
- {
- val[i] = tmp_val;
- val_str[i].init_calc_mem(177);
- val_str[i].set(tmp_val, MAX_FIELD_WIDTH, access_charset);
- tmp_val += MAX_FIELD_WIDTH;
- }
- DBUG_RETURN(0);
-}
-
-void spider_db_oracle_row::deinit()
-{
- uint i;
- DBUG_ENTER("spider_db_oracle_row::deinit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!cloned)
- {
- for (i = 0; i < field_count; i++)
- {
- if (defnp && defnp[i])
- {
- OCIHandleFree(defnp[i], OCI_HTYPE_DEFINE);
- defnp[i] = NULL;
- }
- if (lobhp && lobhp[i])
- {
- OCIDescriptorFree(lobhp[i], OCI_DTYPE_LOB);
- lobhp[i] = NULL;
- }
- }
- }
- if (val_str_first)
- {
- delete [] val_str_first;
- val_str_first = NULL;
- }
- if (ind_first)
- {
- spider_free(spider_current_trx, ind_first, MYF(0));
- ind_first = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_oracle_row::define()
-{
- sword res;
- uint i;
- DBUG_ENTER("spider_db_oracle_row::define");
- DBUG_PRINT("info",("spider this=%p", this));
- for (i = 0; i < field_count; i++)
- {
- if (coltp[i] == SQLT_BLOB)
- {
- res = OCIDescriptorAlloc(db_conn->envhp, (dvoid **) &lobhp[i],
- OCI_DTYPE_LOB, 0, 0);
- if (res != OCI_SUCCESS)
- {
- DBUG_RETURN(
- spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
- access_charset, NULL));
- }
- res = OCIDefineByPos(result->stmtp, &defnp[i], db_conn->errhp, i + 1,
- &lobhp[i], 0, SQLT_BLOB, &ind[i], &rlen[i], NULL,
- OCI_DEFAULT);
- } else if (coltp[i] == SQLT_DAT)
- {
- res = OCIDefineByPos(result->stmtp, &defnp[i], db_conn->errhp, i + 1,
- (char *) val_str[i].ptr() + 20, sizeof(ub1) * 7, SQLT_DAT, &ind[i],
- &rlen[i], NULL, OCI_DEFAULT);
- } else {
- if (val_str[i].alloc(colsz[i]))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- res = OCIDefineByPos(result->stmtp, &defnp[i], db_conn->errhp, i + 1,
- (char *) val_str[i].ptr(), colsz[i], SQLT_CHR, &ind[i], &rlen[i], NULL,
- OCI_DEFAULT);
- }
- if (res != OCI_SUCCESS)
- {
- DBUG_RETURN(
- spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
- access_charset, NULL));
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_row::fetch()
-{
- sword res;
- uint i;
- DBUG_ENTER("spider_db_oracle_row::fetch");
- DBUG_PRINT("info",("spider this=%p", this));
- for (i = 0; i < field_count; i++)
- {
- if (ind[i] == -1)
- {
- DBUG_PRINT("info",("spider NULL"));
- val_str[i].length(0);
- } else {
- if (coltp[i] == SQLT_BLOB)
- {
- DBUG_PRINT("info",("spider SQLT_BLOB"));
- oraub8 len;
- res = OCILobGetLength2(db_conn->svchp, db_conn->errhp, lobhp[i], &len);
- if (res != OCI_SUCCESS)
- {
- DBUG_RETURN(
- spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
- access_charset, NULL));
- }
-#ifndef DBUG_OFF
- {
- ulonglong print_len = len;
- DBUG_PRINT("info",("spider len=%llu", print_len));
- }
-#endif
- if (val_str[i].alloc(len))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- res = OCILobRead2(db_conn->svchp, db_conn->errhp, lobhp[i], &len,
- NULL, 1, (char *) val_str[i].ptr(), len, OCI_ONE_PIECE, NULL, NULL,
- 0, 0);
- if (res != OCI_SUCCESS)
- {
- DBUG_RETURN(
- spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
- access_charset, NULL));
- }
-#ifndef DBUG_OFF
- {
- ulonglong print_len = len;
- DBUG_PRINT("info",("spider lenb=%llu", print_len));
- }
-#endif
- val_str[i].length(len);
- } else if (coltp[i] == SQLT_DAT)
- {
- DBUG_PRINT("info",("spider SQLT_DAT"));
- char *val = (char *) val_str[i].ptr();
- ub1 *src = (ub1 *) val + 20;
- val_str[i].length(19);
- if (src[0] < 100)
- my_sprintf(val, (val, "0000-00-00 00:00:00"));
- else
- my_sprintf(val, (val, "%02u%02u-%02u-%02u %02u:%02u:%02u",
- src[0] - 100, src[1] - 100, src[2], src[3],
- src[4] - 1, src[5] - 1, src[6] - 1));
- } else {
- val_str[i].length(rlen[i]);
- }
- }
- row_size[i] = val_str[i].length();
- }
- DBUG_RETURN(0);
-}
-
-spider_db_oracle_result::spider_db_oracle_result() :
- spider_db_result(spider_dbton_oracle.dbton_id),
- db_conn(NULL), stmtp(NULL), field_count(0), access_charset(NULL),
- fetched(FALSE)
-{
- DBUG_ENTER("spider_db_oracle_result::spider_db_oracle_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_oracle_result::~spider_db_oracle_result()
-{
- DBUG_ENTER("spider_db_oracle_result::~spider_db_oracle_result");
- DBUG_PRINT("info",("spider this=%p", this));
- free_result();
- DBUG_VOID_RETURN;
-}
-
-bool spider_db_oracle_result::has_result()
-{
- DBUG_ENTER("spider_db_oracle_result::has_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(stmtp);
-}
-
-void spider_db_oracle_result::free_result()
-{
- DBUG_ENTER("spider_db_oracle_result::free_result");
- DBUG_PRINT("info",("spider this=%p", this));
- if (stmtp)
- {
- OCIHandleFree(stmtp, OCI_HTYPE_STMT);
- stmtp = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-SPIDER_DB_ROW *spider_db_oracle_result::current_row()
-{
- DBUG_ENTER("spider_db_oracle_result::current_row");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
-}
-
-SPIDER_DB_ROW *spider_db_oracle_result::fetch_row()
-{
- sword res;
- DBUG_ENTER("spider_db_oracle_result::fetch_row");
- DBUG_PRINT("info",("spider this=%p", this));
- row.ind = row.ind_first;
- row.val = row.val_first;
- row.rlen = row.rlen_first;
- row.row_size = row.row_size_first;
- row.val_str = row.val_str_first;
- if (fetched)
- {
- /* already fetched */
- fetched = FALSE;
- } else {
- res = OCIStmtFetch2(stmtp, db_conn->errhp, 1, OCI_FETCH_NEXT, 0,
- OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- store_error_num = spider_db_oracle_get_error(res, db_conn->errhp, 0,
- NULL, NULL, access_charset, NULL);
- DBUG_RETURN(NULL);
- }
- }
- if ((store_error_num = row.fetch()))
- {
- DBUG_RETURN(NULL);
- }
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-SPIDER_DB_ROW *spider_db_oracle_result::fetch_row_from_result_buffer(
- spider_db_result_buffer *spider_res_buf
-) {
- sword res;
- DBUG_ENTER("spider_db_oracle_result::fetch_row_from_result_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- row.ind = row.ind_first;
- row.val = row.val_first;
- row.rlen = row.rlen_first;
- row.row_size = row.row_size_first;
- row.val_str = row.val_str_first;
- if (fetched)
- {
- /* already fetched */
- fetched = FALSE;
- } else {
- res = OCIStmtFetch2(stmtp, db_conn->errhp, 1, OCI_FETCH_NEXT, 0,
- OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- store_error_num = spider_db_oracle_get_error(res, db_conn->errhp, 0,
- NULL, NULL, access_charset, NULL);
- DBUG_RETURN(NULL);
- }
- }
- if ((store_error_num = row.fetch()))
- {
- DBUG_RETURN(NULL);
- }
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-SPIDER_DB_ROW *spider_db_oracle_result::fetch_row_from_tmp_table(
- TABLE *tmp_table
-) {
- uint i;
- const char *str;
- spider_string tmp_str1, tmp_str2, tmp_str3;
- DBUG_ENTER("spider_db_oracle_result::fetch_row_from_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_str1.init_calc_mem(175);
- tmp_str2.init_calc_mem(178);
- tmp_str3.init_calc_mem(179);
- tmp_table->field[0]->val_str(tmp_str1.get_str());
- tmp_table->field[1]->val_str(tmp_str2.get_str());
- tmp_table->field[2]->val_str(tmp_str3.get_str());
- tmp_str1.mem_calc();
- tmp_str2.mem_calc();
- tmp_str3.mem_calc();
- row.ind = row.ind_first;
- row.val = row.val_first;
- row.rlen = row.rlen_first;
- row.row_size = row.row_size_first;
- row.val_str = row.val_str_first;
- DBUG_PRINT("info",("spider tmp_str1.length()=%u", tmp_str1.length()));
- DBUG_PRINT("info",("spider tmp_str2.length()=%u", tmp_str2.length()));
- DBUG_PRINT("info",("spider tmp_str3.length()=%u", tmp_str3.length()));
- memcpy(row.ind, tmp_str3.ptr(), tmp_str3.length());
- memcpy(row.row_size, tmp_str1.ptr(), tmp_str1.length());
- row.field_count = tmp_str1.length() / sizeof(ulong);
- str = tmp_str2.ptr();
- for (i = 0; i < row.field_count; i++)
- {
- row.val_str[i].length(0);
- if (row.row_size[i])
- {
- if (row.val_str[i].reserve(row.row_size[i]))
- {
- store_error_num = HA_ERR_OUT_OF_MEM;
- DBUG_RETURN(NULL);
- }
- row.val_str[i].q_append(str, row.row_size[i]);
- str += row.row_size[i];
- }
- }
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-int spider_db_oracle_result::fetch_table_status(
- int mode,
- ha_rows &records,
- ulong &mean_rec_length,
- ulonglong &data_file_length,
- ulonglong &max_data_file_length,
- ulonglong &index_file_length,
- ulonglong &auto_increment_value,
- time_t &create_time,
- time_t &update_time,
- time_t &check_time
-) {
- DBUG_ENTER("spider_db_oracle_result::fetch_table_status");
- DBUG_PRINT("info",("spider this=%p", this));
- /* TODO: develop later */
- records = 2;
- mean_rec_length = 65535;
- data_file_length = 65535;
- max_data_file_length = 65535;
- index_file_length = 65535;
-/*
- auto_increment_value = 0;
-*/
- create_time = (time_t) 0;
- update_time = (time_t) 0;
- check_time = (time_t) 0;
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_result::fetch_table_records(
- int mode,
- ha_rows &records
-) {
- DBUG_ENTER("spider_db_oracle_result::fetch_table_records");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!fetch_row())
- {
- records = 0;
- } else {
- records = row.val_int();
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_result::fetch_table_cardinality(
- int mode,
- TABLE *table,
- longlong *cardinality,
- uchar *cardinality_upd,
- int bitmap_size
-) {
- DBUG_ENTER("spider_db_oracle_result::fetch_table_cardinality");
- DBUG_PRINT("info",("spider this=%p", this));
- /* TODO: develop later */
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_result::fetch_table_mon_status(
- int &status
-) {
- DBUG_ENTER("spider_db_oracle_result::fetch_table_mon_status");
- DBUG_PRINT("info",("spider this=%p", this));
- /* TODO: develop later */
- status = SPIDER_LINK_MON_OK;
- DBUG_RETURN(0);
-}
-
-longlong spider_db_oracle_result::num_rows()
-{
- sword res;
- ub4 rowcnt;
- DBUG_ENTER("spider_db_oracle_result::num_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- res = OCIAttrGet(stmtp, OCI_HTYPE_STMT, &rowcnt, 0,
- OCI_ATTR_ROW_COUNT, db_conn->errhp);
- if (res != OCI_SUCCESS)
- {
- spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
- access_charset, NULL);
- DBUG_RETURN(0);
- }
- DBUG_PRINT("info",("spider rowcnt=%u", rowcnt));
- DBUG_RETURN((longlong) rowcnt);
-}
-
-uint spider_db_oracle_result::num_fields()
-{
- sword res;
- ub4 parmcnt;
- DBUG_ENTER("spider_db_oracle_result::num_fields");
- DBUG_PRINT("info",("spider this=%p", this));
- res = OCIAttrGet(stmtp, OCI_HTYPE_STMT, &parmcnt, 0,
- OCI_ATTR_PARAM_COUNT, db_conn->errhp);
- if (res != OCI_SUCCESS)
- {
- spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
- access_charset, NULL);
- DBUG_RETURN(0);
- }
- DBUG_RETURN((uint) parmcnt);
-}
-
-void spider_db_oracle_result::move_to_pos(
- longlong pos
-) {
- sword res;
- DBUG_ENTER("spider_db_oracle_result::move_to_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider pos=%lld", pos));
- res = OCIStmtFetch2(stmtp, db_conn->errhp, 1, OCI_FETCH_ABSOLUTE, pos,
- OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
- access_charset, NULL);
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_oracle_result::set_column_info()
-{
- sword res;
- uint i;
- DBUG_ENTER("spider_db_oracle_result::set_column_info");
- DBUG_PRINT("info",("spider this=%p", this));
- for (i = 0; i < field_count; i++)
- {
- res = OCIParamGet(stmtp, OCI_HTYPE_STMT, db_conn->errhp,
- (dvoid **) &row.colhp[i], i + 1);
- if (res != OCI_SUCCESS)
- {
- DBUG_RETURN(spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL,
- NULL, access_charset, NULL));
- }
- res = OCIAttrGet(row.colhp[i], OCI_DTYPE_PARAM, &row.coltp[i], NULL,
- OCI_ATTR_DATA_TYPE, db_conn->errhp);
- if (res != OCI_SUCCESS)
- {
- DBUG_RETURN(spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL,
- NULL, access_charset, NULL));
- }
- res = OCIAttrGet(row.colhp[i], OCI_DTYPE_PARAM, &row.colsz[i], NULL,
- OCI_ATTR_DATA_SIZE, db_conn->errhp);
- if (res != OCI_SUCCESS)
- {
- DBUG_RETURN(spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL,
- NULL, access_charset, NULL));
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_result::get_errno()
-{
- DBUG_ENTER("spider_db_oracle_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_oracle_result::fetch_columns_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_oracle_result::fetch_columns_for_discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
-}
-
-int spider_db_oracle_result::fetch_index_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_oracle_result::fetch_index_for_discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
-}
-#endif
-
-spider_db_oracle::spider_db_oracle(
- SPIDER_CONN *conn
-) : spider_db_conn(conn), envhp(NULL), errhp(NULL), srvhp(NULL), svchp(NULL),
- usrhp(NULL), stmtp(NULL), txnhp(NULL), result(NULL), table_lock_mode(0),
- lock_table_hash_inited(FALSE), handler_open_array_inited(FALSE)
-{
- DBUG_ENTER("spider_db_oracle::spider_db_oracle");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_oracle::~spider_db_oracle()
-{
- DBUG_ENTER("spider_db_oracle::~spider_db_oracle");
- 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);
- }
- if (lock_table_hash_inited)
- {
- spider_free_mem_calc(spider_current_trx,
- lock_table_hash_id,
- lock_table_hash.array.max_element *
- lock_table_hash.array.size_of_element);
- my_hash_free(&lock_table_hash);
- }
- disconnect();
- DBUG_VOID_RETURN;
-}
-
-int spider_db_oracle::init()
-{
- DBUG_ENTER("spider_db_oracle::init");
- DBUG_PRINT("info",("spider this=%p", this));
- if (
- my_hash_init(&lock_table_hash, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_link_get_key, 0, 0)
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- spider_alloc_calc_mem_init(lock_table_hash, 199);
- spider_alloc_calc_mem(spider_current_trx,
- lock_table_hash,
- lock_table_hash.array.max_element *
- lock_table_hash.array.size_of_element);
- lock_table_hash_inited = TRUE;
-
- 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, 164);
- 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_oracle::is_connected()
-{
- DBUG_ENTER("spider_db_oracle::is_connected");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(svchp);
-}
-
-void spider_db_oracle::bg_connect()
-{
- sword res;
- DBUG_ENTER("spider_db_oracle::bg_connect");
- DBUG_PRINT("info",("spider this=%p", this));
- res = OCIEnvNlsCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0, 0, 0);
-/*
- res = OCIEnvCreate(&envhp, OCI_THREADED, 0, 0, 0, 0, 0, 0);
-*/
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider create environment error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- goto error;
- }
- DBUG_PRINT("info",("spider OCI init envhp=%p", envhp));
-
- res = OCIHandleAlloc(envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR, 0, 0);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider create error handler error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
- DBUG_PRINT("info",("spider OCI init errhp=%p", errhp));
-
- res = OCIHandleAlloc(envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER, 0, 0);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider create server handler error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
- DBUG_PRINT("info",("spider OCI init srvhp=%p", srvhp));
-
- res = OCIServerAttach(srvhp, errhp, (OraText *) tgt_host, strlen(tgt_host),
- OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider attach server error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
-
- res = OCIHandleAlloc(envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX, 0, 0);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider create service context error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
- DBUG_PRINT("info",("spider OCI init svchp=%p", svchp));
-
- res = OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, srvhp, 0, OCI_ATTR_SERVER, errhp);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider set server attr error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
-
- res = OCIHandleAlloc(envhp, (dvoid **) &usrhp, OCI_HTYPE_SESSION, 0, 0);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider create session handler error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
- DBUG_PRINT("info",("spider OCI init usrhp=%p", usrhp));
-
- res = OCIAttrSet(usrhp, OCI_HTYPE_SESSION,
- tgt_username, strlen(tgt_username), OCI_ATTR_USERNAME, errhp);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider set username attr error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
-
- res = OCIAttrSet(usrhp, OCI_HTYPE_SESSION,
- tgt_password, strlen(tgt_password), OCI_ATTR_PASSWORD, errhp);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider set password attr error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
-
- res = OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider session begin error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
- DBUG_PRINT("info",("spider OCISessionBegin"));
-
- // set the session in the context handle
- res = OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, usrhp, 0, OCI_ATTR_SESSION, errhp);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider set session attr error"));
- stored_error_num = set_error(res, errhp, 0, NULL, NULL);
- bg_disconnect();
- goto error;
- }
-
- if (
- (stored_error_num = exec_query(SPIDER_SQL_SET_NLS_DATE_FORMAT_STR,
- SPIDER_SQL_SET_NLS_DATE_FORMAT_LEN, -1)) ||
- (stored_error_num = exec_query(SPIDER_SQL_SET_NLS_TIME_FORMAT_STR,
- SPIDER_SQL_SET_NLS_TIME_FORMAT_LEN, -1)) ||
- (stored_error_num = exec_query(SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_STR,
- SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_LEN, -1))
- ) {
- DBUG_PRINT("info",("spider init connection error"));
- bg_disconnect();
- goto error;
- }
- DBUG_VOID_RETURN;
-
-error:
- strmov(stored_error_msg, spider_stmt_da_message(current_thd));
- current_thd->clear_error();
- DBUG_VOID_RETURN;
-}
-
-int spider_db_oracle::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
-) {
- int error_num;
- DBUG_ENTER("spider_db_oracle::connect");
- DBUG_PRINT("info",("spider this=%p", this));
- this->tgt_host = tgt_host;
- this->tgt_username = tgt_username;
- this->tgt_password = tgt_password;
- this->tgt_port = tgt_port;
- this->tgt_socket = tgt_socket;
- this->server_name = server_name;
- this->connect_retry_count = connect_retry_count;
- this->connect_retry_interval = connect_retry_interval;
- if ((error_num = spider_create_conn_thread(conn)))
- DBUG_RETURN(error_num);
- spider_bg_conn_simple_action(conn, SPIDER_BG_SIMPLE_CONNECT);
-
- if (stored_error_num)
- {
- my_message(stored_error_num, stored_error_msg, MYF(0));
- DBUG_RETURN(stored_error_num);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::ping(
-) {
- sword res;
- DBUG_ENTER("spider_db_oracle::ping");
- DBUG_PRINT("info",("spider this=%p", this));
- res = OCIPing(svchp, errhp, OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider ping error %d", res));
- DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
- }
- DBUG_RETURN(0);
-}
-
-void spider_db_oracle::bg_disconnect()
-{
- DBUG_ENTER("spider_db_oracle::bg_disconnect");
- DBUG_PRINT("info",("spider this=%p", this));
- if (result)
- {
- delete result;
- result = NULL;
- }
- if (txnhp)
- {
- DBUG_PRINT("info",("spider OCI free txnhp=%p", txnhp));
- OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
- txnhp = NULL;
- }
- if (stmtp)
- {
- DBUG_PRINT("info",("spider OCI free stmtp=%p", stmtp));
- OCIHandleFree(stmtp, OCI_HTYPE_STMT);
- stmtp = NULL;
- }
- if (svchp && errhp && usrhp)
- {
- DBUG_PRINT("info",("spider OCISessionEnd"));
- OCISessionEnd(svchp, errhp, usrhp, OCI_DEFAULT);
- }
- if (usrhp)
- {
- DBUG_PRINT("info",("spider OCI free usrhp=%p", usrhp));
- OCIHandleFree(usrhp, OCI_HTYPE_SESSION);
- usrhp = NULL;
- }
- if (svchp)
- {
- DBUG_PRINT("info",("spider OCI free svchp=%p", svchp));
- OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
- svchp = NULL;
- }
- if (srvhp)
- {
- DBUG_PRINT("info",("spider OCI free srvhp=%p", srvhp));
- OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
- OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
- srvhp = NULL;
- }
- if (errhp)
- {
- DBUG_PRINT("info",("spider OCI free errhp=%p", errhp));
- OCIHandleFree(errhp, OCI_HTYPE_ERROR);
- errhp = NULL;
- }
- if (envhp)
- {
- DBUG_PRINT("info",("spider OCI free envhp=%p", envhp));
- OCIHandleFree(envhp, OCI_HTYPE_ENV);
- envhp = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_db_oracle::disconnect()
-{
- DBUG_ENTER("spider_db_oracle::disconnect");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!conn->bg_init)
- DBUG_VOID_RETURN;
- spider_bg_conn_simple_action(conn, SPIDER_BG_SIMPLE_DISCONNECT);
- DBUG_VOID_RETURN;
-}
-
-int spider_db_oracle::set_net_timeout()
-{
- DBUG_ENTER("spider_db_oracle::set_net_timeout");
- DBUG_PRINT("info",("spider this=%p", this));
- /* TODO: develop later */
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::exec_query(
- const char *query,
- uint length,
- int quick_mode
-) {
- sword res;
- int error_num;
- DBUG_ENTER("spider_db_oracle::exec_query");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider_param_general_log())
- {
- const char *tgt_str = conn->tgt_host;
- uint32 tgt_len = conn->tgt_host_length;
- spider_string tmp_query_str(length + conn->tgt_wrapper_length +
- tgt_len + (SPIDER_SQL_SPACE_LEN * 2));
- tmp_query_str.init_calc_mem(232);
- 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(query, length);
- general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
- tmp_query_str.length());
- }
- stored_error_num = 0;
- if (table_lock_mode && !conn->in_before_query)
- {
- DBUG_PRINT("info",("spider table_lock_mode=%d", table_lock_mode));
- table_lock_mode = 0;
- if ((error_num = exec_query(exec_lock_sql->ptr(), exec_lock_sql->length(),
- -1))) {
- DBUG_RETURN(error_num);
- }
- }
-
- if (length)
- {
- if (result)
- {
- delete result;
- result = NULL;
- }
-
- if (!stmtp)
- {
- DBUG_PRINT("info",("spider create stmt"));
- res = OCIHandleAlloc(envhp, (dvoid **) &stmtp, OCI_HTYPE_STMT, 0, 0);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider create stmt handler error"));
- DBUG_RETURN(set_error(res, errhp, 0, NULL, NULL));
- }
- }
-
- res = OCIStmtPrepare(stmtp, errhp, (OraText *) query, length,
- OCI_NTV_SYNTAX, OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider stmt prepare error"));
- DBUG_RETURN(set_error(res, errhp, 0, NULL, NULL));
- }
-
-/*
- if ((result = new spider_db_oracle_result()))
- {
- result->db_conn = this;
- result->stmtp = stmtp;
- stmtp = NULL;
- result->field_count = result->num_fields();
- result->row.field_count = result->field_count;
- result->row.db_conn = this;
- result->row.result = result;
- if ((error_num = result->row.init()))
- {
- delete result;
- result = NULL;
- DBUG_RETURN(error_num);
- }
- } else {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-*/
-
- /* select statement check */
- ub4 iters;
- if (
- !strncasecmp(query, "select ", sizeof("select ") - 1) ||
- !strncasecmp(query, "(select ", sizeof("(select ") - 1)
- ) {
- iters = 0;
- } else {
- iters = 1;
- }
-
- if (quick_mode)
- {
- DBUG_PRINT("info",("spider use OCI_DEFAULT"));
- res = OCIStmtExecute(svchp, stmtp, errhp, iters, 0, NULL, NULL,
- OCI_DEFAULT);
- } else {
- DBUG_PRINT("info",("spider use OCI_STMT_SCROLLABLE_READONLY"));
- res = OCIStmtExecute(svchp, stmtp, errhp, iters, 0, NULL, NULL,
- OCI_STMT_SCROLLABLE_READONLY);
-/*
- if (res == OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider fetch last for row count"));
- res = OCIStmtFetch2(result->stmtp, errhp, 1, OCI_FETCH_LAST, 0,
- OCI_DEFAULT);
- }
- if (res == OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider fetch first for row count"));
- res = OCIStmtFetch2(result->stmtp, errhp, 1, OCI_FETCH_FIRST, 0,
- OCI_DEFAULT);
- }
-*/
- }
- if (res == OCI_SUCCESS && iters)
- {
- DBUG_PRINT("info",("spider get row count"));
- ub4 row_count;
- res = OCIAttrGet(stmtp, OCI_HTYPE_STMT, &row_count, 0,
- OCI_ATTR_ROW_COUNT, errhp);
- update_rows = (uint) row_count;
- DBUG_PRINT("info",("spider row_count=%u", update_rows));
- }
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider stmt execute error"));
- error_num = set_error(res, errhp, 0, NULL, NULL);
- if (error_num == HA_ERR_END_OF_FILE)
- DBUG_RETURN(0);
- DBUG_RETURN(error_num);
- }
-
- if ((result = new spider_db_oracle_result()))
- {
- result->db_conn = this;
- result->stmtp = stmtp;
- stmtp = NULL;
- result->field_count = result->num_fields();
- result->row.field_count = result->field_count;
- result->row.db_conn = this;
- result->row.result = result;
- result->row.access_charset = conn->access_charset;
- result->access_charset = conn->access_charset;
- if (
- (error_num = result->row.init()) ||
- (error_num = result->set_column_info())
- ) {
- delete result;
- result = NULL;
- DBUG_RETURN(error_num);
- }
- result->row.define();
- } else {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- if (!quick_mode && !iters)
- {
- if (res == OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider fetch last for row count"));
- res = OCIStmtFetch2(result->stmtp, errhp, 1, OCI_FETCH_LAST, 0,
- OCI_DEFAULT);
- }
- if (res == OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider fetch first for row count"));
- res = OCIStmtFetch2(result->stmtp, errhp, 1, OCI_FETCH_FIRST, 0,
- OCI_DEFAULT);
- }
- if (res != OCI_SUCCESS)
- {
- DBUG_PRINT("info",("spider stmt execute error"));
- error_num = set_error(res, errhp, 0, NULL, NULL);
- if (error_num == HA_ERR_END_OF_FILE)
- DBUG_RETURN(0);
- DBUG_RETURN(error_num);
- }
- result->fetched = TRUE;
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::get_errno()
-{
- DBUG_ENTER("spider_db_oracle::get_errno");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider stored_error=%d", stored_error_num));
- DBUG_RETURN(stored_error_num);
-}
-
-const char *spider_db_oracle::get_error()
-{
- DBUG_ENTER("spider_db_oracle::get_error");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider error=%s", stored_error));
- DBUG_RETURN(stored_error);
-}
-
-bool spider_db_oracle::is_server_gone_error(
- int error_num
-) {
- DBUG_ENTER("spider_db_oracle::is_server_gone_error");
- DBUG_PRINT("info",("spider this=%p", this));
- /* TODO: develop later */
- DBUG_RETURN(FALSE);
-}
-
-bool spider_db_oracle::is_dup_entry_error(
- int error_num
-) {
- DBUG_ENTER("spider_db_oracle::is_dup_entry_error");
- DBUG_PRINT("info",("spider this=%p", this));
- if (error_num == HA_ERR_FOUND_DUPP_KEY)
- DBUG_RETURN(TRUE);
- DBUG_RETURN(FALSE);
-}
-
-bool spider_db_oracle::is_xa_nota_error(
- int error_num
-) {
- DBUG_ENTER("spider_db_oracle::is_xa_nota_error");
- DBUG_PRINT("info",("spider this=%p", this));
- /* TODO: develop later */
- DBUG_RETURN(FALSE);
-}
-
-spider_db_result *spider_db_oracle::store_result(
- spider_db_result_buffer **spider_res_buf,
- st_spider_db_request_key *request_key,
- int *error_num
-) {
- spider_db_oracle_result *tmp_result = result;
- DBUG_ENTER("spider_db_oracle::store_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(!spider_res_buf);
- if (stored_error_num == HA_ERR_END_OF_FILE)
- {
- *error_num = HA_ERR_END_OF_FILE;
- DBUG_RETURN(NULL);
- }
-
- *error_num = 0;
- result = NULL;
- DBUG_RETURN(tmp_result);
-}
-
-spider_db_result *spider_db_oracle::use_result(
- st_spider_db_request_key *request_key,
- int *error_num
-) {
- spider_db_oracle_result *tmp_result = result;
- DBUG_ENTER("spider_db_oracle::use_result");
- DBUG_PRINT("info",("spider this=%p", this));
- if (stored_error_num == HA_ERR_END_OF_FILE)
- {
- *error_num = HA_ERR_END_OF_FILE;
- DBUG_RETURN(NULL);
- }
-
- *error_num = 0;
- result = NULL;
- DBUG_RETURN(tmp_result);
-}
-
-int spider_db_oracle::next_result()
-{
- DBUG_ENTER("spider_db_oracle::next_result");
- DBUG_PRINT("info",("spider this=%p", this));
- /* TODO: develop later */
- DBUG_RETURN(-1);
-}
-
-uint spider_db_oracle::affected_rows()
-{
- DBUG_ENTER("spider_db_oracle::affected_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(update_rows);
-}
-
-ulonglong spider_db_oracle::last_insert_id()
-{
- DBUG_ENTER("spider_db_oracle::last_insert_id");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(stored_last_insert_id);
-}
-
-int spider_db_oracle::set_character_set(
- const char *csname
-) {
- DBUG_ENTER("spider_db_oracle::set_character_set");
- DBUG_PRINT("info",("spider this=%p", this));
- /* TODO: develop later */
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::select_db(
- const char *dbname
-) {
- DBUG_ENTER("spider_db_oracle::select_db");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do for oracle */
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::consistent_snapshot(
- int *need_mon
-) {
- DBUG_ENTER("spider_db_oracle::consistent_snapshot");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do for oracle */
- DBUG_RETURN(0);
-}
-
-bool spider_db_oracle::trx_start_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_oracle::trx_start_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_oracle::start_transaction(
- int *need_mon
-) {
- DBUG_ENTER("spider_db_oracle::start_transaction");
- DBUG_PRINT("info",("spider this=%p", this));
- if (conn->in_before_query)
- {
- if (conn->queued_semi_trx_isolation)
- {
- if (conn->queued_semi_trx_isolation_val != conn->trx_isolation)
- {
- /* nothing to do */
- DBUG_RETURN(0);
- }
- } else if (conn->queued_trx_isolation)
- {
- if (conn->queued_trx_isolation_val != conn->trx_isolation)
- {
- /* nothing to do */
- DBUG_RETURN(0);
- }
- }
- DBUG_RETURN(set_trx_isolation(conn->trx_isolation, need_mon));
- }
- if (spider_db_query(
- conn,
- SPIDER_SQL_START_TRANSACTION_STR,
- SPIDER_SQL_START_TRANSACTION_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::commit(
- int *need_mon
-) {
- sword res;
- DBUG_ENTER("spider_db_oracle::commit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (conn->table_locked)
- {
- conn->table_locked = FALSE;
- spider_current_trx->locked_connections--;
- }
- res = OCITransCommit(svchp, errhp, OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- *need_mon = set_error(res, errhp, 0, NULL, NULL);
- DBUG_RETURN(*need_mon);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::rollback(
- int *need_mon
-) {
- sword res;
- DBUG_ENTER("spider_db_oracle::rollback");
- DBUG_PRINT("info",("spider this=%p", this));
- if (conn->table_locked)
- {
- conn->table_locked = FALSE;
- spider_current_trx->locked_connections--;
- }
- if (svchp && errhp)
- {
- res = OCITransRollback(svchp, errhp, OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- *need_mon = set_error(res, errhp, 0, NULL, NULL);
- DBUG_RETURN(*need_mon);
- }
- }
- DBUG_RETURN(0);
-}
-
-bool spider_db_oracle::xa_start_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_oracle::xa_start_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_oracle::xa_start(
- XID *xid,
- int *need_mon
-) {
- sword res;
- DBUG_ENTER("spider_db_oracle::xa_start");
- DBUG_PRINT("info",("spider this=%p", this));
- if (txnhp)
- {
- OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
- txnhp = NULL;
- }
- OCIHandleAlloc((dvoid *)envhp, (dvoid **)&txnhp, OCI_HTYPE_TRANS, 0, 0);
- OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp, 0,
- OCI_ATTR_TRANS, errhp);
- OCIAttrSet((dvoid *)txnhp, OCI_HTYPE_TRANS, (dvoid *)xid, sizeof(XID),
- OCI_ATTR_XID, errhp);
-
- res = OCITransStart(svchp, errhp, 31622400, OCI_TRANS_NEW);
- if (res != OCI_SUCCESS)
- {
- *need_mon = set_error(res, errhp, 0, NULL, NULL);
- DBUG_RETURN(*need_mon);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::xa_end(
- XID *xid,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_oracle::xa_end");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do for oracle */
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::xa_prepare(
- XID *xid,
- int *need_mon
-) {
- sword res;
- DBUG_ENTER("spider_db_oracle::xa_prepare");
- DBUG_PRINT("info",("spider this=%p", this));
- res = OCITransPrepare(svchp, errhp, OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- *need_mon = set_error(res, errhp, 0, NULL, NULL);
- DBUG_RETURN(*need_mon);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::xa_commit(
- XID *xid,
- int *need_mon
-) {
- sword res;
- DBUG_ENTER("spider_db_oracle::xa_commit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (conn->table_locked)
- {
- conn->table_locked = FALSE;
- spider_current_trx->locked_connections--;
- }
- res = OCITransCommit(svchp, errhp, OCI_TRANS_TWOPHASE);
- if (res != OCI_SUCCESS)
- {
- *need_mon = set_error(res, errhp, 0, NULL, NULL);
- if (txnhp)
- {
- OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
- txnhp = NULL;
- }
- DBUG_RETURN(*need_mon);
- }
- if (txnhp)
- {
- OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
- txnhp = NULL;
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::xa_rollback(
- XID *xid,
- int *need_mon
-) {
- sword res;
- DBUG_ENTER("spider_db_oracle::xa_rollback");
- DBUG_PRINT("info",("spider this=%p", this));
- if (svchp && errhp)
- {
- res = OCITransRollback(svchp, errhp, OCI_DEFAULT);
- if (res != OCI_SUCCESS)
- {
- *need_mon = set_error(res, errhp, 0, NULL, NULL);
- if (txnhp)
- {
- OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
- txnhp = NULL;
- }
- DBUG_RETURN(*need_mon);
- }
- }
- if (txnhp)
- {
- OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
- txnhp = NULL;
- }
- DBUG_RETURN(0);
-}
-
-bool spider_db_oracle::set_trx_isolation_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_oracle::set_trx_isolation_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_oracle::set_trx_isolation(
- int trx_isolation,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_oracle::set_trx_isolation");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (trx_isolation)
- {
- case ISO_READ_UNCOMMITTED:
- case ISO_READ_COMMITTED:
- if (conn->in_before_query)
- {
- DBUG_RETURN(exec_query(SPIDER_SQL_ISO_READ_COMMITTED_STR,
- SPIDER_SQL_ISO_READ_COMMITTED_LEN, -1));
- }
- if (spider_db_query(
- conn,
- SPIDER_SQL_ISO_READ_COMMITTED_STR,
- SPIDER_SQL_ISO_READ_COMMITTED_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- break;
- case ISO_REPEATABLE_READ:
- case ISO_SERIALIZABLE:
- if (conn->in_before_query)
- {
- DBUG_RETURN(exec_query(SPIDER_SQL_ISO_SERIALIZABLE_STR,
- SPIDER_SQL_ISO_SERIALIZABLE_LEN, -1));
- }
- if (spider_db_query(
- conn,
- SPIDER_SQL_ISO_SERIALIZABLE_STR,
- SPIDER_SQL_ISO_SERIALIZABLE_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- break;
- default:
- DBUG_RETURN(HA_ERR_UNSUPPORTED);
- }
- DBUG_RETURN(0);
-}
-
-bool spider_db_oracle::set_autocommit_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_oracle::set_autocommit_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_oracle::set_autocommit(
- bool autocommit,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_oracle::set_autocommit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (autocommit)
- {
- if (conn->in_before_query)
- {
- DBUG_RETURN(exec_query(SPIDER_SQL_AUTOCOMMIT_ON_STR,
- SPIDER_SQL_AUTOCOMMIT_ON_LEN, -1));
- }
- if (spider_db_query(
- conn,
- SPIDER_SQL_AUTOCOMMIT_ON_STR,
- SPIDER_SQL_AUTOCOMMIT_ON_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- } else {
- if (conn->in_before_query)
- {
- DBUG_RETURN(exec_query(SPIDER_SQL_AUTOCOMMIT_OFF_STR,
- SPIDER_SQL_AUTOCOMMIT_OFF_LEN, -1));
- }
- if (spider_db_query(
- conn,
- SPIDER_SQL_AUTOCOMMIT_OFF_STR,
- SPIDER_SQL_AUTOCOMMIT_OFF_LEN,
- -1,
- need_mon)
- )
- DBUG_RETURN(spider_db_errorno(conn));
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- DBUG_RETURN(0);
-}
-
-bool spider_db_oracle::set_sql_log_off_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_oracle::set_sql_log_off_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_oracle::set_sql_log_off(
- bool sql_log_off,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_oracle::set_sql_log_off");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-bool spider_db_oracle::set_time_zone_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_oracle::set_time_zone_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_oracle::set_time_zone(
- Time_zone *time_zone,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_oracle::set_time_zone");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_db_oracle::append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_oracle::append_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::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
-) {
- DBUG_ENTER("spider_db_oracle::append_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::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
-) {
- DBUG_ENTER("spider_db_oracle::append_select");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_oracle::append_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::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
-) {
- DBUG_ENTER("spider_db_oracle::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::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
-) {
- DBUG_ENTER("spider_db_oracle::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-void spider_db_oracle::reset_request_queue()
-{
- DBUG_ENTER("spider_db_oracle::reset_request_queue");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-#endif
-
-size_t spider_db_oracle::escape_string(
- char *to,
- const char *from,
- size_t from_length
-) {
- DBUG_ENTER("spider_db_oracle::escape_string");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(util.escape_string(to, from, from_length, conn->access_charset));
-}
-
-bool spider_db_oracle::have_lock_table_list()
-{
- DBUG_ENTER("spider_db_oracle::have_lock_table_list");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(lock_table_hash.records);
-}
-
-int spider_db_oracle::append_lock_tables(
- spider_string *str
-) {
- int error_num;
- ha_spider *tmp_spider;
- int lock_type;
- uint conn_link_idx;
- int tmp_link_idx;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
- 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;
- DBUG_ENTER("spider_db_oracle::lock_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((tmp_link_for_hash =
- (SPIDER_LINK_FOR_HASH *) my_hash_element(&lock_table_hash, 0)))
- {
- if ((error_num = spider_db_oracle_utility.append_lock_table_head(str)))
- {
- DBUG_RETURN(error_num);
- }
-
- tmp_spider = tmp_link_for_hash->spider;
- tmp_link_idx = tmp_link_for_hash->link_idx;
- switch (tmp_spider->lock_type)
- {
- case TL_READ:
- lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL;
- break;
- case TL_READ_NO_INSERT:
- lock_type = SPIDER_DB_TABLE_LOCK_READ;
- break;
- case TL_WRITE_LOW_PRIORITY:
- lock_type = SPIDER_DB_TABLE_LOCK_LOW_PRIORITY_WRITE;
- break;
- case TL_WRITE:
- lock_type = SPIDER_DB_TABLE_LOCK_WRITE;
- break;
- default:
- // no lock
- DBUG_PRINT("info",("spider lock_type=%d", tmp_spider->lock_type));
- DBUG_RETURN(0);
- }
- conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx];
- spider_oracle_share *db_share = (spider_oracle_share *)
- tmp_spider->share->dbton_share[conn->dbton_id];
- if (&db_share->db_names_str[conn_link_idx])
- {
- db_name = db_share->db_names_str[conn_link_idx].ptr();
- db_name_length = db_share->db_names_str[conn_link_idx].length();
- db_name_charset = tmp_spider->share->access_charset;
- } else {
- db_name = tmp_spider->share->tgt_dbs[conn_link_idx];
- db_name_length = tmp_spider->share->tgt_dbs_lengths[conn_link_idx];
- db_name_charset = system_charset_info;
- }
- if (&db_share->table_names_str[conn_link_idx])
- {
- table_name = db_share->table_names_str[conn_link_idx].ptr();
- table_name_length = db_share->table_names_str[conn_link_idx].length();
- table_name_charset = tmp_spider->share->access_charset;
- } else {
- table_name = tmp_spider->share->tgt_table_names[conn_link_idx];
- table_name_length =
- tmp_spider->share->tgt_table_names_lengths[conn_link_idx];
- table_name_charset = system_charset_info;
- }
- if ((error_num = spider_db_oracle_utility.
- append_lock_table_body(
- str,
- db_name,
- db_name_length,
- db_name_charset,
- table_name,
- table_name_length,
- table_name_charset,
- lock_type
- )
- )) {
- my_hash_reset(&lock_table_hash);
- DBUG_RETURN(error_num);
- }
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&lock_table_hash,
- tmp_link_for_hash->db_table_str_hash_value, (uchar*) tmp_link_for_hash);
-#else
- my_hash_delete(&lock_table_hash, (uchar*) tmp_link_for_hash);
-#endif
-
- if ((error_num = spider_db_oracle_utility.append_lock_table_tail(str)))
- {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::append_unlock_tables(
- spider_string *str
-) {
- int error_num;
- DBUG_ENTER("spider_db_oracle::append_unlock_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = spider_db_oracle_utility.append_unlock_table(str)))
- {
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-uint spider_db_oracle::get_lock_table_hash_count()
-{
- DBUG_ENTER("spider_db_oracle::get_lock_table_hash_count");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(lock_table_hash.records);
-}
-
-void spider_db_oracle::reset_lock_table_hash()
-{
- DBUG_ENTER("spider_db_oracle::reset_lock_table_hash");
- DBUG_PRINT("info",("spider this=%p", this));
- my_hash_reset(&lock_table_hash);
- DBUG_VOID_RETURN;
-}
-
-uint spider_db_oracle::get_opened_handler_count()
-{
- DBUG_ENTER("spider_db_oracle::get_opened_handler_count");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(handler_open_array.elements);
-}
-
-void spider_db_oracle::reset_opened_handler()
-{
- ha_spider *tmp_spider;
- int tmp_link_idx;
- SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
- DBUG_ENTER("spider_db_oracle::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_oracle::set_dup_key_idx(
- ha_spider *spider,
- int link_idx
-) {
- TABLE *table = spider->get_table();
- uint roop_count, pk_idx = table->s->primary_key;
- int key_name_length;
- int max_length = 0;
- char *key_name, *tmp_pos;
- char buf[SPIDER_ORACLE_ERR_BUF_LEN];
- DBUG_ENTER("spider_db_oracle::set_dup_key_idx");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider error_str=%s", stored_error_msg));
- memcpy(buf, spider->share->tgt_dbs[link_idx],
- spider->share->tgt_dbs_lengths[link_idx]);
- tmp_pos = buf + spider->share->tgt_dbs_lengths[link_idx];
- *tmp_pos = '.';
- ++tmp_pos;
- for (roop_count = 0; roop_count < table->s->keys; roop_count++)
- {
- if (roop_count == pk_idx)
- {
- DBUG_PRINT("info",("spider pk_idx=%u", roop_count));
- int all_link_idx = spider->conn_link_idx[link_idx];
- key_name = spider->share->tgt_pk_names[all_link_idx];
- key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx];
- } else {
- key_name = table->s->key_info[roop_count].name;
- key_name_length = strlen(key_name);
- }
- memcpy(tmp_pos, key_name, key_name_length + 1);
- DBUG_PRINT("info",("spider key_name=%s", key_name));
- DBUG_PRINT("info",("spider full key name=%s", buf));
- if (
- max_length < key_name_length &&
- strcasestr(stored_error_msg, buf)
- ) {
- max_length = key_name_length;
- spider->dup_key_idx = roop_count;
- }
- }
- if (max_length == 0)
- spider->dup_key_idx = (uint) -1;
- DBUG_PRINT("info",("spider dup_key_idx=%d", spider->dup_key_idx));
- DBUG_VOID_RETURN;
-}
-
-bool spider_db_oracle::cmp_request_key_to_snd(
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_oracle::cmp_request_key_to_snd");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-int spider_db_oracle::set_error(
- sword res,
- dvoid *hndlp,
- int error_num,
- const char *error1,
- const char *error2
-) {
- DBUG_ENTER("spider_db_oracle::set_error");
- DBUG_PRINT("info",("spider this=%p", this));
- stored_error_num =
- spider_db_oracle_get_error(res, hndlp, error_num, error1, error2,
- conn->access_charset, stored_error_msg);
- if (stored_error_num)
- stored_error = ER_SPIDER_ORACLE_ERR;
- else
- stored_error = "";
- DBUG_RETURN(stored_error_num);
-}
-
-spider_db_oracle_util::spider_db_oracle_util() : spider_db_util()
-{
- DBUG_ENTER("spider_db_oracle_util::spider_db_oracle_util");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_oracle_util::~spider_db_oracle_util()
-{
- DBUG_ENTER("spider_db_oracle_util::~spider_db_oracle_util");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-int spider_db_oracle_util::append_name(
- spider_string *str,
- const char *name,
- uint name_length
-) {
- DBUG_ENTER("spider_db_oracle_util::append_name");
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->q_append(name, name_length);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_name_with_charset(
- spider_string *str,
- const char *name,
- uint name_length,
- CHARSET_INFO *name_charset
-) {
- DBUG_ENTER("spider_db_oracle_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);
-}
-
-bool spider_db_oracle_util::is_name_quote(
- const char head_code
-) {
- DBUG_ENTER("spider_db_oracle_util::is_name_quote");
- DBUG_RETURN(head_code == *name_quote_str);
-}
-
-int spider_db_oracle_util::append_escaped_name_quote(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_oracle_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_oracle_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_oracle_util::append_column_value");
- tmp_str.init_calc_mem(181);
-
- 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
-*/
- if (field->result_type() == STRING_RESULT)
- {
- DBUG_PRINT("info", ("spider STRING_RESULT"));
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- if (
- field->type() == MYSQL_TYPE_VARCHAR ||
- (field->type() >= MYSQL_TYPE_ENUM &&
- field->type() <= MYSQL_TYPE_GEOMETRY)
- ) {
- DBUG_PRINT("info", ("spider append_escaped"));
- char buf2[MAX_FIELD_WIDTH];
- spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, access_charset);
- tmp_str2.init_calc_mem(182);
- tmp_str2.length(0);
- if (
- tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
- str->reserve(tmp_str2.length() * 2) ||
- append_escaped_util(str, tmp_str2.get_str())
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- } else if (str->append(*ptr))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- } else if (field->str_needs_quotes())
- {
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- append_escaped_util(str, ptr);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- } else if (str->append(*ptr))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_from_with_alias(
- spider_string *str,
- const char **table_names,
- uint *table_name_lengths,
- const char **table_aliases,
- uint *table_alias_lengths,
- uint table_count,
- int *table_name_pos,
- bool over_write
-) {
- uint roop_count, length = 0;
- DBUG_ENTER("spider_db_oracle_util::append_from_with_alias");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!over_write)
- {
- for (roop_count = 0; roop_count < table_count; roop_count++)
- length += table_name_lengths[roop_count] + SPIDER_SQL_SPACE_LEN +
- table_alias_lengths[roop_count] + SPIDER_SQL_COMMA_LEN;
- if (str->reserve(SPIDER_SQL_FROM_LEN + length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- *table_name_pos = str->length();
- }
- for (roop_count = 0; roop_count < table_count; roop_count++)
- {
- str->q_append(table_names[roop_count], table_name_lengths[roop_count]);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(table_aliases[roop_count], table_alias_lengths[roop_count]);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_trx_isolation(
- spider_string *str,
- int trx_isolation
-) {
- DBUG_ENTER("spider_db_oracle_util::append_trx_isolation");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
- SPIDER_SQL_ISO_READ_COMMITTED_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- {
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
- switch (trx_isolation)
- {
- case ISO_READ_UNCOMMITTED:
- case ISO_READ_COMMITTED:
- str->q_append(SPIDER_SQL_ISO_READ_COMMITTED_STR,
- SPIDER_SQL_ISO_READ_COMMITTED_LEN);
- break;
- case ISO_REPEATABLE_READ:
- case ISO_SERIALIZABLE:
- str->q_append(SPIDER_SQL_ISO_SERIALIZABLE_STR,
- SPIDER_SQL_ISO_SERIALIZABLE_LEN);
- break;
- default:
- DBUG_RETURN(HA_ERR_UNSUPPORTED);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_autocommit(
- spider_string *str,
- bool autocommit
-) {
- DBUG_ENTER("spider_db_oracle_util::append_autocommit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_AUTOCOMMIT_OFF_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- {
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
- if (autocommit)
- {
- str->q_append(SPIDER_SQL_AUTOCOMMIT_ON_STR,
- SPIDER_SQL_AUTOCOMMIT_ON_LEN);
- } else {
- str->q_append(SPIDER_SQL_AUTOCOMMIT_OFF_STR,
- SPIDER_SQL_AUTOCOMMIT_OFF_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_sql_log_off(
- spider_string *str,
- bool sql_log_off
-) {
- DBUG_ENTER("spider_db_oracle_util::append_sql_log_off");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_time_zone(
- spider_string *str,
- Time_zone *time_zone
-) {
- DBUG_ENTER("spider_db_oracle_util::append_time_zone");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_start_transaction(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_oracle_util::append_start_transaction");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
- SPIDER_SQL_START_TRANSACTION_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- {
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
- str->q_append(SPIDER_SQL_START_TRANSACTION_STR,
- SPIDER_SQL_START_TRANSACTION_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_xa_start(
- spider_string *str,
- XID *xid
-) {
- DBUG_ENTER("spider_db_oracle_util::append_xa_start");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_lock_table_head(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_oracle_util::append_lock_table_head");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_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_oracle_util::append_lock_table_body");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_LOCK_TABLE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->length())
- {
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
- str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
- 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);
- if (
- str->append(db_name, db_name_length, db_name_charset) ||
- str->reserve((SPIDER_SQL_NAME_QUOTE_LEN) * 2 + SPIDER_SQL_DOT_LEN)
- ) {
- 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_DOT_STR, SPIDER_SQL_DOT_LEN);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if (
- str->append(table_name, table_name_length, table_name_charset) ||
- str->reserve(SPIDER_SQL_NAME_QUOTE_LEN +
- spider_db_table_lock_len[lock_type])
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->q_append(spider_db_table_lock_str[lock_type],
- spider_db_table_lock_len[lock_type]);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_lock_table_tail(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_oracle_util::append_lock_table_tail");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::append_unlock_table(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_oracle_util::append_unlock_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_COMMIT_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_COMMIT_STR, SPIDER_SQL_COMMIT_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle_util::open_item_func(
- Item_func *item_func,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- uint dbton_id = spider_dbton_oracle.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,
- *separete_str = SPIDER_SQL_NULL_CHAR_STR,
- *last_str = SPIDER_SQL_NULL_CHAR_STR;
- int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
- separete_str_length = SPIDER_SQL_NULL_CHAR_LEN,
- last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
- int use_pushdown_udf;
- DBUG_ENTER("spider_db_oracle_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) &&
- !item_func->arg_count
- ) {
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
- } 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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], spider, str,
- alias, alias_length, dbton_id)))
- 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, spider, str,
- alias, alias_length, dbton_id));
- } 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, spider, str,
- alias, alias_length, dbton_id));
- } 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 &&
- !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 (func_name_length == 12)
- {
- if (!strncasecmp("cast_as_date", func_name, func_name_length))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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 &&
- !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, spider, str,
- alias, alias_length, dbton_id));
- } else if (func_name_length == 14)
- {
- if (!strncasecmp("cast_as_binary", func_name, func_name_length))
- {
- 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 (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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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))
- {
- 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 (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))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- 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;
- switch (item_date_add_interval->int_type)
- {
- case INTERVAL_YEAR:
- case INTERVAL_QUARTER:
- case INTERVAL_MONTH:
- if (str)
- {
- if (str->reserve(SPIDER_SQL_ADD_MONTHS_LEN +
- SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ADD_MONTHS_STR,
- SPIDER_SQL_ADD_MONTHS_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
- SPIDER_SQL_OPEN_PAREN_LEN);
- }
- if ((error_num = spider_db_print_item_type(item_list[0], spider,
- str, alias, alias_length, dbton_id)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (item_date_add_interval->date_sub_interval)
- {
- if (str->reserve(SPIDER_SQL_COMMA_LEN +
- SPIDER_SQL_MINUS_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- str->q_append(SPIDER_SQL_MINUS_STR, SPIDER_SQL_MINUS_LEN);
- } else {
- 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], spider,
- str, alias, alias_length, dbton_id)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (item_date_add_interval->int_type == INTERVAL_YEAR)
- {
- func_name = " * 12";
- func_name_length = sizeof(" * 12") - 1;
- if (str->reserve(func_name_length +
- (SPIDER_SQL_CLOSE_PAREN_LEN * 2)))
- 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);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- } else if (item_date_add_interval->int_type ==
- INTERVAL_QUARTER)
- {
- func_name = " * 3";
- func_name_length = sizeof(" * 3") - 1;
- if (str->reserve(func_name_length +
- (SPIDER_SQL_CLOSE_PAREN_LEN * 2)))
- 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);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN * 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- }
- }
- break;
- case INTERVAL_WEEK:
- case INTERVAL_DAY:
- case INTERVAL_HOUR:
- case INTERVAL_MINUTE:
- case INTERVAL_SECOND:
- case INTERVAL_MICROSECOND:
- if ((error_num = spider_db_print_item_type(item_list[0], spider,
- str, alias, alias_length, dbton_id)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (item_date_add_interval->date_sub_interval)
- {
- if (str->reserve(SPIDER_SQL_MINUS_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_MINUS_STR, SPIDER_SQL_MINUS_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_PLUS_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_PLUS_STR, SPIDER_SQL_PLUS_LEN);
- }
- }
- if ((error_num = spider_db_print_item_type(item_list[1], spider,
- str, alias, alias_length, dbton_id)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (item_date_add_interval->int_type == INTERVAL_WEEK)
- {
- func_name = " * 7";
- func_name_length = sizeof(" * 7") - 1;
- 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);
- } else if (item_date_add_interval->int_type == INTERVAL_HOUR)
- {
- func_name = " / 24";
- func_name_length = sizeof(" / 24") - 1;
- 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);
- } else if (item_date_add_interval->int_type == INTERVAL_MINUTE)
- {
- func_name = " / 1440";
- func_name_length = sizeof(" / 1440") - 1;
- 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);
- } else if (item_date_add_interval->int_type == INTERVAL_SECOND)
- {
- func_name = " / 86400";
- func_name_length = sizeof(" / 86400") - 1;
- 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);
- } else if (item_date_add_interval->int_type ==
- INTERVAL_MICROSECOND)
- {
- func_name = " / 86400000000";
- func_name_length = sizeof(" / 86400000000") - 1;
- 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);
- } else {
- 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;
- default:
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- }
- DBUG_RETURN(0);
- break;
- }
- }
- 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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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, spider, str,
- alias, alias_length, dbton_id));
- case Item_func::CHAR_TYPECAST_FUNC:
- {
- 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 (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:
- 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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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;
- separete_str = SPIDER_SQL_AND_STR;
- separete_str_length = SPIDER_SQL_AND_LEN;
- } else {
- func_name = (char*) item_func->func_name();
- func_name_length = strlen(func_name);
- separete_str = SPIDER_SQL_AND_STR;
- separete_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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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));
- 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, spider, str,
- alias, alias_length, dbton_id));
- else
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
- 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);
- }
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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(SPIDER_SQL_MBR_LEN + func_name_length +
- SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN);
- 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;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_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 separete_str = %s", separete_str));
- DBUG_PRINT("info",("spider separete_str_length = %d", separete_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, spider, str,
- alias, alias_length, dbton_id)))
- DBUG_RETURN(error_num);
- if (roop_count == 1)
- {
- func_name = separete_str;
- func_name_length = separete_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, spider, str,
- alias, alias_length, dbton_id)))
- 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, spider, str,
- alias, alias_length, dbton_id)))
- 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->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 (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_oracle_util::open_item_sum_func(
- Item_sum *item_sum,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- uint dbton_id = spider_dbton_oracle.dbton_id;
- uint roop_count, item_count = item_sum->get_arg_count();
- int error_num;
- DBUG_ENTER("spider_db_oracle_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, spider, str,
- alias, alias_length, dbton_id)))
- 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, spider, str,
- alias, alias_length, dbton_id)))
- 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
-
-size_t spider_db_oracle_util::escape_string(
- char *to,
- const char *from,
- size_t from_length,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_oracle::escape_string");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(escape_quotes_for_mysql(access_charset, to, 0,
- from, from_length));
-}
-
-int spider_db_oracle_util::append_escaped_util(
- spider_string *to,
- String *from
-) {
- size_t copy_length;
- DBUG_ENTER("spider_db_oracle_util::append_escaped_util");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider to=%s", to->c_ptr_safe()));
- DBUG_PRINT("info",("spider from=%s", from->c_ptr_safe()));
- copy_length = escape_string((char *) to->ptr() + to->length(), from->ptr(),
- from->length(), to->charset());
- DBUG_PRINT("info",("spider copy_length=%zu", copy_length));
- to->length(to->length() + copy_length);
- to->mem_calc();
- DBUG_RETURN(0);
-}
-
-spider_oracle_share::spider_oracle_share(
- st_spider_share *share
-) : spider_db_share(
- share
-),
- table_select(NULL),
- table_select_pos(0),
- key_select(NULL),
- key_select_pos(NULL),
- key_hint(NULL),
- show_table_status(NULL),
- show_records(NULL),
- show_autoinc(NULL),
- show_last_insert_id(NULL),
- show_index(NULL),
- table_names_str(NULL),
- db_names_str(NULL),
- db_table_str(NULL),
- nextval_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),
- nextval_max_length(0),
- column_name_str(NULL),
- same_db_table_name(TRUE),
- first_all_link_idx(-1)
-{
- DBUG_ENTER("spider_oracle_share::spider_oracle_share");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 220);
- spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-spider_oracle_share::~spider_oracle_share()
-{
- DBUG_ENTER("spider_oracle_share::~spider_oracle_share");
- DBUG_PRINT("info",("spider this=%p", this));
- if (table_select)
- delete [] table_select;
- if (key_select)
- delete [] key_select;
- if (key_hint)
- delete [] key_hint;
- free_show_table_status();
- free_show_records();
- free_show_autoinc();
- free_show_last_insert_id();
- free_show_index();
- free_column_name_str();
- free_table_names_str();
- if (key_select_pos)
- {
- spider_free(spider_current_trx, key_select_pos, MYF(0));
- }
- spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_share::init()
-{
- int error_num;
- uint roop_count;
- TABLE_SHARE *table_share = spider_share->table_share;
- uint keys = table_share ? table_share->keys : 0;
- DBUG_ENTER("spider_oracle_share::init");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(key_select_pos = (int *)
- spider_bulk_alloc_mem(spider_current_trx, 221,
- __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
- &key_select_pos,
- sizeof(int) * keys,
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- &db_table_str_hash_value,
- sizeof(my_hash_value_type) * spider_share->all_link_count,
-#endif
- NullS))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- if (keys > 0 &&
- !(key_hint = new spider_string[keys])
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- for (roop_count = 0; roop_count < keys; roop_count++)
- {
- key_hint[roop_count].init_calc_mem(190);
- key_hint[roop_count].set_charset(spider_share->access_charset);
- }
- DBUG_PRINT("info",("spider key_hint=%p", key_hint));
-
- if (
- !(table_select = new spider_string[1]) ||
- (keys > 0 &&
- !(key_select = new spider_string[keys])
- ) ||
- (error_num = create_table_names_str()) ||
- (table_share &&
- (
- (error_num = create_column_name_str()) ||
- (error_num = convert_key_hint_str()) ||
- (error_num = append_show_table_status()) ||
- (error_num = append_show_records()) ||
- (error_num = append_show_autoinc()) ||
- (error_num = append_show_last_insert_id()) ||
- (error_num = append_show_index())
- )
- )
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- table_select->init_calc_mem(191);
- if (table_share && (error_num = append_table_select()))
- DBUG_RETURN(error_num);
-
- for (roop_count = 0; roop_count < keys; roop_count++)
- {
- key_select[roop_count].init_calc_mem(192);
- if ((error_num = append_key_select(roop_count)))
- DBUG_RETURN(error_num);
- }
-
- DBUG_RETURN(error_num);
-}
-
-uint spider_oracle_share::get_column_name_length(
- uint field_index
-) {
- DBUG_ENTER("spider_oracle_share::get_column_name_length");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(column_name_str[field_index].length());
-}
-
-int spider_oracle_share::append_column_name(
- spider_string *str,
- uint field_index
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_share::append_column_name");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = spider_db_oracle_utility.append_name(str,
- column_name_str[field_index].ptr(), column_name_str[field_index].length());
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_share::append_column_name_with_alias(
- spider_string *str,
- uint field_index,
- const char *alias,
- uint alias_length
-) {
- DBUG_ENTER("spider_oracle_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);
-}
-
-int spider_oracle_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_oracle_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_oracle_utility.append_name(str, db_nm, db_nm_len);
- str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_oracle_utility.append_name(str, table_nm, table_nm_len);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_share::append_table_name_with_adjusting(
- 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();
- uint db_nm_max_len = db_nm_max_length;
- const char *table_nm = table_names_str[all_link_idx].ptr();
- uint table_nm_len = table_names_str[all_link_idx].length();
- uint table_nm_max_len = table_nm_max_length;
- DBUG_ENTER("spider_oracle_share::append_table_name_with_adjusting");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_db_oracle_utility.append_name(str, db_nm, db_nm_len);
- str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_oracle_utility.append_name(str, table_nm, table_nm_len);
- uint length =
- db_nm_max_len - db_nm_len +
- table_nm_max_len - table_nm_len;
- memset((char *) str->ptr() + str->length(), ' ', length);
- str->length(str->length() + length);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_share::append_from_with_adjusted_table_name(
- spider_string *str,
- int *table_name_pos
-) {
- const char *db_nm = db_names_str[0].ptr();
- uint db_nm_len = db_names_str[0].length();
- uint db_nm_max_len = db_nm_max_length;
- const char *table_nm = table_names_str[0].ptr();
- uint table_nm_len = table_names_str[0].length();
- uint table_nm_max_len = table_nm_max_length;
- DBUG_ENTER("spider_oracle_share::append_from_with_adjusted_table_name");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_FROM_LEN + db_nm_max_length +
- SPIDER_SQL_DOT_LEN + table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- *table_name_pos = str->length();
- spider_db_oracle_utility.append_name(str, db_nm, db_nm_len);
- str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_oracle_utility.append_name(str, table_nm, table_nm_len);
- uint length =
- db_nm_max_len - db_nm_len +
- table_nm_max_len - table_nm_len;
- memset((char *) str->ptr() + str->length(), ' ', length);
- str->length(str->length() + length);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_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_oracle.dbton_id;
- DBUG_ENTER("spider_oracle_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(193);
- db_names_str[roop_count].init_calc_mem(194);
- db_table_str[roop_count].init_calc_mem(195);
- 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_oracle_share::free_table_names_str()
-{
- DBUG_ENTER("spider_oracle_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_oracle_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_oracle.dbton_id;
- DBUG_ENTER("spider_oracle_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(196);
- str->set_charset(spider_share->access_charset);
- if ((error_num = spider_db_append_name_with_quote_str(str,
- (char *) (*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_oracle_share::free_column_name_str()
-{
- DBUG_ENTER("spider_oracle_share::free_column_name_str");
- if (column_name_str)
- {
- delete [] column_name_str;
- column_name_str = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_share::convert_key_hint_str()
-{
- spider_string *tmp_key_hint;
- int roop_count;
- TABLE_SHARE *table_share = spider_share->table_share;
- DBUG_ENTER("spider_oracle_share::convert_key_hint_str");
- if (spider_share->access_charset->cset != system_charset_info->cset)
- {
- /* need convertion */
- for (roop_count = 0, tmp_key_hint = key_hint;
- roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
- {
- tmp_key_hint->length(0);
- if (tmp_key_hint->append(spider_share->key_hint->ptr(),
- spider_share->key_hint->length(), system_charset_info))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- } else {
- for (roop_count = 0, tmp_key_hint = key_hint;
- roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
- {
- if (tmp_key_hint->copy(spider_share->key_hint[roop_count]))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_share::append_show_table_status()
-{
- int roop_count;
- spider_string *str;
- uint dbton_id = spider_dbton_oracle.dbton_id;
- DBUG_ENTER("spider_oracle_append_show_table_status");
- if (!(show_table_status =
- new spider_string[2 * spider_share->all_link_count]))
- goto error;
-
- for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
- roop_count++)
- {
- show_table_status[0 + (2 * roop_count)].init_calc_mem(197);
- show_table_status[1 + (2 * roop_count)].init_calc_mem(207);
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
-
- if (
- show_table_status[0 + (2 * roop_count)].reserve(
- SPIDER_SQL_SHOW_TABLE_STATUS_LEN +
- db_names_str[roop_count].length() +
- SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
- ((SPIDER_SQL_NAME_QUOTE_LEN) * 2) +
- ((SPIDER_SQL_VALUE_QUOTE_LEN) * 2)) ||
- show_table_status[1 + (2 * roop_count)].reserve(
- SPIDER_SQL_SELECT_TABLES_STATUS_LEN +
- db_names_str[roop_count].length() +
- SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
- table_names_str[roop_count].length() +
- ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4))
- )
- goto error;
- str = &show_table_status[0 + (2 * roop_count)];
- str->q_append(
- SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->q_append(db_names_str[roop_count].ptr(),
- db_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(table_names_str[roop_count].ptr(),
- table_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str = &show_table_status[1 + (2 * roop_count)];
- str->q_append(
- SPIDER_SQL_SELECT_TABLES_STATUS_STR,
- SPIDER_SQL_SELECT_TABLES_STATUS_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(db_names_str[roop_count].ptr(),
- db_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(table_names_str[roop_count].ptr(),
- table_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- }
- DBUG_RETURN(0);
-
-error:
- if (show_table_status)
- {
- delete [] show_table_status;
- show_table_status = NULL;
- }
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-}
-
-void spider_oracle_share::free_show_table_status()
-{
- DBUG_ENTER("spider_oracle_free_show_table_status");
- if (show_table_status)
- {
- delete [] show_table_status;
- show_table_status = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_share::append_show_records()
-{
- int roop_count;
- spider_string *str;
- uint dbton_id = spider_dbton_oracle.dbton_id;
- DBUG_ENTER("spider_oracle_share::append_show_records");
- if (!(show_records = new spider_string[spider_share->all_link_count]))
- goto error;
-
- for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
- roop_count++)
- {
- show_records[roop_count].init_calc_mem(208);
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
-
- if (
- show_records[roop_count].reserve(
- SPIDER_SQL_SHOW_RECORDS_LEN +
- db_names_str[roop_count].length() +
- SPIDER_SQL_DOT_LEN +
- table_names_str[roop_count].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)
- )
- goto error;
- str = &show_records[roop_count];
- str->q_append(SPIDER_SQL_SHOW_RECORDS_STR, SPIDER_SQL_SHOW_RECORDS_LEN);
- append_table_name(str, roop_count);
- }
- DBUG_RETURN(0);
-
-error:
- if (show_records)
- {
- delete [] show_records;
- show_records = NULL;
- }
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-}
-
-void spider_oracle_share::free_show_records()
-{
- DBUG_ENTER("spider_oracle_share::free_show_records");
- if (show_records)
- {
- delete [] show_records;
- show_records = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_share::append_show_autoinc()
-{
- uint roop_count, field_length;
- spider_string *str;
- uint dbton_id = spider_dbton_oracle.dbton_id;
- Field **found_next_number_field =
- spider_share->table_share->found_next_number_field;
- DBUG_ENTER("spider_oracle_share::append_show_autoinc");
- if (!found_next_number_field)
- DBUG_RETURN(0);
-
- if (!(show_autoinc = new spider_string[spider_share->all_link_count]))
- goto error;
-
- field_length =
- column_name_str[(*found_next_number_field)->field_index].length();
- for (roop_count = 0; roop_count < spider_share->all_link_count;
- roop_count++)
- {
- show_autoinc[roop_count].init_calc_mem(224);
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
-
- if (
- show_autoinc[roop_count].reserve(
- SPIDER_SQL_SELECT_LEN +
- SPIDER_SQL_MAX_LEN +
- SPIDER_SQL_OPEN_PAREN_LEN +
- field_length +
- SPIDER_SQL_CLOSE_PAREN_LEN +
- SPIDER_SQL_FROM_LEN +
- db_names_str[roop_count].length() +
- SPIDER_SQL_DOT_LEN +
- table_names_str[roop_count].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 6)
- )
- goto error;
- str = &show_autoinc[roop_count];
- str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
- str->q_append(SPIDER_SQL_MAX_STR, SPIDER_SQL_MAX_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- append_column_name(str, (*found_next_number_field)->field_index);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- append_table_name(str, roop_count);
- }
- DBUG_RETURN(0);
-
-error:
- if (show_autoinc)
- {
- delete [] show_autoinc;
- show_autoinc = NULL;
- }
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-}
-
-void spider_oracle_share::free_show_autoinc()
-{
- DBUG_ENTER("spider_oracle_share::free_show_autoinc");
- if (show_autoinc)
- {
- delete [] show_autoinc;
- show_autoinc = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_share::append_show_last_insert_id()
-{
- uint roop_count;
- spider_string *str;
- uint dbton_id = spider_dbton_oracle.dbton_id;
- Field **found_next_number_field =
- spider_share->table_share->found_next_number_field;
- uint seq_nm_max_length = 0;
- DBUG_ENTER("spider_oracle_share::append_show_last_insert_id");
- if (!found_next_number_field)
- DBUG_RETURN(0);
-
- if (
- !(show_last_insert_id = new spider_string[spider_share->all_link_count]) ||
- !(nextval_str = new spider_string[spider_share->all_link_count])
- )
- goto error;
-
- for (roop_count = 0; roop_count < spider_share->all_link_count;
- roop_count++)
- {
- show_last_insert_id[roop_count].init_calc_mem(225);
- nextval_str[roop_count].init_calc_mem(226);
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
-
- if (
- show_last_insert_id[roop_count].reserve(
- SPIDER_SQL_SELECT_LEN +
- spider_share->tgt_sequence_names_lengths[roop_count] +
- SPIDER_SQL_CURRVAL_LEN +
- SPIDER_SQL_FROM_DUAL_LEN +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2)
- )
- goto error;
- str = &show_last_insert_id[roop_count];
- str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
- spider_db_oracle_utility.append_name(str,
- spider_share->tgt_sequence_names[roop_count],
- spider_share->tgt_sequence_names_lengths[roop_count]);
- str->q_append(SPIDER_SQL_CURRVAL_STR, SPIDER_SQL_CURRVAL_LEN);
- str->q_append(SPIDER_SQL_FROM_DUAL_STR, SPIDER_SQL_FROM_DUAL_LEN);
-
- if (seq_nm_max_length <
- spider_share->tgt_sequence_names_lengths[roop_count])
- {
- seq_nm_max_length =
- spider_share->tgt_sequence_names_lengths[roop_count];
- }
- }
- for (roop_count = 0; roop_count < spider_share->all_link_count;
- roop_count++)
- {
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
-
- if (
- nextval_str[roop_count].reserve(
- seq_nm_max_length +
- SPIDER_SQL_NEXTVAL_LEN +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2)
- )
- goto error;
- str = &nextval_str[roop_count];
- spider_db_oracle_utility.append_name(str,
- spider_share->tgt_sequence_names[roop_count],
- spider_share->tgt_sequence_names_lengths[roop_count]);
- str->q_append(SPIDER_SQL_NEXTVAL_STR, SPIDER_SQL_NEXTVAL_LEN);
- uint length =
- seq_nm_max_length - spider_share->tgt_sequence_names_lengths[roop_count];
- memset((char *) str->ptr() + str->length(), ' ', length);
- str->length(str->length() + length);
- nextval_max_length = str->length();
- }
- DBUG_RETURN(0);
-
-error:
- if (show_last_insert_id)
- {
- delete [] show_last_insert_id;
- show_last_insert_id = NULL;
- }
- if (nextval_str)
- {
- delete [] nextval_str;
- nextval_str = NULL;
- }
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-}
-
-void spider_oracle_share::free_show_last_insert_id()
-{
- DBUG_ENTER("spider_oracle_share::free_show_last_insert_id");
- if (show_last_insert_id)
- {
- delete [] show_last_insert_id;
- show_last_insert_id = NULL;
- }
- if (nextval_str)
- {
- delete [] nextval_str;
- nextval_str = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_share::append_show_index()
-{
- int roop_count;
- spider_string *str;
- uint dbton_id = spider_dbton_oracle.dbton_id;
- DBUG_ENTER("spider_oracle_share::append_show_index");
- if (!(show_index = new spider_string[2 * spider_share->all_link_count]))
- goto error;
-
- for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
- roop_count++)
- {
- show_index[0 + (2 * roop_count)].init_calc_mem(209);
- show_index[1 + (2 * roop_count)].init_calc_mem(210);
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
-
- if (
- show_index[0 + (2 * roop_count)].reserve(
- SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
- SPIDER_SQL_DOT_LEN +
- table_names_str[roop_count].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4) ||
- show_index[1 + (2 * roop_count)].reserve(
- SPIDER_SQL_SELECT_STATISTICS_LEN +
- db_names_str[roop_count].length() +
- SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
- table_names_str[roop_count].length() +
- ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4) +
- SPIDER_SQL_GROUP_LEN + SPIDER_SQL_COLUMN_NAME_LEN)
- )
- goto error;
- str = &show_index[0 + (2 * roop_count)];
- str->q_append(
- SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
- append_table_name(str, roop_count);
- str = &show_index[1 + (2 * roop_count)];
- str->q_append(
- SPIDER_SQL_SELECT_STATISTICS_STR, SPIDER_SQL_SELECT_STATISTICS_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(db_names_str[roop_count].ptr(),
- db_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(table_names_str[roop_count].ptr(),
- table_names_str[roop_count].length());
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
- str->q_append(SPIDER_SQL_COLUMN_NAME_STR, SPIDER_SQL_COLUMN_NAME_LEN);
- }
- DBUG_RETURN(0);
-
-error:
- if (show_index)
- {
- delete [] show_index;
- show_index = NULL;
- }
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-}
-
-void spider_oracle_share::free_show_index()
-{
- DBUG_ENTER("spider_oracle_share::free_show_index");
- if (show_index)
- {
- delete [] show_index;
- show_index = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_share::append_table_select()
-{
- Field **field;
- uint field_length;
- spider_string *str = table_select;
- TABLE_SHARE *table_share = spider_share->table_share;
- DBUG_ENTER("spider_oracle_share::append_table_select");
- for (field = table_share->field; *field; field++)
- {
- field_length = column_name_str[(*field)->field_index].length();
- if (str->reserve(field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(append_from_with_adjusted_table_name(str, &table_select_pos));
-}
-
-int spider_oracle_share::append_key_select(
- uint idx
-) {
- KEY_PART_INFO *key_part;
- Field *field;
- uint part_num;
- uint field_length;
- spider_string *str = &key_select[idx];
- TABLE_SHARE *table_share = spider_share->table_share;
- const KEY *key_info = &table_share->key_info[idx];
- DBUG_ENTER("spider_oracle_share::append_key_select");
- for (key_part = key_info->key_part, part_num = 0;
- part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
- {
- field = key_part->field;
- field_length = column_name_str[field->field_index].length();
- if (str->reserve(field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(append_from_with_adjusted_table_name(str, &key_select_pos[idx]));
-}
-
-bool spider_oracle_share::need_change_db_table_name()
-{
- DBUG_ENTER("spider_oracle_share::need_change_db_table_name");
- DBUG_RETURN(!same_db_table_name);
-}
-
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
-int spider_oracle_share::discover_table_structure(
- SPIDER_TRX *trx,
- SPIDER_SHARE *spider_share,
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_share::discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
-}
-#endif
-
-spider_oracle_handler::spider_oracle_handler(
- ha_spider *spider,
- spider_oracle_share *db_share
-) : spider_db_handler(
- spider,
- db_share
-),
- where_pos(0),
- order_pos(0),
- limit_pos(0),
- table_name_pos(0),
- update_set_pos(0),
- ha_read_pos(0),
- ha_next_pos(0),
- ha_where_pos(0),
- ha_limit_pos(0),
- ha_table_name_pos(0),
- insert_pos(0),
- insert_table_name_pos(0),
- upd_tmp_tbl(NULL),
- tmp_sql_pos1(0),
- tmp_sql_pos2(0),
- tmp_sql_pos3(0),
- tmp_sql_pos4(0),
- tmp_sql_pos5(0),
- table_lock_mode(0),
- reading_from_bulk_tmp_table(FALSE),
- filled_up(FALSE),
- select_rownum_appended(FALSE),
- update_rownum_appended(FALSE),
- union_table_name_pos_first(NULL),
- union_table_name_pos_current(NULL),
- oracle_share(db_share),
- link_for_hash(NULL)
-{
- DBUG_ENTER("spider_oracle_handler::spider_oracle_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 222);
- spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-spider_oracle_handler::~spider_oracle_handler()
-{
- DBUG_ENTER("spider_oracle_handler::~spider_oracle_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- while (union_table_name_pos_first)
- {
- SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
- union_table_name_pos_first = tmp_pos->next;
- spider_free(spider_current_trx, tmp_pos, MYF(0));
- }
- if (link_for_hash)
- {
- spider_free(spider_current_trx, link_for_hash, MYF(0));
- }
- spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_handler::init()
-{
- uint roop_count;
- 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_oracle_handler::init");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.init_calc_mem(67);
- sql_part.init_calc_mem(68);
- sql_part2.init_calc_mem(69);
- ha_sql.init_calc_mem(70);
- insert_sql.init_calc_mem(72);
- update_sql.init_calc_mem(73);
- tmp_sql.init_calc_mem(74);
- dup_update_sql.init_calc_mem(167);
- if (
- (sql.real_alloc(init_sql_alloc_size)) ||
- (insert_sql.real_alloc(init_sql_alloc_size)) ||
- (update_sql.real_alloc(init_sql_alloc_size)) ||
- (tmp_sql.real_alloc(init_sql_alloc_size))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.set_charset(share->access_charset);
- sql_part.set_charset(share->access_charset);
- ha_sql.set_charset(share->access_charset);
- insert_sql.set_charset(share->access_charset);
- update_sql.set_charset(share->access_charset);
- tmp_sql.set_charset(share->access_charset);
- upd_tmp_tbl_prm.init();
- upd_tmp_tbl_prm.field_count = 1;
- if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
- spider_bulk_alloc_mem(spider_current_trx, 223,
- __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
- &link_for_hash,
- sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
- NullS))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- 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 =
- &oracle_share->db_table_str[roop_count];
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- link_for_hash[roop_count].db_table_str_hash_value =
- oracle_share->db_table_str_hash_value[roop_count];
-#endif
- }
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- hs_upds.init();
-#endif
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_table_name_with_adjusting(
- spider_string *str,
- int link_idx,
- ulong sql_type
-) {
- int error_num = 0;
- DBUG_ENTER("spider_oracle_handler::append_table_name_with_adjusting");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type == SPIDER_SQL_TYPE_HANDLER)
- {
- str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
- } else {
- error_num = oracle_share->append_table_name_with_adjusting(str,
- spider->conn_link_idx[link_idx]);
- }
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_key_column_types(
- const key_range *start_key,
- spider_string *str
-) {
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- KEY *key_info = result_list->key_info;
- uint key_name_length, key_count;
- key_part_map full_key_part_map =
- make_prev_keypart_map(spider_user_defined_key_parts(key_info));
- key_part_map start_key_part_map;
- KEY_PART_INFO *key_part;
- Field *field;
- char tmp_buf[MAX_FIELD_WIDTH];
- spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info);
- DBUG_ENTER("spider_oracle_handler::append_key_column_types");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_str.init_calc_mem(227);
-
- start_key_part_map = start_key->keypart_map & full_key_part_map;
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
- DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
- DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
-
- if (!start_key_part_map)
- DBUG_RETURN(0);
-
- for (
- key_part = key_info->key_part,
- key_count = 0;
- start_key_part_map;
- start_key_part_map >>= 1,
- key_part++,
- key_count++
- ) {
- field = key_part->field;
- key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
- if (str->reserve(key_name_length + SPIDER_SQL_SPACE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(tmp_buf, key_name_length);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
-
- if (tmp_str.ptr() != tmp_buf)
- tmp_str.set(tmp_buf, sizeof(tmp_buf), system_charset_info);
- else
- tmp_str.set_charset(system_charset_info);
- field->sql_type(*tmp_str.get_str());
- tmp_str.mem_calc();
- str->append(tmp_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);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
-
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_key_join_columns_for_bka(
- const key_range *start_key,
- spider_string *str,
- const char **table_aliases,
- uint *table_alias_lengths
-) {
- KEY *key_info = spider->result_list.key_info;
- uint length, key_name_length, key_count;
- key_part_map full_key_part_map =
- make_prev_keypart_map(spider_user_defined_key_parts(key_info));
- key_part_map start_key_part_map;
- KEY_PART_INFO *key_part;
- Field *field;
- char tmp_buf[MAX_FIELD_WIDTH];
- bool start_where = ((int) str->length() == where_pos);
- DBUG_ENTER("spider_oracle_handler::append_key_join_columns_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- start_key_part_map = start_key->keypart_map & full_key_part_map;
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
- DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
- DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
-
- if (!start_key_part_map)
- DBUG_RETURN(0);
-
- if (start_where)
- {
- if (str->reserve(SPIDER_SQL_WHERE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
-
- for (
- key_part = key_info->key_part,
- key_count = 0;
- start_key_part_map;
- start_key_part_map >>= 1,
- key_part++,
- key_count++
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
- if (str->reserve(length + table_alias_lengths[0] + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- table_alias_lengths[1] + SPIDER_SQL_PF_EQUAL_LEN + SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(table_aliases[0], table_alias_lengths[0]);
- str->q_append(tmp_buf, length);
- str->q_append(SPIDER_SQL_PF_EQUAL_STR, SPIDER_SQL_PF_EQUAL_LEN);
- str->q_append(table_aliases[1], table_alias_lengths[1]);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
- str->length(str->length() - SPIDER_SQL_AND_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_tmp_table_and_sql_for_bka(
- const key_range *start_key
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_tmp_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- char tmp_table_name[MAX_FIELD_WIDTH * 2],
- tgt_table_name[MAX_FIELD_WIDTH * 2];
- int tmp_table_name_length;
- spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
- oracle_share->db_names_str[0].charset());
- const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
- uint table_name_lengths[2], table_alias_lengths[2],
- table_dot_alias_lengths[2];
- tgt_table_name_str.init_calc_mem(200);
- tgt_table_name_str.length(0);
- create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
- first_link_idx);
- if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
- first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
- DBUG_RETURN(error_num);
- }
- table_names[0] = tmp_table_name;
- table_names[1] = tgt_table_name_str.c_ptr_safe();
- table_name_lengths[0] = tmp_table_name_length;
- table_name_lengths[1] = tgt_table_name_str.length();
- table_aliases[0] = SPIDER_SQL_A_STR;
- table_aliases[1] = SPIDER_SQL_B_STR;
- table_alias_lengths[0] = SPIDER_SQL_A_LEN;
- table_alias_lengths[1] = SPIDER_SQL_B_LEN;
- table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
- table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
- table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
- table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
- if (
- (error_num = append_drop_tmp_bka_table(
- &tmp_sql, tmp_table_name, tmp_table_name_length,
- &tmp_sql_pos1, &tmp_sql_pos5, TRUE)) ||
- (error_num = append_create_tmp_bka_table(
- start_key,
- &tmp_sql, tmp_table_name,
- tmp_table_name_length,
- &tmp_sql_pos2, spider->share->table_share->table_charset)) ||
- (error_num = append_insert_tmp_bka_table(
- start_key,
- &tmp_sql, tmp_table_name,
- tmp_table_name_length, &tmp_sql_pos3))
- )
- DBUG_RETURN(error_num);
- tmp_sql_pos4 = tmp_sql.length();
- if ((error_num = spider_db_append_select(spider)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
- sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- if (
- (error_num = append_select_columns_with_alias(&sql,
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) ||
- (error_num = spider_db_oracle_utility.append_from_with_alias(&sql,
- table_names, table_name_lengths,
- table_aliases, table_alias_lengths, 2,
- &table_name_pos, FALSE))
- )
- DBUG_RETURN(error_num);
- if (
- oracle_share->key_hint &&
- (error_num = spider_db_append_hint_after_table(spider,
- &sql, &oracle_share->key_hint[spider->active_index]))
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- where_pos = sql.length();
- if (
- (error_num = append_key_join_columns_for_bka(
- start_key, &sql,
- table_dot_aliases, table_dot_alias_lengths)) ||
- (error_num = append_condition_part(
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
- SPIDER_SQL_TYPE_SELECT_SQL, FALSE)) ||
- (
- spider->result_list.direct_order_limit &&
- (error_num = append_key_order_for_direct_order_limit_with_alias(&sql,
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))
- )
- )
- DBUG_RETURN(error_num);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reuse_tmp_table_and_sql_for_bka()
-{
- DBUG_ENTER("spider_oracle_handler::reuse_tmp_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_sql.length(tmp_sql_pos4);
- sql.length(limit_pos);
- ha_sql.length(ha_limit_pos);
- DBUG_RETURN(0);
-}
-
-void spider_oracle_handler::create_tmp_bka_table_name(
- char *tmp_table_name,
- int *tmp_table_name_length,
- int link_idx
-) {
- uint adjust_length =
- oracle_share->db_nm_max_length -
- oracle_share->db_names_str[spider->conn_link_idx[link_idx]].length() +
- oracle_share->table_nm_max_length -
- oracle_share->table_names_str[spider->conn_link_idx[link_idx]].length(),
- length;
- DBUG_ENTER("spider_oracle_handler::create_tmp_bka_table_name");
- *tmp_table_name_length = oracle_share->db_nm_max_length +
- oracle_share->table_nm_max_length;
- memset(tmp_table_name, ' ', adjust_length);
- tmp_table_name += adjust_length;
- memcpy(tmp_table_name, oracle_share->db_names_str[link_idx].c_ptr(),
- oracle_share->db_names_str[link_idx].length());
- tmp_table_name += oracle_share->db_names_str[link_idx].length();
- length = my_sprintf(tmp_table_name, (tmp_table_name,
- "%s%s%p%s", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider,
- SPIDER_SQL_UNDERSCORE_STR));
- *tmp_table_name_length += length;
- tmp_table_name += length;
- memcpy(tmp_table_name,
- oracle_share->table_names_str[spider->conn_link_idx[link_idx]].c_ptr(),
- oracle_share->table_names_str[spider->conn_link_idx[link_idx]].length());
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_handler::append_create_tmp_bka_table(
- const key_range *start_key,
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos,
- CHARSET_INFO *table_charset
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- THD *thd = spider->trx->thd;
- char *bka_engine = spider_param_bka_engine(thd, share->bka_engine);
- uint bka_engine_length = strlen(bka_engine),
- cset_length = strlen(table_charset->csname);
- DBUG_ENTER("spider_oracle_handler::append_create_tmp_bka_table");
- if (str->reserve(SPIDER_SQL_CREATE_TMP_LEN + tmp_table_name_length +
- SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_ID_TYPE_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CREATE_TMP_STR, SPIDER_SQL_CREATE_TMP_LEN);
- *db_name_pos = str->length();
- str->q_append(tmp_table_name, tmp_table_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- str->q_append(SPIDER_SQL_ID_TYPE_STR, SPIDER_SQL_ID_TYPE_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- if ((error_num = append_key_column_types(start_key, str)))
- DBUG_RETURN(error_num);
- if (str->reserve(SPIDER_SQL_ENGINE_LEN + bka_engine_length +
- SPIDER_SQL_DEF_CHARSET_LEN + cset_length + SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ENGINE_STR, SPIDER_SQL_ENGINE_LEN);
- str->q_append(bka_engine, bka_engine_length);
- str->q_append(SPIDER_SQL_DEF_CHARSET_STR, SPIDER_SQL_DEF_CHARSET_LEN);
- str->q_append(table_charset->csname, cset_length);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_drop_tmp_bka_table(
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos,
- int *drop_table_end_pos,
- bool with_semicolon
-) {
- DBUG_ENTER("spider_oracle_handler::append_drop_tmp_bka_table");
- if (str->reserve(SPIDER_SQL_DROP_TMP_LEN + tmp_table_name_length +
- (with_semicolon ? SPIDER_SQL_SEMICOLON_LEN : 0)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_DROP_TMP_STR, SPIDER_SQL_DROP_TMP_LEN);
- *db_name_pos = str->length();
- str->q_append(tmp_table_name, tmp_table_name_length);
- *drop_table_end_pos = str->length();
- if (with_semicolon)
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_insert_tmp_bka_table(
- const key_range *start_key,
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_insert_tmp_bka_table");
- if (str->reserve(SPIDER_SQL_INSERT_LEN + SPIDER_SQL_INTO_LEN +
- tmp_table_name_length + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
- str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
- *db_name_pos = str->length();
- str->q_append(tmp_table_name, tmp_table_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- if ((error_num = spider_db_append_key_columns(start_key, spider, str)))
- DBUG_RETURN(error_num);
- if (str->reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_union_table_and_sql_for_bka(
- const key_range *start_key
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_union_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- char tgt_table_name[MAX_FIELD_WIDTH * 2];
- spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
- oracle_share->db_names_str[0].charset());
- const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
- uint table_name_lengths[2], table_alias_lengths[2],
- table_dot_alias_lengths[2];
- tgt_table_name_str.init_calc_mem(234);
- tgt_table_name_str.length(0);
- if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
- first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
- DBUG_RETURN(error_num);
- }
- table_names[0] = "";
- table_names[1] = tgt_table_name_str.c_ptr_safe();
- table_name_lengths[0] = 0;
- table_name_lengths[1] = tgt_table_name_str.length();
- table_aliases[0] = SPIDER_SQL_A_STR;
- table_aliases[1] = SPIDER_SQL_B_STR;
- table_alias_lengths[0] = SPIDER_SQL_A_LEN;
- table_alias_lengths[1] = SPIDER_SQL_B_LEN;
- table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
- table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
- table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
- table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
-
- if ((error_num = spider_db_append_select(spider)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
- sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- if ((error_num = append_select_columns_with_alias(&sql,
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_FROM_LEN + (SPIDER_SQL_OPEN_PAREN_LEN * 2)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- tmp_sql_pos1 = sql.length();
-
- if (
- (error_num = spider_db_oracle_utility.append_from_with_alias(&tmp_sql,
- table_names, table_name_lengths,
- table_aliases, table_alias_lengths, 2,
- &table_name_pos, FALSE))
- )
- DBUG_RETURN(error_num);
- if (
- oracle_share->key_hint &&
- (error_num = spider_db_append_hint_after_table(spider,
- &tmp_sql, &oracle_share->key_hint[spider->active_index]))
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- where_pos = tmp_sql.length();
- if (
- (error_num = append_key_join_columns_for_bka(
- start_key, &tmp_sql,
- table_dot_aliases, table_dot_alias_lengths)) ||
- (error_num = append_condition_part(
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
- SPIDER_SQL_TYPE_TMP_SQL, FALSE)) ||
- (
- spider->result_list.direct_order_limit &&
- (error_num = append_key_order_for_direct_order_limit_with_alias(&tmp_sql,
- SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))
- )
- )
- DBUG_RETURN(error_num);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reuse_union_table_and_sql_for_bka()
-{
- DBUG_ENTER("spider_oracle_handler::reuse_union_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.length(tmp_sql_pos1);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_insert_for_recovery(
- ulong sql_type,
- int link_idx
-) {
- const TABLE *table = spider->get_table();
- SPIDER_SHARE *share = spider->share;
- Field **field;
- uint field_name_length = 0;
- bool add_value = FALSE;
- spider_string *insert_sql;
- DBUG_ENTER("spider_oracle_handler::append_insert_for_recovery");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
- {
- insert_sql = &spider->result_list.insert_sqls[link_idx];
- insert_sql->length(0);
- } else {
- insert_sql = &spider->result_list.update_sqls[link_idx];
- }
- if (insert_sql->reserve(
- SPIDER_SQL_INSERT_LEN + SPIDER_SQL_SQL_IGNORE_LEN +
- SPIDER_SQL_INTO_LEN + oracle_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- insert_sql->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
- insert_sql->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
- insert_sql->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
- oracle_share->append_table_name(insert_sql, spider->conn_link_idx[link_idx]);
- insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- for (field = table->field; *field; field++)
- {
- field_name_length =
- oracle_share->column_name_str[(*field)->field_index].length();
- if (insert_sql->reserve(field_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(insert_sql, (*field)->field_index);
- insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if (field_name_length)
- insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
- if (insert_sql->reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- insert_sql->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
- insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- for (field = table->field; *field; field++)
- {
- add_value = TRUE;
- if ((*field)->is_null())
- {
- if (insert_sql->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- insert_sql->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (
- spider_db_oracle_utility.
- append_column_value(spider, insert_sql, *field, NULL,
- share->access_charset) ||
- insert_sql->reserve(SPIDER_SQL_COMMA_LEN)
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if (add_value)
- insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
- if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN, SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
- {
- exec_insert_sql = insert_sql;
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
-) {
- int error_num;
- spider_string *str = &update_sql;
- DBUG_ENTER("spider_oracle_handler::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->length() > 0)
- {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
-
- if (
- (error_num = append_update(str, 0)) ||
- (error_num = append_update_set(str)) ||
- (error_num = append_update_where(str, table, ptr_diff))
- )
- DBUG_RETURN(error_num);
- filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.update_sqls[link_idx];
- DBUG_ENTER("spider_oracle_handler::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->length() > 0)
- {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
-
- if (
- (error_num = append_update(str, link_idx)) ||
- (error_num = append_update_set(str)) ||
- (error_num = append_update_where(str, table, ptr_diff))
- )
- DBUG_RETURN(error_num);
-
- if (
- spider->pk_update &&
- share->link_statuses[link_idx] == SPIDER_LINK_STATUS_RECOVERY
- ) {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- if ((error_num = append_insert_for_recovery(
- SPIDER_SQL_TYPE_UPDATE_SQL, link_idx)))
- DBUG_RETURN(error_num);
- }
-
- if (!filled_up)
- filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
-) {
- int error_num;
- spider_string *str = &update_sql;
- DBUG_ENTER("spider_oracle_handler::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->length() > 0)
- {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
-
- if (
- (error_num = append_delete(str)) ||
- (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL,
- first_link_idx)) ||
- (error_num = append_update_where(str, table, ptr_diff))
- )
- DBUG_RETURN(error_num);
- filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
-) {
- int error_num;
- spider_string *str = &spider->result_list.update_sqls[link_idx];
- DBUG_ENTER("spider_oracle_handler::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->length() > 0)
- {
- if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
- }
-
- if (
- (error_num = append_delete(str)) ||
- (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL, link_idx)) ||
- (error_num = append_update_where(str, table, ptr_diff))
- )
- DBUG_RETURN(error_num);
- if (!filled_up)
- filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_insert_part()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_insert_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_insert(&insert_sql, 0);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_insert(
- spider_string *str,
- int link_idx
-) {
- DBUG_ENTER("spider_oracle_handler::append_insert");
- if (str->reserve(SPIDER_SQL_INSERT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_update_part()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_update_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_update(&update_sql, 0);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_update(
- spider_string *str,
- int link_idx
-) {
- DBUG_ENTER("spider_oracle_handler::append_update");
- if (str->reserve(SPIDER_SQL_UPDATE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_UPDATE_STR, SPIDER_SQL_UPDATE_LEN);
- if (str->reserve(oracle_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- table_name_pos = str->length();
- append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_UPDATE_SQL);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_delete_part()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_delete_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_delete(&update_sql);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_delete(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_delete");
- if (str->reserve(SPIDER_SQL_DELETE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_DELETE_STR, SPIDER_SQL_DELETE_LEN);
- str->length(str->length() - 1);
- DBUG_RETURN(0);
-}
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_oracle_handler::append_increment_update_set_part()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_increment_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_increment_update_set(&update_sql);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_increment_update_set(
- spider_string *str
-) {
- uint field_name_length;
- uint roop_count;
- Field *field;
- DBUG_ENTER("spider_oracle_handler::append_increment_update_set");
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- const SPIDER_HS_STRING_REF *value = hs_upds.ptr();
- for (roop_count = 0; roop_count < hs_upds.size();
- roop_count++)
- {
- DBUG_PRINT("info",("spider value_size[%u]=%zu", roop_count,
- value[roop_count].size()));
-#ifndef DBUG_OFF
- char print_buf[MAX_FIELD_WIDTH];
- if (value[roop_count].size() < MAX_FIELD_WIDTH)
- {
- memcpy(print_buf, value[roop_count].begin(), value[roop_count].size());
- print_buf[value[roop_count].size()] = '\0';
- DBUG_PRINT("info",("spider value[%u]=%s", roop_count, print_buf));
- }
-#endif
- if (
- value[roop_count].size() == 1 &&
- *(value[roop_count].begin()) == '0'
- )
- continue;
-
- 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;
- field_name_length =
- oracle_share->column_name_str[field->field_index].length();
-
- if (str->reserve(field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
- SPIDER_SQL_COMMA_LEN + value[roop_count].size()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- oracle_share->append_column_name(str, field->field_index);
- if (spider->hs_increment)
- str->q_append(SPIDER_SQL_HS_INCREMENT_STR,
- SPIDER_SQL_HS_INCREMENT_LEN);
- else
- str->q_append(SPIDER_SQL_HS_DECREMENT_STR,
- SPIDER_SQL_HS_DECREMENT_LEN);
- str->q_append(value[roop_count].begin(), value[roop_count].size());
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-#endif
-#endif
-
-int spider_oracle_handler::append_update_set_part()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- update_set_pos = update_sql.length();
- error_num = append_update_set(&update_sql);
- where_pos = update_sql.length();
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_update_set(
- spider_string *str
-) {
- uint field_name_length;
- SPIDER_SHARE *share = spider->share;
- TABLE *table = spider->get_table();
- Field **fields;
- DBUG_ENTER("spider_oracle_handler::append_update_set");
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- for (fields = table->field; *fields; fields++)
- {
- if (bitmap_is_set(table->write_set, (*fields)->field_index))
- {
- field_name_length =
- oracle_share->column_name_str[(*fields)->field_index].length();
- if ((*fields)->is_null())
- {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, (*fields)->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, (*fields)->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
-#ifndef DBUG_OFF
- my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
- table->read_set);
-#endif
- if (
- spider_db_oracle_utility.
- append_column_value(spider, str, *fields, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_COMMA_LEN)
- ) {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- }
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_oracle_handler::append_direct_update_set_part()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_direct_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- update_set_pos = update_sql.length();
- error_num = append_direct_update_set(&update_sql);
- where_pos = update_sql.length();
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_direct_update_set(
- spider_string *str
-) {
- uint field_name_length;
- SPIDER_SHARE *share = spider->share;
-#ifndef DBUG_OFF
- TABLE *table = spider->get_table();
-#endif
- DBUG_ENTER("spider_oracle_handler::append_direct_update_set");
- if (
- spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
- spider->direct_update_fields
- ) {
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- DBUG_RETURN(append_update_columns(str, NULL, 0));
- }
-
- if (
- (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
- ) {
- size_t roop_count;
- Field *field;
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- 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;
- field_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (top_table_field->is_null())
- {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
-#ifndef DBUG_OFF
- my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
- table->read_set);
-#endif
- if (
- spider_db_oracle_utility.
- append_column_value(spider, str, top_table_field, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_COMMA_LEN)
- ) {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- }
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_dup_update_pushdown_part(
- const char *alias,
- uint alias_length
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_dup_update_pushdown_part");
- DBUG_PRINT("info",("spider this=%p", this));
- dup_update_sql.length(0);
- error_num = append_update_columns(&dup_update_sql, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_update_columns_part(
- const char *alias,
- uint alias_length
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_update_columns_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_update_columns(&update_sql, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::check_update_columns_part()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::check_update_columns_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_update_columns(NULL, NULL, 0);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_update_columns(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- List_iterator_fast<Item> fi(*spider->direct_update_fields),
- vi(*spider->direct_update_values);
- Item *field, *value;
- DBUG_ENTER("spider_oracle_handler::append_update_columns");
- while ((field = fi++))
- {
- value = vi++;
- if ((error_num = spider_db_print_item_type(
- (Item *) field, spider, str, alias, alias_length,
- spider_dbton_oracle.dbton_id)))
- {
- if (
- error_num == ER_SPIDER_COND_SKIP_NUM &&
- field->type() == Item::FIELD_ITEM &&
- ((Item_field *) field)->field
- )
- continue;
- DBUG_RETURN(error_num);
- }
- if (str)
- {
- if (str->reserve(SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- }
- if ((error_num = spider_db_print_item_type(
- (Item *) value, spider, str, alias, alias_length,
- spider_dbton_oracle.dbton_id)))
- 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 (str)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-/*
- error_num = spider_db_append_update_columns(spider, str,
- alias, alias_length, spider_dbton_oracle.dbton_id);
- DBUG_RETURN(error_num);
-*/
-}
-#endif
-
-int spider_oracle_handler::append_select_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_select(str, sql_type);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_select(
- spider_string *str,
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::append_select");
- if (sql_type == SPIDER_SQL_TYPE_HANDLER)
- {
- if (str->reserve(SPIDER_SQL_HANDLER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_SELECT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_table_select_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_table_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_table_select(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_table_select(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_table_select");
- table_name_pos = str->length() + oracle_share->table_select_pos;
- if (str->append(*(oracle_share->table_select)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_key_select_part(
- ulong sql_type,
- uint idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_key_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_select(str, idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_key_select(
- spider_string *str,
- uint idx
-) {
- DBUG_ENTER("spider_oracle_handler::append_key_select");
- table_name_pos = str->length() + oracle_share->key_select_pos[idx];
- if (str->append(oracle_share->key_select[idx]))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_minimum_select_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_minimum_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_minimum_select(str, sql_type);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_minimum_select(
- spider_string *str,
- ulong sql_type
-) {
- TABLE *table = spider->get_table();
- Field **field;
- int field_length;
- bool appended = FALSE;
- DBUG_ENTER("spider_oracle_handler::append_minimum_select");
- for (field = table->field; *field; field++)
- {
- if (minimum_select_bit_is_set((*field)->field_index))
- {
- field_length =
- oracle_share->column_name_str[(*field)->field_index].length();
- if (str->reserve(field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- appended = TRUE;
- }
- }
- if (appended)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- else {
- if (str->reserve(SPIDER_SQL_ONE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
- }
- DBUG_RETURN(append_from(str, sql_type, first_link_idx));
-}
-
-int spider_oracle_handler::append_table_select_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- TABLE *table = spider->get_table();
- Field **field;
- int field_length;
- DBUG_ENTER("spider_oracle_handler::append_table_select_with_alias");
- for (field = table->field; *field; field++)
- {
- field_length =
- oracle_share->column_name_str[(*field)->field_index].length();
- if (str->reserve(alias_length + field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_key_select_with_alias(
- spider_string *str,
- const KEY *key_info,
- const char *alias,
- uint alias_length
-) {
- KEY_PART_INFO *key_part;
- Field *field;
- uint part_num;
- int field_length;
- DBUG_ENTER("spider_oracle_handler::append_key_select_with_alias");
- for (key_part = key_info->key_part, part_num = 0;
- part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
- {
- field = key_part->field;
- field_length = oracle_share->column_name_str[field->field_index].length();
- if (str->reserve(alias_length + field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_minimum_select_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- TABLE *table = spider->get_table();
- Field **field;
- int field_length;
- bool appended = FALSE;
- DBUG_ENTER("spider_oracle_handler::append_minimum_select_with_alias");
- for (field = table->field; *field; field++)
- {
- if (minimum_select_bit_is_set((*field)->field_index))
- {
- field_length =
- oracle_share->column_name_str[(*field)->field_index].length();
- if (str->reserve(alias_length + field_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- appended = TRUE;
- }
- }
- if (appended)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- else {
- if (str->reserve(SPIDER_SQL_ONE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_select_columns_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- DBUG_ENTER("spider_oracle_handler::append_select_columns_with_alias");
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- if (
- result_list->direct_aggregate &&
- (error_num = append_sum_select(str, alias, alias_length))
- )
- DBUG_RETURN(error_num);
-#endif
- if ((error_num = append_match_select(str, alias, alias_length)))
- DBUG_RETURN(error_num);
- if (!spider->select_column_mode)
- {
- if (result_list->keyread)
- DBUG_RETURN(append_key_select_with_alias(
- str, result_list->key_info, alias, alias_length));
- else
- DBUG_RETURN(append_table_select_with_alias(
- str, alias, alias_length));
- }
- DBUG_RETURN(append_minimum_select_with_alias(str, alias, alias_length));
-}
-
-int spider_oracle_handler::append_hint_after_table_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_hint_after_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_hint_after_table(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_hint_after_table(
- spider_string *str
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_hint_after_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (
- oracle_share->key_hint &&
- (error_num = spider_db_append_hint_after_table(spider,
- str, &oracle_share->key_hint[spider->active_index]))
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_RETURN(0);
-}
-
-void spider_oracle_handler::set_where_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::set_where_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- where_pos = sql.length();
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- where_pos = update_sql.length();
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- ha_read_pos = ha_sql.length();
- break;
- default:
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_oracle_handler::set_where_to_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::set_where_to_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- sql.length(where_pos);
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- update_sql.length(where_pos);
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- ha_sql.length(ha_read_pos);
- break;
- default:
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_handler::check_item_type(
- Item *item
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::check_item_type");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = spider_db_print_item_type(item, spider, NULL, NULL, 0,
- spider_dbton_oracle.dbton_id);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_values_connector_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_values_connector_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_values_connector(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_values_connector(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_values_connector");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
- SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_values_terminator_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_values_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_values_terminator(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_values_terminator(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_values_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(str->length() -
- SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_union_table_connector_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_union_table_connector_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_table_connector(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_union_table_connector(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_union_table_connector");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_union_table_terminator_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_union_table_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_table_terminator(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_union_table_terminator(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_union_table_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(str->length() -
- ((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN));
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- table_name_pos = str->length() + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_A_LEN +
- SPIDER_SQL_COMMA_LEN;
- if (str->reserve(tmp_sql.length() - SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(tmp_sql.ptr() + SPIDER_SQL_FROM_LEN,
- tmp_sql.length() - SPIDER_SQL_FROM_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_key_column_values_part(
- const key_range *start_key,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_key_column_values_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_column_values(str, start_key);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_key_column_values(
- spider_string *str,
- const key_range *start_key
-) {
- int error_num;
- const uchar *ptr;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- SPIDER_SHARE *share = spider->share;
- KEY *key_info = result_list->key_info;
- uint length;
- uint store_length;
- key_part_map full_key_part_map =
- make_prev_keypart_map(spider_user_defined_key_parts(key_info));
- key_part_map start_key_part_map;
- KEY_PART_INFO *key_part;
- Field *field;
- DBUG_ENTER("spider_oracle_handler::append_key_column_values");
- start_key_part_map = start_key->keypart_map & full_key_part_map;
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
- DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
- DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
-
- if (!start_key_part_map)
- DBUG_RETURN(0);
-
- for (
- key_part = key_info->key_part,
- length = 0;
- start_key_part_map;
- start_key_part_map >>= 1,
- key_part++,
- length += store_length
- ) {
- store_length = key_part->store_length;
- ptr = start_key->key + length;
- field = key_part->field;
- if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
- {
- if (error_num > 0)
- DBUG_RETURN(error_num);
- } else {
- if (spider_db_oracle_utility.append_column_value(spider, str, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- 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);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_key_column_values_with_name_part(
- const key_range *start_key,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_key_column_values_with_name_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_column_values_with_name(str, start_key);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_key_column_values_with_name(
- spider_string *str,
- const key_range *start_key
-) {
- int error_num;
- const uchar *ptr;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- SPIDER_SHARE *share = spider->share;
- KEY *key_info = result_list->key_info;
- uint length;
- uint key_name_length, key_count;
- uint store_length;
- key_part_map full_key_part_map =
- make_prev_keypart_map(spider_user_defined_key_parts(key_info));
- key_part_map start_key_part_map;
- KEY_PART_INFO *key_part;
- Field *field;
- char tmp_buf[MAX_FIELD_WIDTH];
- DBUG_ENTER("spider_oracle_handler::append_key_column_values_with_name");
- start_key_part_map = start_key->keypart_map & full_key_part_map;
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
- DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
- DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
-
- if (!start_key_part_map)
- DBUG_RETURN(0);
-
- for (
- key_part = key_info->key_part,
- length = 0,
- key_count = 0;
- start_key_part_map;
- start_key_part_map >>= 1,
- key_part++,
- length += store_length,
- key_count++
- ) {
- store_length = key_part->store_length;
- ptr = start_key->key + length;
- field = key_part->field;
- if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
- {
- if (error_num > 0)
- DBUG_RETURN(error_num);
- } else {
- if (spider_db_oracle_utility.append_column_value(spider, str, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-
- key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
- if (str->reserve(SPIDER_SQL_SPACE_LEN + key_name_length +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(tmp_buf, key_name_length);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_key_where_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type
-) {
- int error_num;
- spider_string *str, *str_part = NULL, *str_part2 = NULL;
- bool set_order;
- DBUG_ENTER("spider_oracle_handler::append_key_where_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- set_order = FALSE;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- set_order = FALSE;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- set_order = FALSE;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- ha_read_pos = str->length();
- str_part = &sql_part;
- str_part2 = &sql_part2;
- str_part->length(0);
- str_part2->length(0);
- set_order = TRUE;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_where(str, str_part, str_part2, start_key, end_key,
- sql_type, set_order);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_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_oracle_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_oracle.dbton_id);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_is_null_part(
- ulong sql_type,
- KEY_PART_INFO *key_part,
- const key_range *key,
- const uchar **ptr,
- bool key_eq
-) {
- int error_num;
- spider_string *str, *str_part = NULL, *str_part2 = NULL;
- DBUG_ENTER("spider_oracle_handler::append_is_null_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- str_part = &sql_part;
- str_part2 = &sql_part2;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_is_null(sql_type, str, str_part, str_part2,
- key_part, key, ptr, key_eq);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_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
-) {
- DBUG_ENTER("spider_oracle_handler::append_is_null");
- DBUG_PRINT("info",("spider this=%p", this));
- if (key_part->null_bit)
- {
- if (*(*ptr)++)
- {
- if (sql_type == SPIDER_SQL_TYPE_HANDLER)
- {
- str = str_part;
- if (
- key_eq ||
- key->flag == HA_READ_KEY_EXACT ||
- key->flag == HA_READ_KEY_OR_NEXT
- ) {
- if (str->reserve(SPIDER_SQL_IS_NULL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
- } else {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- ha_next_pos = str->length();
- if (str->reserve(SPIDER_SQL_FIRST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
- spider->result_list.ha_read_kind = 1;
- }
- str = str_part2;
- }
- if (
- key_eq ||
- key->flag == HA_READ_KEY_EXACT ||
- key->flag == HA_READ_KEY_OR_NEXT
- ) {
- if (str->reserve(SPIDER_SQL_IS_NULL_LEN +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- oracle_share->column_name_str[key_part->field->field_index].length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, key_part->field->field_index);
- str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_IS_NOT_NULL_LEN +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- oracle_share->column_name_str[key_part->field->field_index].length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, key_part->field->field_index);
- str->q_append(SPIDER_SQL_IS_NOT_NULL_STR, SPIDER_SQL_IS_NOT_NULL_LEN);
- }
- DBUG_RETURN(-1);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_where_terminator_part(
- ulong sql_type,
- bool set_order,
- int key_count
-) {
- int error_num;
- spider_string *str, *str_part = NULL, *str_part2 = NULL;
- DBUG_ENTER("spider_oracle_handler::append_where_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- str_part = &sql_part;
- str_part2 = &sql_part2;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_where_terminator(sql_type, str, str_part, str_part2,
- set_order, key_count);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_where_terminator(
- ulong sql_type,
- spider_string *str,
- spider_string *str_part,
- spider_string *str_part2,
- bool set_order,
- int key_count
-) {
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- DBUG_ENTER("spider_oracle_handler::append_where_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type != SPIDER_SQL_TYPE_HANDLER)
- {
- str->length(str->length() - SPIDER_SQL_AND_LEN);
- if (!set_order)
- result_list->key_order = key_count;
- } else {
- str_part2->length(str_part2->length() - SPIDER_SQL_AND_LEN);
-
- str_part->length(str_part->length() - SPIDER_SQL_COMMA_LEN);
- if (!result_list->ha_read_kind)
- str_part->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- if (str->append(*str_part))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- uint clause_length = str->length() - ha_next_pos;
- if (clause_length < SPIDER_SQL_NEXT_LEN)
- {
- int roop_count;
- clause_length = SPIDER_SQL_NEXT_LEN - clause_length;
- if (str->reserve(clause_length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- for (roop_count = 0; roop_count < (int) clause_length; roop_count++)
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_match_where_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_match_where_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
- }
- error_num = append_match_where(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_match_where(
- spider_string *str
-) {
- int error_num;
- bool first = TRUE;
- st_spider_ft_info *ft_info = spider->ft_first;
- DBUG_ENTER("spider_oracle_handler::append_match_where");
- if (spider->ft_current)
- {
- while (TRUE)
- {
- if (ft_info->used_in_where)
- {
- if (first)
- {
- if (str->reserve(SPIDER_SQL_WHERE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- first = FALSE;
- }
- if ((error_num = append_match_against(str, ft_info, NULL, 0)))
- DBUG_RETURN(error_num);
- if (str->reserve(SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
-
- if (ft_info == spider->ft_current)
- break;
- ft_info = ft_info->next;
- }
- if (!first)
- str->length(str->length() - SPIDER_SQL_AND_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_update_where(
- spider_string *str,
- const TABLE *table,
- my_ptrdiff_t ptr_diff
-) {
- uint field_name_length;
- Field **field;
- SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_oracle_handler::append_update_where");
- if (str->reserve(SPIDER_SQL_WHERE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- for (field = table->field; *field; field++)
- {
- if (
- table->s->primary_key == MAX_KEY ||
- bitmap_is_set(table->read_set, (*field)->field_index)
- ) {
- field_name_length =
- oracle_share->column_name_str[(*field)->field_index].length();
- if ((*field)->is_null(ptr_diff))
- {
- if (str->reserve(field_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
- } else {
- if (str->reserve(field_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- (*field)->move_field_offset(ptr_diff);
- if (
- spider_db_oracle_utility.
- append_column_value(spider, str, *field, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_AND_LEN)
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- (*field)->move_field_offset(-ptr_diff);
- }
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
- }
-/*
- str->length(str->length() - SPIDER_SQL_AND_LEN);
-*/
- if (str->reserve(SPIDER_SQL_LIMIT1_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LIMIT1_STR, SPIDER_SQL_LIMIT1_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_condition_part(
- const char *alias,
- uint alias_length,
- ulong sql_type,
- bool test_flg
-) {
- int error_num;
- spider_string *str;
- bool start_where = FALSE;
- DBUG_ENTER("spider_oracle_handler::append_condition_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- DBUG_PRINT("info",("spider case1 sql_type=%lu", sql_type));
- if (test_flg)
- {
- str = NULL;
- } else {
- str = &sql;
- start_where = ((int) str->length() == where_pos);
- }
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- DBUG_PRINT("info",("spider case1 sql_type=%lu", sql_type));
- if (test_flg)
- {
- str = NULL;
- } else {
- str = &tmp_sql;
- start_where = ((int) str->length() == where_pos);
- }
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- DBUG_PRINT("info",("spider case2 sql_type=%lu", sql_type));
- if (test_flg)
- {
- str = NULL;
- } else {
- str = &update_sql;
- start_where = ((int) str->length() == where_pos);
- }
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- DBUG_PRINT("info",("spider case3 sql_type=%lu", sql_type));
- if (test_flg)
- {
- str = NULL;
- } else {
- str = &ha_sql;
- start_where = TRUE;
- if (spider->active_index == MAX_KEY)
- {
- set_where_pos(SPIDER_SQL_TYPE_HANDLER);
- if (str->reserve(SPIDER_SQL_READ_LEN + SPIDER_SQL_FIRST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_READ_STR, SPIDER_SQL_READ_LEN);
- ha_next_pos = str->length();
- str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
- sql_part2.length(0);
- }
- ha_where_pos = str->length();
-
- if (sql_part2.length())
- {
- str->append(sql_part2);
- start_where = FALSE;
- }
- }
- break;
- default:
- DBUG_PRINT("info",("spider default sql_type=%lu", sql_type));
- DBUG_RETURN(0);
- }
- error_num = append_condition(str, alias, alias_length, start_where,
- sql_type);
- DBUG_PRINT("info",("spider str=%s", str ? str->c_ptr_safe() : "NULL"));
- DBUG_PRINT("info",("spider length=%u", str ? str->length() : 0));
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_condition(
- spider_string *str,
- const char *alias,
- uint alias_length,
- bool start_where,
- ulong sql_type
-) {
- int error_num, restart_pos = 0, start_where_pos;
- SPIDER_CONDITION *tmp_cond = spider->condition;
- DBUG_ENTER("spider_oracle_handler::append_condition");
- DBUG_PRINT("info",("spider str=%p", str));
- DBUG_PRINT("info",("spider alias=%p", alias));
- DBUG_PRINT("info",("spider alias_length=%u", alias_length));
- DBUG_PRINT("info",("spider start_where=%s", start_where ? "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider sql_type=%lu", sql_type));
- if (str && start_where)
- {
- start_where_pos = str->length();
- } else {
- start_where_pos = 0;
- }
-
- if (spider->is_clone && !tmp_cond)
- {
- tmp_cond = spider->pt_clone_source_handler->condition;
- }
-
- while (tmp_cond)
- {
- if (str)
- {
- restart_pos = str->length();
- if (start_where)
- {
- if (str->reserve(SPIDER_SQL_WHERE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- start_where = FALSE;
- } else {
- if (str->reserve(SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- }
- }
- if ((error_num = spider_db_print_item_type(
- (Item *) tmp_cond->cond, spider, str, alias, alias_length,
- spider_dbton_oracle.dbton_id)))
- {
- if (str && error_num == ER_SPIDER_COND_SKIP_NUM)
- {
- DBUG_PRINT("info",("spider COND skip"));
- str->length(restart_pos);
- start_where = (restart_pos == start_where_pos);
- } else
- DBUG_RETURN(error_num);
- }
- tmp_cond = tmp_cond->next;
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_match_against_part(
- ulong sql_type,
- st_spider_ft_info *ft_info,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_match_against_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_match_against(str, ft_info, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_match_against(
- spider_string *str,
- st_spider_ft_info *ft_info,
- const char *alias,
- uint alias_length
-) {
- SPIDER_SHARE *share = spider->share;
- TABLE *table = spider->get_table();
- String *ft_init_key;
- KEY *key_info;
- uint key_name_length;
- int key_count;
- KEY_PART_INFO *key_part;
- Field *field;
- DBUG_ENTER("spider_oracle_handler::append_match_against");
- DBUG_PRINT("info",("spider this=%p", this));
- 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);
-
- ft_init_key = ft_info->key;
- key_info = &table->key_info[ft_info->inx];
- DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
- spider_user_defined_key_parts(key_info)));
-
- for (
- key_part = key_info->key_part,
- key_count = 0;
- key_count < (int) spider_user_defined_key_parts(key_info);
- key_part++,
- key_count++
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (alias_length)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- } else {
- if (str->reserve(key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- if (str->reserve(SPIDER_SQL_AGAINST_LEN + SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
-
- char buf[MAX_FIELD_WIDTH];
- spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
- tmp_str.init_calc_mem(211);
- tmp_str.length(0);
- if (
- tmp_str.append(ft_init_key->ptr(), ft_init_key->length(),
- ft_init_key->charset()) ||
- str->reserve(tmp_str.length() * 2) ||
- spider_db_oracle_utility.append_escaped_util(str, tmp_str.get_str())
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-
- if (str->reserve(
- SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_CLOSE_PAREN_LEN +
- ((ft_info->flags & FT_BOOL) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
- ((ft_info->flags & FT_EXPAND) ?
- SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
- ))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
- if (ft_info->flags & FT_BOOL)
- str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
- SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
- if (ft_info->flags & FT_EXPAND)
- str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
- SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_match_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_match_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_match_select(str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_match_select(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_match_select");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider->ft_current)
- {
- st_spider_ft_info *ft_info = spider->ft_first;
- while (TRUE)
- {
- if ((error_num = append_match_against(str, ft_info,
- alias, alias_length)))
- DBUG_RETURN(error_num);
- 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 (ft_info == spider->ft_current)
- break;
- ft_info = ft_info->next;
- }
- }
- DBUG_RETURN(0);
-}
-
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_oracle_handler::append_sum_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_sum_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_sum_select(str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_sum_select(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- st_select_lex *select_lex;
- DBUG_ENTER("spider_oracle_handler::append_sum_select");
- DBUG_PRINT("info",("spider this=%p", this));
- select_lex = spider_get_select_lex(spider);
- JOIN *join = select_lex->join;
- Item_sum **item_sum_ptr;
- for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
- {
- if ((error_num = spider_db_oracle_utility.open_item_sum_func(*item_sum_ptr,
- spider, str, alias, alias_length)))
- {
- DBUG_RETURN(error_num);
- }
- 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);
- }
- DBUG_RETURN(0);
-}
-#endif
-
-void spider_oracle_handler::set_order_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::set_order_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- order_pos = sql.length();
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- order_pos = update_sql.length();
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- ha_next_pos = ha_sql.length();
- break;
- default:
- DBUG_ASSERT(0);
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_oracle_handler::set_order_to_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::set_order_to_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- sql.length(order_pos);
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- update_sql.length(order_pos);
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- ha_sql.length(ha_next_pos);
- break;
- default:
- DBUG_ASSERT(0);
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_oracle_handler::append_group_by(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- st_select_lex *select_lex;
- DBUG_ENTER("spider_oracle_handler::append_group_by");
- DBUG_PRINT("info",("spider this=%p", this));
- select_lex = spider_get_select_lex(spider);
- ORDER *group = (ORDER *) select_lex->group_list.first;
- if (group)
- {
- if (str->reserve(SPIDER_SQL_GROUP_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
- for (; group; group = group->next)
- {
- if ((error_num = spider_db_print_item_type((*group->item), spider, str,
- alias, alias_length, spider_dbton_oracle.dbton_id)))
- {
- DBUG_RETURN(error_num);
- }
- 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);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- DBUG_RETURN(0);
-}
-#endif
-
-int spider_oracle_handler::append_key_order_for_merge_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_key_order_for_merge_with_alias_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- ha_limit_pos = ha_sql.length();
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_order_for_merge_with_alias(str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_key_order_for_merge_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- /* sort for index merge */
- TABLE *table = spider->get_table();
- int length;
- Field *field;
- uint key_name_length;
- DBUG_ENTER("spider_oracle_handler::append_key_order_for_merge_with_alias");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- if (spider->result_list.direct_aggregate)
- {
- int error_num;
- if ((error_num = append_group_by(str, alias, alias_length)))
- DBUG_RETURN(error_num);
- }
-#endif
- if (
- spider->result_list.direct_order_limit ||
- spider->result_list.internal_limit < 9223372036854775807LL ||
- spider->result_list.split_read < 9223372036854775807LL ||
- spider->result_list.internal_offset
- ) {
- if (update_rownum_appended || select_rownum_appended)
- {
- if (str->reserve(SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- order_pos = str->length();
- limit_pos = str->length();
- DBUG_RETURN(0);
- }
- sql_part.length(0);
- if (str == &update_sql)
- {
- if (sql_part.reserve(str->length() + SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(str->ptr(), where_pos);
- sql_part.q_append(SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR,
- SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN);
- } else {
- if (sql_part.reserve(str->length() + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
- SPIDER_SQL_ROW_NUMBER_HEAD_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR,
- SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN);
- sql_part.q_append(str->ptr(), table_name_pos - SPIDER_SQL_FROM_LEN);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_HEAD_STR,
- SPIDER_SQL_ROW_NUMBER_HEAD_LEN);
- }
- if (table->s->primary_key < MAX_KEY)
- {
- /* sort by primary key */
- KEY *key_info = &table->key_info[table->s->primary_key];
- KEY_PART_INFO *key_part;
- for (
- key_part = key_info->key_part,
- length = 1;
- length <= (int) spider_user_defined_key_parts(key_info);
- key_part++,
- length++
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (sql_part.reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(alias, alias_length);
- oracle_share->append_column_name(&sql_part, field->field_index);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- } else {
- /* sort by all columns */
- Field **fieldp;
- for (
- fieldp = table->field, length = 1;
- *fieldp;
- fieldp++, length++
- ) {
- key_name_length =
- oracle_share->column_name_str[(*fieldp)->field_index].length();
- if (sql_part.reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(alias, alias_length);
- oracle_share->append_column_name(&sql_part, (*fieldp)->field_index);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- uint pos_diff;
- if (str == &update_sql)
- {
- uint table_name_size = (update_set_pos ? update_set_pos : where_pos) -
- table_name_pos;
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
- SPIDER_SQL_FROM_LEN + table_name_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
- sql_part.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- sql_part.q_append(str->ptr() + table_name_pos, table_name_size);
- pos_diff = sql_part.length() - where_pos;
- sql_part.q_append(str->ptr() + where_pos, str->length() - where_pos);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- update_rownum_appended = TRUE;
- } else {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
- SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
- pos_diff = sql_part.length() + SPIDER_SQL_FROM_LEN - table_name_pos;
- sql_part.q_append(str->ptr() + table_name_pos - SPIDER_SQL_FROM_LEN,
- str->length() - table_name_pos + SPIDER_SQL_FROM_LEN);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- select_rownum_appended = TRUE;
- table_name_pos = table_name_pos + pos_diff;
- }
- if (str->copy(sql_part))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- where_pos = where_pos + pos_diff;
- order_pos = str->length();
- limit_pos = str->length();
- DBUG_RETURN(0);
- }
- if (table->s->primary_key < MAX_KEY)
- {
- /* sort by primary key */
- KEY *key_info = &table->key_info[table->s->primary_key];
- KEY_PART_INFO *key_part;
- for (
- key_part = key_info->key_part,
- length = 1;
- length <= (int) spider_user_defined_key_parts(key_info);
- key_part++,
- length++
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if (length > 1)
- {
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- } else {
- /* sort by all columns */
- Field **fieldp;
- for (
- fieldp = table->field, length = 1;
- *fieldp;
- fieldp++, length++
- ) {
- key_name_length =
- oracle_share->column_name_str[(*fieldp)->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, (*fieldp)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if (length > 1)
- {
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- }
- limit_pos = str->length();
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_order_for_direct_order_limit_with_alias(
- str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- int error_num;
- ORDER *order;
- st_select_lex *select_lex;
- longlong select_limit;
- longlong offset_limit;
- DBUG_ENTER("spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- if (spider->result_list.direct_aggregate)
- {
- if ((error_num = append_group_by(str, alias, alias_length)))
- DBUG_RETURN(error_num);
- }
-#endif
- spider_get_select_limit(spider, &select_lex, &select_limit,
- &offset_limit);
- if (
- spider->result_list.direct_order_limit ||
- spider->result_list.internal_limit < 9223372036854775807LL ||
- spider->result_list.split_read < 9223372036854775807LL ||
- spider->result_list.internal_offset
- ) {
- if (update_rownum_appended || select_rownum_appended)
- {
- if (str->reserve(SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- order_pos = str->length();
- limit_pos = str->length();
- DBUG_RETURN(0);
- }
- sql_part.length(0);
- if (str == &update_sql)
- {
- if (sql_part.reserve(str->length() + SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(str->ptr(), where_pos);
- sql_part.q_append(SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR,
- SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN);
- } else {
- if (sql_part.reserve(str->length() + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
- SPIDER_SQL_ROW_NUMBER_HEAD_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR,
- SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN);
- sql_part.q_append(str->ptr(), table_name_pos - SPIDER_SQL_FROM_LEN);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_HEAD_STR,
- SPIDER_SQL_ROW_NUMBER_HEAD_LEN);
- }
- bool all_desc = TRUE;
- if (select_lex->order_list.first)
- {
- for (order = (ORDER *) select_lex->order_list.first; order;
- order = order->next)
- {
- if ((error_num =
- spider_db_print_item_type((*order->item), spider, &sql_part, alias,
- alias_length, spider_dbton_oracle.dbton_id)))
- {
- DBUG_PRINT("info",("spider error=%d", error_num));
- DBUG_RETURN(error_num);
- }
- if (order->asc)
- {
- if (sql_part.reserve(SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- all_desc = FALSE;
- } else {
- if (sql_part.reserve(SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- } else {
- all_desc = FALSE;
- }
- uint pos_diff;
- if (str == &update_sql)
- {
- uint table_name_size = (update_set_pos ? update_set_pos : where_pos) -
- table_name_pos;
- if (all_desc)
- {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
- SPIDER_SQL_FROM_LEN + table_name_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
- } else {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
- SPIDER_SQL_FROM_LEN + table_name_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
- }
- sql_part.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- sql_part.q_append(str->ptr() + table_name_pos, table_name_size);
- pos_diff = sql_part.length() - where_pos;
- sql_part.q_append(str->ptr() + where_pos, str->length() - where_pos);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- update_rownum_appended = TRUE;
- } else {
- if (all_desc)
- {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
- SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
- } else {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
- SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
- }
- pos_diff = sql_part.length() + SPIDER_SQL_FROM_LEN - table_name_pos;
- sql_part.q_append(str->ptr() + table_name_pos - SPIDER_SQL_FROM_LEN,
- str->length() - table_name_pos + SPIDER_SQL_FROM_LEN);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- select_rownum_appended = TRUE;
- table_name_pos = table_name_pos + pos_diff;
- }
- if (str->copy(sql_part))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- where_pos = where_pos + pos_diff;
- order_pos = str->length();
- limit_pos = str->length();
- DBUG_RETURN(0);
- }
- if (select_lex->order_list.first)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- for (order = (ORDER *) select_lex->order_list.first; order;
- order = order->next)
- {
- if ((error_num =
- spider_db_print_item_type((*order->item), spider, str, alias,
- alias_length, spider_dbton_oracle.dbton_id)))
- {
- DBUG_PRINT("info",("spider error=%d", error_num));
- DBUG_RETURN(error_num);
- }
- if (order->asc)
- {
- 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);
- } else {
- if (str->reserve(SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- limit_pos = str->length();
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_key_order_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_key_order_with_alias_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- error_num = append_key_order_for_handler(str, alias, alias_length);
- DBUG_RETURN(error_num);
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_order_with_alias(str, alias, alias_length);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_key_order_for_handler(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- DBUG_ENTER("spider_oracle_handler::append_key_order_for_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider ha_next_pos=%d", ha_next_pos));
- DBUG_PRINT("info",("spider ha_where_pos=%d", ha_where_pos));
- str->q_append(alias, alias_length);
- memset((char *) str->ptr() + str->length(), ' ',
- ha_where_pos - ha_next_pos - alias_length);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_key_order_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
-) {
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- KEY *key_info = result_list->key_info;
- int length;
- KEY_PART_INFO *key_part;
- Field *field;
- uint key_name_length;
- DBUG_ENTER("spider_oracle_handler::append_key_order_with_alias");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- if (spider->result_list.direct_aggregate)
- {
- int error_num;
- if ((error_num = append_group_by(str, alias, alias_length)))
- DBUG_RETURN(error_num);
- }
-#endif
- if (
- spider->result_list.direct_order_limit ||
- spider->result_list.internal_limit < 9223372036854775807LL ||
- spider->result_list.split_read < 9223372036854775807LL ||
- spider->result_list.internal_offset
- ) {
- if (update_rownum_appended || select_rownum_appended)
- {
- if (str->reserve(SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- order_pos = str->length();
- limit_pos = str->length();
- DBUG_RETURN(0);
- }
- sql_part.length(0);
- if (str == &update_sql)
- {
- if (sql_part.reserve(str->length() + SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(str->ptr(), where_pos);
- sql_part.q_append(SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR,
- SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN);
- } else {
- if (sql_part.reserve(str->length() + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
- SPIDER_SQL_ROW_NUMBER_HEAD_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR,
- SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN);
- sql_part.q_append(str->ptr(), table_name_pos - SPIDER_SQL_FROM_LEN);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_HEAD_STR,
- SPIDER_SQL_ROW_NUMBER_HEAD_LEN);
- }
- if (result_list->sorted == TRUE)
- {
- if (result_list->desc_flg == TRUE)
- {
- for (
- key_part = key_info->key_part + result_list->key_order,
- length = 1;
- length + result_list->key_order <=
- (int) spider_user_defined_key_parts(key_info) &&
- length <= result_list->max_order;
- key_part++,
- length++
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (sql_part.reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(alias, alias_length);
- oracle_share->append_column_name(&sql_part, field->field_index);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (sql_part.reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(alias, alias_length);
- oracle_share->append_column_name(&sql_part, field->field_index);
- sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- } else {
- for (
- key_part = key_info->key_part + result_list->key_order,
- length = 1;
- length + result_list->key_order <=
- (int) spider_user_defined_key_parts(key_info) &&
- length <= result_list->max_order;
- key_part++,
- length++
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (sql_part.reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(alias, alias_length);
- oracle_share->append_column_name(&sql_part, field->field_index);
- sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (sql_part.reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(alias, alias_length);
- oracle_share->append_column_name(&sql_part, field->field_index);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- }
- }
- uint pos_diff;
- if (str == &update_sql)
- {
- uint table_name_size = (update_set_pos ? update_set_pos : where_pos) -
- table_name_pos;
- if (result_list->sorted == TRUE && result_list->desc_flg == TRUE)
- {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
- SPIDER_SQL_FROM_LEN + table_name_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
- } else {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
- SPIDER_SQL_FROM_LEN + table_name_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
- }
- sql_part.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- sql_part.q_append(str->ptr() + table_name_pos,
- table_name_size);
- pos_diff = sql_part.length() - where_pos;
- sql_part.q_append(str->ptr() + where_pos, str->length() - where_pos);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- update_rownum_appended = TRUE;
- } else {
- if (result_list->sorted == TRUE && result_list->desc_flg == TRUE)
- {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
- SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
- } else {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
- SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
- }
- pos_diff = sql_part.length() + SPIDER_SQL_FROM_LEN - table_name_pos;
- sql_part.q_append(str->ptr() + table_name_pos - SPIDER_SQL_FROM_LEN,
- str->length() - table_name_pos + SPIDER_SQL_FROM_LEN);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- select_rownum_appended = TRUE;
- table_name_pos = table_name_pos + pos_diff;
- }
- if (str->copy(sql_part))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- where_pos = where_pos + pos_diff;
- order_pos = str->length();
- limit_pos = str->length();
- DBUG_RETURN(0);
- }
- if (result_list->sorted == TRUE)
- {
- if (result_list->desc_flg == TRUE)
- {
- for (
- key_part = key_info->key_part + result_list->key_order,
- length = 1;
- length + result_list->key_order <
- (int) spider_user_defined_key_parts(key_info) &&
- length < result_list->max_order;
- key_part++,
- length++
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- if (
- length + result_list->key_order <=
- (int) spider_user_defined_key_parts(key_info) &&
- length <= result_list->max_order
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- } else {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- }
- }
- } else {
- for (
- key_part = key_info->key_part + result_list->key_order,
- length = 1;
- length + result_list->key_order <
- (int) spider_user_defined_key_parts(key_info) &&
- length < result_list->max_order;
- key_part++,
- length++
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
- SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- if (
- length + result_list->key_order <=
- (int) spider_user_defined_key_parts(key_info) &&
- length <= result_list->max_order
- ) {
- field = key_part->field;
- key_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (length == 1)
- {
- if (str->reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- }
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- } else {
- if (str->reserve(alias_length + key_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- oracle_share->append_column_name(str, field->field_index);
- }
- }
- }
- }
- limit_pos = str->length();
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_limit_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- limit_pos = str->length();
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- limit_pos = str->length();
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- limit_pos = str->length();
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- ha_limit_pos = str->length();
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_limit(str, offset, limit);
- DBUG_PRINT("info",("spider str=%s", str->c_ptr_safe()));
- DBUG_PRINT("info",("spider length=%u", str->length()));
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::reappend_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::reappend_limit_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- str->length(limit_pos);
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- str->length(limit_pos);
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- str->length(limit_pos);
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- str->length(ha_limit_pos);
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_limit(str, offset, limit);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_limit(
- spider_string *str,
- longlong offset,
- longlong limit
-) {
- char buf[SPIDER_LONGLONG_LEN + 1];
- uint32 length;
- DBUG_ENTER("spider_oracle_handler::append_limit");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info", ("spider offset=%lld", offset));
- DBUG_PRINT("info", ("spider limit=%lld", limit));
- if (offset || limit < 9223372036854775807LL)
- {
- if ((int) str->length() == where_pos)
- {
- if (offset)
- {
- int error_num;
- if ((error_num = append_key_order_for_direct_order_limit_with_alias(
- str, NULL, 0)))
- DBUG_RETURN(error_num);
- } else {
- if (str->reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_ROWNUM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- str->q_append(SPIDER_SQL_ROWNUM_STR, SPIDER_SQL_ROWNUM_LEN);
- }
- }
- if (offset)
- {
- if (str->reserve(SPIDER_SQL_BETWEEN_LEN + SPIDER_SQL_AND_LEN +
- ((SPIDER_LONGLONG_LEN) * 2)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_BETWEEN_STR, SPIDER_SQL_BETWEEN_LEN);
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset + 1);
- str->q_append(buf, length);
- str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit + offset);
- str->q_append(buf, length);
- } else {
- if (str->reserve(SPIDER_SQL_HS_LTEQUAL_LEN +
- (SPIDER_LONGLONG_LEN)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HS_LTEQUAL_STR, SPIDER_SQL_HS_LTEQUAL_LEN);
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
- str->q_append(buf, length);
- }
- if (update_rownum_appended)
- {
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_select_lock_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_select_lock_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_select_lock(str);
- DBUG_PRINT("info",("spider str=%s", str->c_ptr_safe()));
- DBUG_PRINT("info",("spider length=%u", str->length()));
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_select_lock(
- spider_string *str
-) {
- int lock_mode = spider_conn_lock_mode(spider);
- DBUG_ENTER("spider_oracle_handler::append_select_lock");
- DBUG_PRINT("info",("spider this=%p", this));
- if (select_rownum_appended)
- {
- table_lock_mode = lock_mode;
- } else {
- if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
- {
- if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
- } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
- {
- if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_union_all_start_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_union_all_start_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_all_start(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_union_all_start(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_union_all_start");
- DBUG_PRINT("info",("spider this=%p", this));
- 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_RETURN(0);
-}
-
-int spider_oracle_handler::append_union_all_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_union_all_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_all(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_union_all(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_union_all");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_UNION_ALL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_union_all_end_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_union_all_end_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_union_all_end(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_union_all_end(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_union_all_end");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(str->length() -
- SPIDER_SQL_UNION_ALL_LEN + SPIDER_SQL_CLOSE_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_multi_range_cnt_part(
- ulong sql_type,
- uint multi_range_cnt,
- bool with_comma
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_multi_range_cnt_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_multi_range_cnt(str, multi_range_cnt, with_comma);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_multi_range_cnt(
- spider_string *str,
- uint multi_range_cnt,
- bool with_comma
-) {
- int range_cnt_length;
- char range_cnt_str[SPIDER_SQL_INT_LEN];
- DBUG_ENTER("spider_oracle_handler::append_multi_range_cnt");
- DBUG_PRINT("info",("spider this=%p", this));
- range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
- multi_range_cnt));
- if (with_comma)
- {
- if (str->reserve(range_cnt_length + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(range_cnt_str, range_cnt_length);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (str->reserve(range_cnt_length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(range_cnt_str, range_cnt_length);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_multi_range_cnt_with_name_part(
- ulong sql_type,
- uint multi_range_cnt
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_multi_range_cnt_with_name_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- str = &sql;
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- str = &tmp_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_multi_range_cnt_with_name(str, multi_range_cnt);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_multi_range_cnt_with_name(
- spider_string *str,
- uint multi_range_cnt
-) {
- int range_cnt_length;
- char range_cnt_str[SPIDER_SQL_INT_LEN];
- DBUG_ENTER("spider_oracle_handler::append_multi_range_cnt_with_name");
- DBUG_PRINT("info",("spider this=%p", this));
- range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
- multi_range_cnt));
- if (str->reserve(range_cnt_length + SPIDER_SQL_SPACE_LEN +
- SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(range_cnt_str, range_cnt_length);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_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_oracle_handler::append_open_handler_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_open_handler(str, handler_id, conn, link_idx);
- exec_ha_sql = str;
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_open_handler(
- spider_string *str,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_open_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider link_idx=%d", link_idx));
- DBUG_PRINT("info",("spider m_handler_cid=%s",
- spider->m_handler_cid[link_idx]));
- if (str->reserve(SPIDER_SQL_HANDLER_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
- if ((error_num = oracle_share->append_table_name(str,
- spider->conn_link_idx[link_idx])))
- DBUG_RETURN(error_num);
- if (str->reserve(SPIDER_SQL_OPEN_LEN + SPIDER_SQL_AS_LEN +
- SPIDER_SQL_HANDLER_CID_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_OPEN_STR, SPIDER_SQL_OPEN_LEN);
- str->q_append(SPIDER_SQL_AS_STR, SPIDER_SQL_AS_LEN);
- str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_close_handler_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_close_handler_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_close_handler(str, link_idx);
- exec_ha_sql = str;
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_close_handler(
- spider_string *str,
- int link_idx
-) {
- DBUG_ENTER("spider_oracle_handler::append_close_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_HANDLER_LEN + SPIDER_SQL_CLOSE_LEN +
- SPIDER_SQL_HANDLER_CID_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
- str->q_append(spider->m_handler_cid[link_idx],
- SPIDER_SQL_HANDLER_CID_LEN);
- str->q_append(SPIDER_SQL_CLOSE_STR, SPIDER_SQL_CLOSE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_insert_terminator_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_insert_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_SQL:
- str = &insert_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_insert_terminator(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_insert_terminator(
- spider_string *str
-) {
- DBUG_ENTER("spider_oracle_handler::append_insert_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider->result_list.insert_dup_update_pushdown)
- {
- DBUG_PRINT("info",("spider add duplicate key update"));
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- if (str->reserve(SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN +
- dup_update_sql.length()))
- {
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_DUPLICATE_KEY_UPDATE_STR,
- SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN);
- if (str->append(dup_update_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- } else {
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_insert_values_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_insert_values_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_SQL:
- str = &insert_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_insert_values(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_insert_values(
- spider_string *str
-) {
- SPIDER_SHARE *share = spider->share;
- TABLE *table = spider->get_table();
- Field **field;
- bool add_value = FALSE;
- DBUG_ENTER("spider_oracle_handler::append_insert_values");
- DBUG_PRINT("info",("spider this=%p", this));
- nextval_pos = 0;
- if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
- {
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- 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
- add_value = TRUE;
- 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 (
- table->next_number_field == *field &&
- !table->auto_increment_field_not_null &&
- !spider->force_auto_increment
- ) {
- nextval_pos = str->length();
- if (str->reserve(oracle_share->nextval_max_length +
- SPIDER_SQL_COMMA_LEN))
- {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->length(str->length() + oracle_share->nextval_max_length);
- } else if ((*field)->is_null())
- {
- if (str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
- {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (
- spider_db_oracle_utility.
- append_column_value(spider, str, *field, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_COMMA_LEN)
- ) {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- }
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- }
- }
- if (add_value)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
- {
- str->length(0);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_into_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_into_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_SQL:
- str = &insert_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_into(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_into(
- spider_string *str
-) {
- const TABLE *table = spider->get_table();
- Field **field;
- uint field_name_length = 0;
- DBUG_ENTER("spider_oracle_handler::append_into");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_INTO_LEN + oracle_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
- insert_table_name_pos = str->length();
- append_table_name_with_adjusting(str, first_link_idx,
- SPIDER_SQL_TYPE_INSERT_SQL);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- for (field = table->field; *field; field++)
- {
- if (
- bitmap_is_set(table->write_set, (*field)->field_index) ||
- bitmap_is_set(table->read_set, (*field)->field_index)
- ) {
- field_name_length =
- oracle_share->column_name_str[(*field)->field_index].length();
- if (str->reserve(field_name_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, (*field)->field_index);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- if (field_name_length)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- if (str->reserve(SPIDER_SQL_VALUES_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
- insert_pos = str->length();
- DBUG_RETURN(0);
-}
-
-void spider_oracle_handler::set_insert_to_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::set_insert_to_pos");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_SQL:
- insert_sql.length(insert_pos);
- break;
- default:
- DBUG_ASSERT(0);
- break;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_handler::append_from_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_from_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_HANDLER:
- str = &ha_sql;
- break;
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- str = &update_sql;
- break;
- default:
- str = &sql;
- break;
- }
- error_num = append_from(str, sql_type, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_from(
- spider_string *str,
- ulong sql_type,
- int link_idx
-) {
- DBUG_ENTER("spider_oracle_handler::append_from");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider link_idx=%d", link_idx));
- if (sql_type == SPIDER_SQL_TYPE_HANDLER)
- {
- ha_table_name_pos = str->length();
- DBUG_PRINT("info",("spider ha_table_name_pos=%u", ha_table_name_pos));
- ha_sql_handler_id = spider->m_handler_id[link_idx];
- DBUG_PRINT("info",("spider ha_sql_handler_id=%u", ha_sql_handler_id));
- if (str->reserve(SPIDER_SQL_HANDLER_CID_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
- DBUG_PRINT("info",("spider m_handler_cid=%s",
- spider->m_handler_cid[link_idx]));
- } else {
- if (str->reserve(SPIDER_SQL_FROM_LEN + oracle_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- table_name_pos = str->length();
- append_table_name_with_adjusting(str, link_idx, sql_type);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_flush_tables_part(
- ulong sql_type,
- int link_idx,
- bool lock
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_flush_tables_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_flush_tables(str, link_idx, lock);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_flush_tables(
- spider_string *str,
- int link_idx,
- bool lock
-) {
- DBUG_ENTER("spider_oracle_handler::append_flush_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- if (lock)
- {
- if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN +
- SPIDER_SQL_WITH_READ_LOCK_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
- str->q_append(SPIDER_SQL_WITH_READ_LOCK_STR,
- SPIDER_SQL_WITH_READ_LOCK_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_optimize_table_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_optimize_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_optimize_table(str, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_optimize_table(
- spider_string *str,
- int link_idx
-) {
- SPIDER_SHARE *share = spider->share;
- int conn_link_idx = spider->conn_link_idx[link_idx];
- int local_length = spider_param_internal_optimize_local(spider->trx->thd,
- share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
- DBUG_ENTER("spider_oracle_handler::append_optimize_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_OPTIMIZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
- local_length +
- oracle_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- oracle_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_OPTIMIZE_STR, SPIDER_SQL_SQL_OPTIMIZE_LEN);
- if (local_length)
- str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
- str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
- oracle_share->append_table_name(str, conn_link_idx);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_analyze_table_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_analyze_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_analyze_table(str, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_analyze_table(
- spider_string *str,
- int link_idx
-) {
- SPIDER_SHARE *share = spider->share;
- int conn_link_idx = spider->conn_link_idx[link_idx];
- int local_length = spider_param_internal_optimize_local(spider->trx->thd,
- share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
- DBUG_ENTER("spider_oracle_handler::append_analyze_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_ANALYZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
- local_length +
- oracle_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- oracle_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_ANALYZE_STR, SPIDER_SQL_SQL_ANALYZE_LEN);
- if (local_length)
- str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
- str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
- oracle_share->append_table_name(str, conn_link_idx);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_repair_table_part(
- ulong sql_type,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_repair_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_repair_table(str, link_idx, check_opt);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_repair_table(
- spider_string *str,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- SPIDER_SHARE *share = spider->share;
- int conn_link_idx = spider->conn_link_idx[link_idx];
- int local_length = spider_param_internal_optimize_local(spider->trx->thd,
- share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
- DBUG_ENTER("spider_oracle_handler::append_repair_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_REPAIR_LEN + SPIDER_SQL_SQL_TABLE_LEN +
- local_length +
- oracle_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- oracle_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_REPAIR_STR, SPIDER_SQL_SQL_REPAIR_LEN);
- if (local_length)
- str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
- str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
- oracle_share->append_table_name(str, conn_link_idx);
- if (check_opt->flags & T_QUICK)
- {
- if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
- }
- if (check_opt->flags & T_EXTEND)
- {
- if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
- }
- if (check_opt->sql_flags & TT_USEFRM)
- {
- if (str->reserve(SPIDER_SQL_SQL_USE_FRM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_USE_FRM_STR, SPIDER_SQL_SQL_USE_FRM_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_check_table_part(
- ulong sql_type,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_check_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_check_table(str, link_idx, check_opt);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_check_table(
- spider_string *str,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int conn_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_oracle_handler::append_check_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_CHECK_TABLE_LEN +
- oracle_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- oracle_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_CHECK_TABLE_STR,
- SPIDER_SQL_SQL_CHECK_TABLE_LEN);
- oracle_share->append_table_name(str, conn_link_idx);
- if (check_opt->flags & T_QUICK)
- {
- if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
- }
- if (check_opt->flags & T_FAST)
- {
- if (str->reserve(SPIDER_SQL_SQL_FAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_FAST_STR, SPIDER_SQL_SQL_FAST_LEN);
- }
- if (check_opt->flags & T_MEDIUM)
- {
- if (str->reserve(SPIDER_SQL_SQL_MEDIUM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_MEDIUM_STR, SPIDER_SQL_SQL_MEDIUM_LEN);
- }
- if (check_opt->flags & T_EXTEND)
- {
- if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_enable_keys_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_enable_keys_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_enable_keys(str, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_enable_keys(
- spider_string *str,
- int link_idx
-) {
- int conn_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_oracle_handler::append_enable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
- oracle_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- oracle_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_ENABLE_KEYS_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
- SPIDER_SQL_SQL_ALTER_TABLE_LEN);
- oracle_share->append_table_name(str, conn_link_idx);
- str->q_append(SPIDER_SQL_SQL_ENABLE_KEYS_STR,
- SPIDER_SQL_SQL_ENABLE_KEYS_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_disable_keys_part(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_disable_keys_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_disable_keys(str, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_disable_keys(
- spider_string *str,
- int link_idx
-) {
- int conn_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_oracle_handler::append_disable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
- oracle_share->db_names_str[conn_link_idx].length() +
- SPIDER_SQL_DOT_LEN +
- oracle_share->table_names_str[conn_link_idx].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_DISABLE_KEYS_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
- SPIDER_SQL_SQL_ALTER_TABLE_LEN);
- oracle_share->append_table_name(str, conn_link_idx);
- str->q_append(SPIDER_SQL_SQL_DISABLE_KEYS_STR,
- SPIDER_SQL_SQL_DISABLE_KEYS_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_delete_all_rows_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_delete_all_rows_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_DELETE_SQL:
- str = &update_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_delete_all_rows(str, sql_type);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_delete_all_rows(
- spider_string *str,
- ulong sql_type
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_delete_all_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- if (spider->sql_command == SQLCOM_TRUNCATE)
- {
- if ((error_num = append_truncate(str, sql_type, first_link_idx)))
- DBUG_RETURN(error_num);
- } else {
- if (
- (error_num = append_delete(str)) ||
- (error_num = append_from(str, sql_type, first_link_idx))
- )
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_truncate(
- spider_string *str,
- ulong sql_type,
- int link_idx
-) {
- DBUG_ENTER("spider_oracle_handler::append_truncate");
- if (str->reserve(SPIDER_SQL_TRUNCATE_TABLE_LEN +
- oracle_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_TRUNCATE_TABLE_STR, SPIDER_SQL_TRUNCATE_TABLE_LEN);
- table_name_pos = str->length();
- append_table_name_with_adjusting(str, link_idx, sql_type);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_explain_select_part(
- key_range *start_key,
- key_range *end_key,
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_oracle_handler::append_explain_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_SQL:
- str = &spider->result_list.sqls[link_idx];
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num =
- append_explain_select(str, start_key, end_key, sql_type, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_explain_select(
- spider_string *str,
- key_range *start_key,
- key_range *end_key,
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_explain_select");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(SPIDER_SQL_EXPLAIN_SELECT_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_EXPLAIN_SELECT_STR, SPIDER_SQL_EXPLAIN_SELECT_LEN);
- if (
- (error_num = append_from(str, sql_type, link_idx)) ||
- (error_num = append_key_where(str, NULL, NULL, start_key, end_key,
- sql_type, FALSE))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- DBUG_RETURN(0);
-}
-
-bool spider_oracle_handler::is_bulk_insert_exec_period(
- bool bulk_end
-) {
- DBUG_ENTER("spider_oracle_handler::is_bulk_insert_exec_period");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider insert_sql.length=%u", insert_sql.length()));
- DBUG_PRINT("info",("spider insert_pos=%d", insert_pos));
- DBUG_PRINT("info",("spider insert_sql=%s", insert_sql.c_ptr_safe()));
- if (
-/*
- (bulk_end || (int) insert_sql.length() >= spider->bulk_size) &&
-*/
- (int) insert_sql.length() > insert_pos
- ) {
- DBUG_RETURN(TRUE);
- }
- DBUG_RETURN(FALSE);
-}
-
-bool spider_oracle_handler::sql_is_filled_up(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::sql_is_filled_up");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(filled_up);
-}
-
-bool spider_oracle_handler::sql_is_empty(
- ulong sql_type
-) {
- bool is_empty;
- DBUG_ENTER("spider_oracle_handler::sql_is_empty");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- is_empty = (sql.length() == 0);
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- is_empty = (insert_sql.length() == 0);
- break;
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- is_empty = (update_sql.length() == 0);
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- is_empty = (tmp_sql.length() == 0);
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- is_empty = (ha_sql.length() == 0);
- break;
- default:
- is_empty = TRUE;
- break;
- }
- DBUG_RETURN(is_empty);
-}
-
-bool spider_oracle_handler::support_multi_split_read()
-{
- DBUG_ENTER("spider_oracle_handler::support_multi_split_read");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-bool spider_oracle_handler::support_bulk_update()
-{
- DBUG_ENTER("spider_oracle_handler::support_bulk_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_oracle_handler::bulk_tmp_table_insert()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = store_sql_to_bulk_tmp_table(&update_sql, upd_tmp_tbl);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::bulk_tmp_table_insert(
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = store_sql_to_bulk_tmp_table(
- &spider->result_list.update_sqls[link_idx],
- spider->result_list.upd_tmp_tbls[link_idx]);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::bulk_tmp_table_end_bulk_insert()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_end_bulk_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = upd_tmp_tbl->file->ha_end_bulk_insert()))
- {
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::bulk_tmp_table_rnd_init()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_rnd_init");
- DBUG_PRINT("info",("spider this=%p", this));
- upd_tmp_tbl->file->extra(HA_EXTRA_CACHE);
- if ((error_num = upd_tmp_tbl->file->ha_rnd_init(TRUE)))
- {
- DBUG_RETURN(error_num);
- }
- reading_from_bulk_tmp_table = TRUE;
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::bulk_tmp_table_rnd_next()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_rnd_next");
- DBUG_PRINT("info",("spider this=%p", this));
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
- error_num = upd_tmp_tbl->file->ha_rnd_next(upd_tmp_tbl->record[0]);
-#else
- error_num = upd_tmp_tbl->file->rnd_next(upd_tmp_tbl->record[0]);
-#endif
- if (!error_num)
- {
- error_num = restore_sql_from_bulk_tmp_table(&insert_sql, upd_tmp_tbl);
- }
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::bulk_tmp_table_rnd_end()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_rnd_end");
- DBUG_PRINT("info",("spider this=%p", this));
- reading_from_bulk_tmp_table = FALSE;
- if ((error_num = upd_tmp_tbl->file->ha_rnd_end()))
- {
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-bool spider_oracle_handler::need_copy_for_update(
- int link_idx
-) {
- int all_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_oracle_handler::need_copy_for_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(!oracle_share->same_db_table_name ||
- spider->share->link_statuses[all_link_idx] == SPIDER_LINK_STATUS_RECOVERY);
-}
-
-bool spider_oracle_handler::bulk_tmp_table_created()
-{
- DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_created");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(upd_tmp_tbl);
-}
-
-int spider_oracle_handler::mk_bulk_tmp_table_and_bulk_start()
-{
- THD *thd = spider->trx->thd;
- TABLE *table = spider->get_table();
- DBUG_ENTER("spider_oracle_handler::mk_bulk_tmp_table_and_bulk_start");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!upd_tmp_tbl)
- {
- if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
- thd, table, &upd_tmp_tbl_prm, "a", update_sql.charset())))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- upd_tmp_tbl->file->extra(HA_EXTRA_WRITE_CACHE);
- upd_tmp_tbl->file->ha_start_bulk_insert((ha_rows) 0);
- }
- DBUG_RETURN(0);
-}
-
-void spider_oracle_handler::rm_bulk_tmp_table()
-{
- DBUG_ENTER("spider_oracle_handler::rm_bulk_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- if (upd_tmp_tbl)
- {
- spider_rm_sys_tmp_table(spider->trx->thd, upd_tmp_tbl, &upd_tmp_tbl_prm);
- upd_tmp_tbl = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_handler::store_sql_to_bulk_tmp_table(
- spider_string *str,
- TABLE *tmp_table
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::store_sql_to_bulk_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_table->field[0]->set_notnull();
- tmp_table->field[0]->store(str->ptr(), str->length(), str->charset());
- if ((error_num = tmp_table->file->ha_write_row(tmp_table->record[0])))
- DBUG_RETURN(error_num);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::restore_sql_from_bulk_tmp_table(
- spider_string *str,
- TABLE *tmp_table
-) {
- DBUG_ENTER("spider_oracle_handler::restore_sql_from_bulk_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_table->field[0]->val_str(str->get_str());
- str->mem_calc();
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::insert_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx
-) {
- spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash2 = &link_for_hash[link_idx];
- DBUG_ENTER("spider_oracle_handler::insert_lock_tables_list");
- DBUG_PRINT("info",("spider this=%p", this));
- uint old_elements =
- db_conn->lock_table_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(
- &db_conn->lock_table_hash,
- tmp_link_for_hash2->db_table_str_hash_value,
- (uchar*) tmp_link_for_hash2))
-#else
- if (my_hash_insert(&db_conn->lock_table_hash,
- (uchar*) tmp_link_for_hash2))
-#endif
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (db_conn->lock_table_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- db_conn->lock_table_hash,
- (db_conn->lock_table_hash.array.max_element - old_elements) *
- db_conn->lock_table_hash.array.size_of_element);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::append_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx,
- int *appended
-) {
- int error_num;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash, *tmp_link_for_hash2;
- int conn_link_idx = spider->conn_link_idx[link_idx];
- spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
- DBUG_ENTER("spider_oracle_handler::append_lock_tables_list");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_link_for_hash2 = &link_for_hash[link_idx];
- tmp_link_for_hash2->db_table_str =
- &oracle_share->db_table_str[conn_link_idx];
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- tmp_link_for_hash2->db_table_str_hash_value =
- oracle_share->db_table_str_hash_value[conn_link_idx];
- if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *)
- my_hash_search_using_hash_value(
- &db_conn->lock_table_hash,
- tmp_link_for_hash2->db_table_str_hash_value,
- (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
- tmp_link_for_hash2->db_table_str->length())))
-#else
- if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *) my_hash_search(
- &db_conn->lock_table_hash,
- (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
- tmp_link_for_hash2->db_table_str->length())))
-#endif
- {
- if ((error_num = insert_lock_tables_list(conn, link_idx)))
- DBUG_RETURN(error_num);
- *appended = 1;
- } else {
- if (tmp_link_for_hash->spider->lock_type < spider->lock_type)
- {
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(
- &db_conn->lock_table_hash,
- tmp_link_for_hash->db_table_str_hash_value,
- (uchar*) tmp_link_for_hash);
-#else
- my_hash_delete(&db_conn->lock_table_hash,
- (uchar*) tmp_link_for_hash);
-#endif
- uint old_elements =
- db_conn->lock_table_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(
- &db_conn->lock_table_hash,
- tmp_link_for_hash2->db_table_str_hash_value,
- (uchar*) tmp_link_for_hash2))
-#else
- if (my_hash_insert(&db_conn->lock_table_hash,
- (uchar*) tmp_link_for_hash2))
-#endif
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (db_conn->lock_table_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- db_conn->lock_table_hash,
- (db_conn->lock_table_hash.array.max_element - old_elements) *
- db_conn->lock_table_hash.array.size_of_element);
- }
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_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_oracle_handler::realloc_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((int) sql.alloced_length() > init_sql_alloc_size * 2)
- {
- sql.free();
- if (sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
- }
- if ((int) ha_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- ha_sql.free();
- if (ha_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
- }
- if ((int) dup_update_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- dup_update_sql.free();
- if (dup_update_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if ((int) insert_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- insert_sql.free();
- if (insert_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= SPIDER_SQL_TYPE_INSERT_SQL;
- }
- if ((int) update_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- update_sql.free();
- if (update_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL);
- }
- update_sql.length(0);
- if ((int) tmp_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- tmp_sql.free();
- if (tmp_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= SPIDER_SQL_TYPE_TMP_SQL;
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reset_sql(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
- {
- table_lock_mode = 0;
- select_rownum_appended = FALSE;
- sql.length(0);
- }
- if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
- {
- insert_sql.length(0);
- }
- if (sql_type & (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL |
- SPIDER_SQL_TYPE_BULK_UPDATE_SQL))
- {
- update_rownum_appended = FALSE;
- update_set_pos = 0;
- update_sql.length(0);
- }
- if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
- {
- tmp_sql.length(0);
- }
- if (sql_type & SPIDER_SQL_TYPE_HANDLER)
- {
- ha_sql.length(0);
- }
- DBUG_RETURN(0);
-}
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_oracle_handler::reset_keys(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reset_upds(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_upds.clear();
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reset_strs(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_strs");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reset_strs_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_strs_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::push_back_upds(
- SPIDER_HS_STRING_REF &info
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::push_back_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = hs_upds.push_back(info);
- DBUG_RETURN(error_num);
-}
-#endif
-
-bool spider_oracle_handler::need_lock_before_set_sql_for_exec(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::need_lock_before_set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_oracle_handler::set_sql_for_exec(
- ulong sql_type,
- int link_idx
-) {
- int error_num;
- uint tmp_pos;
- SPIDER_SHARE *share = spider->share;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- int all_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_oracle_handler::set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & (SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL))
- {
- if (table_lock_mode)
- {
- spider_string *str = &result_list->insert_sqls[link_idx];
- str->length(0);
- if (str->reserve(SPIDER_SQL_LOCK_TABLE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
- if ((error_num = oracle_share->append_table_name(str, all_link_idx)))
- DBUG_RETURN(error_num);
- if (table_lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
- {
- if (str->reserve(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR,
- SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN);
- } else if (table_lock_mode == SPIDER_LOCK_MODE_SHARED)
- {
- if (str->reserve(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR,
- SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN);
- }
- exec_lock_sql = str;
- }
-
- if (oracle_share->same_db_table_name || link_idx == first_link_idx)
- {
- if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
- exec_sql = &sql;
- if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
- exec_tmp_sql = &tmp_sql;
- } else {
- char tmp_table_name[MAX_FIELD_WIDTH * 2],
- tgt_table_name[MAX_FIELD_WIDTH * 2];
- int tmp_table_name_length;
- spider_string tgt_table_name_str(tgt_table_name,
- MAX_FIELD_WIDTH * 2,
- oracle_share->db_names_str[link_idx].charset());
- const char *table_names[2], *table_aliases[2];
- uint table_name_lengths[2], table_alias_lengths[2];
- tgt_table_name_str.init_calc_mem(212);
- tgt_table_name_str.length(0);
- if (result_list->tmp_table_join && spider->bka_mode != 2)
- {
- create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
- link_idx);
- append_table_name_with_adjusting(&tgt_table_name_str, link_idx,
- SPIDER_SQL_TYPE_TMP_SQL);
- table_names[0] = tmp_table_name;
- table_names[1] = tgt_table_name_str.ptr();
- table_name_lengths[0] = tmp_table_name_length;
- table_name_lengths[1] = tgt_table_name_str.length();
- table_aliases[0] = SPIDER_SQL_A_STR;
- table_aliases[1] = SPIDER_SQL_B_STR;
- table_alias_lengths[0] = SPIDER_SQL_A_LEN;
- table_alias_lengths[1] = SPIDER_SQL_B_LEN;
- }
- if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
- {
- exec_sql = &result_list->sqls[link_idx];
- if (exec_sql->copy(sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- else if (result_list->use_union)
- {
- if ((error_num = reset_union_table_name(exec_sql, link_idx,
- SPIDER_SQL_TYPE_SELECT_SQL)))
- DBUG_RETURN(error_num);
- } else {
- tmp_pos = exec_sql->length();
- exec_sql->length(table_name_pos);
- if (result_list->tmp_table_join && spider->bka_mode != 2)
- {
- if ((error_num = spider_db_oracle_utility.append_from_with_alias(
- exec_sql, table_names, table_name_lengths,
- table_aliases, table_alias_lengths, 2,
- &table_name_pos, TRUE))
- )
- DBUG_RETURN(error_num);
- exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- } else {
- append_table_name_with_adjusting(exec_sql, link_idx,
- SPIDER_SQL_TYPE_SELECT_SQL);
- }
- exec_sql->length(tmp_pos);
- }
- }
- if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
- {
- exec_tmp_sql = &result_list->tmp_sqls[link_idx];
- if (result_list->tmp_table_join && spider->bka_mode != 2)
- {
- if (exec_tmp_sql->copy(tmp_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- else {
- tmp_pos = exec_tmp_sql->length();
- exec_tmp_sql->length(tmp_sql_pos1);
- exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
- exec_tmp_sql->length(tmp_sql_pos2);
- exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
- exec_tmp_sql->length(tmp_sql_pos3);
- exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
- exec_tmp_sql->length(tmp_pos);
- }
- }
- }
- }
- }
- if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
- {
- if (oracle_share->same_db_table_name || link_idx == first_link_idx)
- exec_insert_sql = &insert_sql;
- else {
- exec_insert_sql = &result_list->insert_sqls[link_idx];
- if (exec_insert_sql->copy(insert_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_PRINT("info",("spider exec_insert_sql=%s",
- exec_insert_sql->c_ptr_safe()));
- tmp_pos = exec_insert_sql->length();
- exec_insert_sql->length(insert_table_name_pos);
- append_table_name_with_adjusting(exec_insert_sql, link_idx,
- sql_type);
- exec_insert_sql->length(tmp_pos);
- DBUG_PRINT("info",("spider exec_insert_sql->length=%u",
- exec_insert_sql->length()));
- DBUG_PRINT("info",("spider exec_insert_sql=%s",
- exec_insert_sql->c_ptr_safe()));
- }
- if (nextval_pos)
- {
- memcpy((uchar *) exec_insert_sql->ptr() + nextval_pos,
- oracle_share->nextval_str[all_link_idx].ptr(),
- oracle_share->nextval_max_length);
- }
- }
- if (sql_type & SPIDER_SQL_TYPE_BULK_UPDATE_SQL)
- {
- if (reading_from_bulk_tmp_table)
- {
- if (
- oracle_share->same_db_table_name &&
- share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
- ) {
- exec_update_sql = &insert_sql;
- } else if (!spider->result_list.upd_tmp_tbls[link_idx])
- {
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- } else {
- exec_update_sql = &spider->result_list.insert_sqls[link_idx];
- if ((error_num = restore_sql_from_bulk_tmp_table(exec_update_sql,
- spider->result_list.upd_tmp_tbls[link_idx])))
- {
- DBUG_RETURN(error_num);
- }
- }
- } else {
- if (
- oracle_share->same_db_table_name &&
- share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
- ) {
- exec_update_sql = &update_sql;
- } else {
- exec_update_sql = &spider->result_list.update_sqls[link_idx];
- }
- }
- DBUG_PRINT("info",("spider exec_update_sql=%s",
- exec_update_sql->c_ptr_safe()));
- } else if (sql_type &
- (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL))
- {
- if (oracle_share->same_db_table_name || link_idx == first_link_idx)
- exec_update_sql = &update_sql;
- else {
- exec_update_sql = &spider->result_list.update_sqls[link_idx];
- if (exec_update_sql->copy(update_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- tmp_pos = exec_update_sql->length();
- exec_update_sql->length(table_name_pos);
- append_table_name_with_adjusting(exec_update_sql, link_idx,
- sql_type);
- exec_update_sql->length(tmp_pos);
- }
- DBUG_PRINT("info",("spider exec_update_sql=%s",
- exec_update_sql->c_ptr_safe()));
- }
- if (sql_type & SPIDER_SQL_TYPE_HANDLER)
- {
- if (spider->m_handler_id[link_idx] == ha_sql_handler_id)
- exec_ha_sql = &ha_sql;
- else {
- exec_ha_sql = &result_list->sqls[link_idx];
- if (exec_ha_sql->copy(ha_sql))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- else {
- tmp_pos = exec_ha_sql->length();
- exec_ha_sql->length(ha_table_name_pos);
- append_table_name_with_adjusting(exec_ha_sql, link_idx,
- SPIDER_SQL_TYPE_HANDLER);
- exec_ha_sql->length(tmp_pos);
- }
- }
- DBUG_PRINT("info",("spider exec_ha_sql=%s",
- exec_ha_sql->c_ptr_safe()));
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::set_sql_for_exec(
- spider_db_copy_table *tgt_ct,
- ulong sql_type
-) {
- spider_oracle_copy_table *oracle_ct = (spider_oracle_copy_table *) tgt_ct;
- DBUG_ENTER("spider_oracle_handler::set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_SQL:
- exec_insert_sql = &oracle_ct->sql;
- break;
- default:
- DBUG_ASSERT(0);
- break;
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::execute_sql(
- ulong sql_type,
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
-) {
- spider_string *tgt_sql;
- uint tgt_length;
- DBUG_ENTER("spider_oracle_handler::execute_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_SQL:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
- tgt_sql = exec_sql;
- tgt_length = tgt_sql->length();
- if (table_lock_mode)
- {
- DBUG_PRINT("info",("spider table_lock_mode=%d", table_lock_mode));
- spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
- db_conn->table_lock_mode = table_lock_mode;
- db_conn->exec_lock_sql = exec_lock_sql;
- table_lock_mode = 0;
- }
- break;
- case SPIDER_SQL_TYPE_INSERT_SQL:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
- tgt_sql = exec_insert_sql;
- tgt_length = tgt_sql->length();
- break;
- case SPIDER_SQL_TYPE_UPDATE_SQL:
- case SPIDER_SQL_TYPE_DELETE_SQL:
- case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
- DBUG_PRINT("info",("spider %s",
- sql_type == SPIDER_SQL_TYPE_UPDATE_SQL ? "SPIDER_SQL_TYPE_UPDATE_SQL" :
- sql_type == SPIDER_SQL_TYPE_DELETE_SQL ? "SPIDER_SQL_TYPE_DELETE_SQL" :
- "SPIDER_SQL_TYPE_BULK_UPDATE_SQL"
- ));
- tgt_sql = exec_update_sql;
- tgt_length = tgt_sql->length();
- break;
- case SPIDER_SQL_TYPE_TMP_SQL:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_TMP_SQL"));
- tgt_sql = exec_tmp_sql;
- tgt_length = tgt_sql->length();
- break;
- case SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL"));
- tgt_sql = exec_tmp_sql;
- tgt_length = tmp_sql_pos5;
- break;
- case SPIDER_SQL_TYPE_HANDLER:
- DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_HANDLER"));
- tgt_sql = exec_ha_sql;
- tgt_length = tgt_sql->length();
- break;
- default:
- /* nothing to do */
- DBUG_PRINT("info",("spider default"));
- DBUG_RETURN(0);
- }
- DBUG_RETURN(spider_db_query(
- conn,
- tgt_sql->ptr(),
- tgt_length,
- quick_mode,
- need_mon
- ));
-}
-
-int spider_oracle_handler::reset()
-{
- DBUG_ENTER("spider_oracle_handler::reset");
- DBUG_PRINT("info",("spider this=%p", this));
- update_sql.length(0);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::sts_mode_exchange(
- int sts_mode
-) {
- DBUG_ENTER("spider_oracle_handler::sts_mode_exchange");
- DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
- DBUG_RETURN(1);
-}
-
-int spider_oracle_handler::show_table_status(
- int link_idx,
- int sts_mode,
- uint flag
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_DB_RESULT *res;
- SPIDER_SHARE *share = spider->share;
- uint pos = (2 * spider->conn_link_idx[link_idx]);
- DBUG_ENTER("spider_oracle_handler::show_table_status");
- DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
- if (
- (flag & HA_STATUS_AUTO) &&
- (error_num = show_autoinc(link_idx))
- ) {
- DBUG_RETURN(error_num);
- }
-
- if (sts_mode == 1)
- {
-/*
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- oracle_share->show_table_status[0 + pos].ptr(),
- oracle_share->show_table_status[0 + pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
-*/
- /* retry */
-/*
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- oracle_share->show_table_status[0 + pos].ptr(),
- oracle_share->show_table_status[0 + pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- if (error_num || (error_num = spider_db_errorno(conn)))
- DBUG_RETURN(error_num);
- else {
- my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
- ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
- oracle_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
- oracle_share->table_names_str[spider->conn_link_idx[
- link_idx]].ptr());
- DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
- }
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- error_num = res->fetch_table_status(
- sts_mode,
- share->records,
- share->mean_rec_length,
- share->data_file_length,
- share->max_data_file_length,
- share->index_file_length,
- share->auto_increment_value,
- share->create_time,
- share->update_time,
- share->check_time
- );
- res->free_result();
- delete res;
- if (error_num)
- DBUG_RETURN(error_num);
-*/
- if (!share->records)
- share->records = 10000;
- share->mean_rec_length = 65535;
- share->data_file_length = 65535;
- share->max_data_file_length = 65535;
- share->index_file_length = 65535;
-/*
- share->auto_increment_value = 0;
-*/
- share->create_time = (time_t) 0;
- share->update_time = (time_t) 0;
- share->check_time = (time_t) 0;
- } else {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- oracle_share->show_table_status[1 + pos].ptr(),
- oracle_share->show_table_status[1 + pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- oracle_share->show_table_status[1 + pos].ptr(),
- oracle_share->show_table_status[1 + pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- if (error_num || (error_num = spider_db_errorno(conn)))
- DBUG_RETURN(error_num);
- else
- DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- error_num = res->fetch_table_status(
- sts_mode,
- share->records,
- share->mean_rec_length,
- share->data_file_length,
- share->max_data_file_length,
- share->index_file_length,
- share->auto_increment_value,
- share->create_time,
- share->update_time,
- share->check_time
- );
- res->free_result();
- delete res;
- if (error_num)
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::crd_mode_exchange(
- int crd_mode
-) {
- DBUG_ENTER("spider_oracle_handler::crd_mode_exchange");
- DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
- DBUG_RETURN(1);
-}
-
-int spider_oracle_handler::show_index(
- int link_idx,
- int crd_mode
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_SHARE *share = spider->share;
- TABLE *table = spider->get_table();
- SPIDER_DB_RESULT *res;
- int roop_count;
- longlong *tmp_cardinality;
- uint pos = (2 * spider->conn_link_idx[link_idx]);
- DBUG_ENTER("spider_oracle_handler::show_index");
- DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
- if (crd_mode == 1)
- {
-/*
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- oracle_share->show_index[0 + pos].ptr(),
- oracle_share->show_index[0 + pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
-*/
- /* retry */
-/*
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- oracle_share->show_index[0 + pos].ptr(),
- oracle_share->show_index[0 + pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
-*/
- /* no record is ok */
-/*
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- if (res)
- {
- error_num = res->fetch_table_cardinality(
- crd_mode,
- table,
- share->cardinality,
- share->cardinality_upd,
- share->bitmap_size
- );
- }
-*/
- for (roop_count = 0, tmp_cardinality = share->cardinality;
- roop_count < (int) table->s->fields;
- roop_count++, tmp_cardinality++)
- {
- if (!spider_bit_is_set(share->cardinality_upd, roop_count))
- {
- DBUG_PRINT("info",
- ("spider init column cardinality id=%d", roop_count));
- *tmp_cardinality = 1;
- }
- }
-/*
- if (res)
- {
- res->free_result();
- delete res;
- }
- if (error_num)
- DBUG_RETURN(error_num);
-*/
- } else {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- oracle_share->show_index[1 + pos].ptr(),
- oracle_share->show_index[1 + pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- oracle_share->show_index[1 + pos].ptr(),
- oracle_share->show_index[1 + pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- /* no record is ok */
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- if (res)
- {
- error_num = res->fetch_table_cardinality(
- crd_mode,
- table,
- share->cardinality,
- share->cardinality_upd,
- share->bitmap_size
- );
- }
- for (roop_count = 0, tmp_cardinality = share->cardinality;
- roop_count < (int) table->s->fields;
- roop_count++, tmp_cardinality++)
- {
- if (!spider_bit_is_set(share->cardinality_upd, roop_count))
- {
- DBUG_PRINT("info",
- ("spider init column cardinality id=%d", roop_count));
- *tmp_cardinality = 1;
- }
- }
- if (res)
- {
- res->free_result();
- delete res;
- }
- if (error_num)
- DBUG_RETURN(error_num);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::show_records(
- int link_idx
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_DB_RESULT *res;
- SPIDER_SHARE *share = spider->share;
- uint pos = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_oracle_handler::show_records");
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- oracle_share->show_records[pos].ptr(),
- oracle_share->show_records[pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- oracle_share->show_records[pos].ptr(),
- oracle_share->show_records[pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
- DBUG_RETURN(error_num);
- } else {
- DBUG_PRINT("info", ("spider error_num=%d 6",
- ER_QUERY_ON_FOREIGN_DATA_SOURCE));
- DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
- }
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- error_num = res->fetch_table_records(
- 1,
- share->records
- );
- res->free_result();
- delete res;
- if (error_num)
- {
- DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
- DBUG_RETURN(error_num);
- }
- spider->trx->direct_aggregate_count++;
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::show_autoinc(
- int link_idx
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_DB_RESULT *res;
- SPIDER_SHARE *share = spider->share;
- uint pos = spider->conn_link_idx[link_idx];
- ulonglong auto_increment_value;
- DBUG_ENTER("spider_oracle_handler::show_autoinc");
- if (!oracle_share->show_autoinc)
- DBUG_RETURN(0);
-
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- oracle_share->show_autoinc[pos].ptr(),
- oracle_share->show_autoinc[pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- oracle_share->show_records[pos].ptr(),
- oracle_share->show_records[pos].length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
- DBUG_RETURN(spider_db_errorno(conn));
- }
- } else {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
- DBUG_RETURN(error_num);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
- DBUG_RETURN(error_num);
- } else {
- DBUG_PRINT("info", ("spider error_num=%d 6",
- ER_QUERY_ON_FOREIGN_DATA_SOURCE));
- DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
- }
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- error_num = res->fetch_table_records(
- 1,
- auto_increment_value
- );
- res->free_result();
- delete res;
- if (error_num)
- {
- DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
- DBUG_RETURN(error_num);
- }
- if (auto_increment_value >= share->auto_increment_value)
- {
- share->auto_increment_value = auto_increment_value + 1;
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::show_last_insert_id(
- int link_idx,
- ulonglong &last_insert_id
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_DB_RESULT *res;
- uint pos = spider->conn_link_idx[link_idx];
- spider_db_oracle *db_oracle = (spider_db_oracle *) conn->db_conn;
- DBUG_ENTER("spider_oracle_handler::show_last_insert_id");
- if (!oracle_share->show_last_insert_id)
- {
- DBUG_ASSERT(0);
- last_insert_id = 0;
- db_oracle->stored_last_insert_id = 0;
- DBUG_RETURN(0);
- }
-
- if (
- spider_db_query(
- conn,
- oracle_share->show_last_insert_id[pos].ptr(),
- oracle_share->show_last_insert_id[pos].length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- ) {
- DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
- DBUG_RETURN(error_num);
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
- DBUG_RETURN(error_num);
- } else {
- DBUG_PRINT("info", ("spider error_num=%d 6",
- ER_QUERY_ON_FOREIGN_DATA_SOURCE));
- DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
- }
- }
- error_num = res->fetch_table_records(
- 1,
- last_insert_id
- );
- res->free_result();
- delete res;
- if (error_num)
- {
- DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
- DBUG_RETURN(error_num);
- }
- db_oracle->stored_last_insert_id = last_insert_id;
- DBUG_RETURN(0);
-}
-
-ha_rows spider_oracle_handler::explain_select(
- key_range *start_key,
- key_range *end_key,
- int link_idx
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- spider_string *str = &result_list->sqls[link_idx];
- SPIDER_DB_RESULT *res;
- ha_rows rows;
- spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
- DBUG_ENTER("spider_oracle_handler::explain_select");
- if ((error_num = dbton_hdl->append_explain_select_part(
- start_key, end_key, SPIDER_SQL_TYPE_OTHER_SQL, link_idx)))
- {
- my_errno = error_num;
- DBUG_RETURN(HA_POS_ERROR);
- }
-
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- spider_conn_queue_connect_rewrite(spider->share, conn, link_idx);
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- spider->share);
- if (
- (error_num = spider_db_set_names(spider, conn, link_idx)) ||
- (
- spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx]) &&
- (error_num = spider_db_errorno(conn))
- )
- ) {
- if (
- error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
- !conn->disable_reconnect
- ) {
- /* retry */
- if ((error_num = spider_db_ping(spider, conn, link_idx)))
- {
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- spider->share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- error_num = spider_db_errorno(conn);
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- } else {
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- }
- 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 = 1;
- request_key.next = NULL;
- if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
- {
- if (error_num || (error_num = spider_db_errorno(conn)))
- {
- if (spider->check_error_mode(error_num))
- my_errno = error_num;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- } else {
- my_errno = ER_QUERY_ON_FOREIGN_DATA_SOURCE;
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(HA_POS_ERROR);
- }
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- error_num = res->fetch_table_records(
- 2,
- rows
- );
- res->free_result();
- delete res;
- if (error_num)
- {
- my_errno = error_num;
- DBUG_RETURN(HA_POS_ERROR);
- }
- DBUG_RETURN(rows);
-}
-
-int spider_oracle_handler::lock_tables(
- int link_idx
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- spider_string *str = &sql;
- DBUG_ENTER("spider_oracle_handler::lock_tables");
- do {
- str->length(0);
- if ((error_num = conn->db_conn->append_lock_tables(str)))
- {
- DBUG_RETURN(error_num);
- }
- if (str->length())
- {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- spider->share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- DBUG_RETURN(spider_db_errorno(conn));
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- if (!conn->table_locked)
- {
- conn->table_locked = TRUE;
- spider->trx->locked_connections++;
- }
- } while (str->length());
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::unlock_tables(
- int link_idx
-) {
- int error_num;
- SPIDER_CONN *conn = spider->conns[link_idx];
- DBUG_ENTER("spider_oracle_handler::unlock_tables");
- if (conn->table_locked)
- {
- if ((error_num = conn->db_conn->commit(&spider->need_mons[link_idx])))
- {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::disable_keys(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_oracle_handler::disable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_disable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::enable_keys(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_oracle_handler::enable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_enable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::check_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_oracle_handler::check_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_check_table_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx, check_opt)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::repair_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_oracle_handler::repair_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_repair_table_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx, check_opt)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::analyze_table(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_oracle_handler::analyze_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_analyze_table_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::optimize_table(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_oracle_handler::optimize_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_optimize_table_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx)))
- {
- DBUG_RETURN(error_num);
- }
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- conn->need_mon = &spider->need_mons[link_idx];
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, link_idx)))
- {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::flush_tables(
- SPIDER_CONN *conn,
- int link_idx,
- bool lock
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_oracle_handler::flush_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- if ((error_num = append_flush_tables_part(SPIDER_SQL_TYPE_OTHER_HS,
- link_idx, lock)))
- {
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- str->ptr(),
- str->length(),
- -1,
- &spider->need_mons[link_idx])
- ) {
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::flush_logs(
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_oracle_handler::flush_logs");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
- share);
- if (spider_db_query(
- conn,
- SPIDER_SQL_FLUSH_LOGS_STR,
- SPIDER_SQL_FLUSH_LOGS_LEN,
- -1,
- &spider->need_mons[link_idx])
- ) {
- error_num = spider_db_errorno(conn);
- DBUG_RETURN(error_num);
- }
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::insert_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
-) {
- spider_db_oracle *db_conn = (spider_db_oracle *) 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_oracle_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_oracle_handler::delete_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
-) {
- spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
- uint roop_count, elements = db_conn->handler_open_array.elements;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
- DBUG_ENTER("spider_oracle_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_oracle_handler::sync_from_clone_source(
- spider_db_handler *dbton_hdl
-) {
- DBUG_ENTER("spider_oracle_handler::sync_from_clone_source");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-bool spider_oracle_handler::support_use_handler(
- int use_handler
-) {
- DBUG_ENTER("spider_oracle_handler::support_use_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-bool spider_oracle_handler::minimum_select_bit_is_set(
- uint field_index
-) {
- TABLE *table = spider->get_table();
- DBUG_ENTER("spider_oracle_handler::minimum_select_bit_is_set");
- DBUG_RETURN(
- 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)
- );
-}
-
-void spider_oracle_handler::copy_minimum_select_bitmap(
- uchar *bitmap
-) {
- int roop_count;
- TABLE *table = spider->get_table();
- DBUG_ENTER("spider_oracle_handler::copy_minimum_select_bitmap");
- for (roop_count = 0;
- roop_count < (int) ((table->s->fields + 7) / 8);
- roop_count++)
- {
- bitmap[roop_count] =
- spider->searched_bitmap[roop_count] |
- ((uchar *) table->read_set->bitmap)[roop_count] |
- ((uchar *) table->write_set->bitmap)[roop_count];
- DBUG_PRINT("info",("spider roop_count=%d", roop_count));
- DBUG_PRINT("info",("spider bitmap=%d",
- bitmap[roop_count]));
- DBUG_PRINT("info",("spider searched_bitmap=%d",
- spider->searched_bitmap[roop_count]));
- DBUG_PRINT("info",("spider read_set=%d",
- ((uchar *) table->read_set->bitmap)[roop_count]));
- DBUG_PRINT("info",("spider write_set=%d",
- ((uchar *) table->write_set->bitmap)[roop_count]));
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_handler::init_union_table_name_pos()
-{
- DBUG_ENTER("spider_oracle_handler::init_union_table_name_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!union_table_name_pos_first)
- {
- if (!spider_bulk_malloc(spider_current_trx, 238, MYF(MY_WME),
- &union_table_name_pos_first, sizeof(SPIDER_INT_HLD),
- NullS)
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- union_table_name_pos_first->next = NULL;
- }
- union_table_name_pos_current = union_table_name_pos_first;
- union_table_name_pos_current->tgt_num = 0;
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::set_union_table_name_pos()
-{
- DBUG_ENTER("spider_oracle_handler::set_union_table_name_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE)
- {
- if (!union_table_name_pos_current->next)
- {
- if (!spider_bulk_malloc(spider_current_trx, 239, MYF(MY_WME),
- &union_table_name_pos_current->next, sizeof(SPIDER_INT_HLD),
- NullS)
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- union_table_name_pos_current->next->next = NULL;
- }
- union_table_name_pos_current = union_table_name_pos_current->next;
- union_table_name_pos_current->tgt_num = 0;
- }
- union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] =
- table_name_pos;
- ++union_table_name_pos_current->tgt_num;
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reset_union_table_name(
- spider_string *str,
- int link_idx,
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_union_table_name");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!union_table_name_pos_current)
- DBUG_RETURN(0);
-
- SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
- uint cur_num, pos_backup = str->length();
- while(TRUE)
- {
- for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num)
- {
- str->length(tmp_pos->tgt[cur_num]);
- append_table_name_with_adjusting(str, link_idx, sql_type);
- }
- if (tmp_pos == union_table_name_pos_current)
- break;
- tmp_pos = tmp_pos->next;
- }
- str->length(pos_backup);
- DBUG_RETURN(0);
-}
-
-spider_oracle_copy_table::spider_oracle_copy_table(
- spider_oracle_share *db_share
-) : spider_db_copy_table(
- db_share
-),
- oracle_share(db_share),
- pos(0),
- table_name_pos(0),
- pos_diff(0),
- table_lock_mode(0),
- select_rownum_appended(FALSE),
- first_str(NULL),
- current_str(NULL)
-{
- DBUG_ENTER("spider_oracle_copy_table::spider_oracle_copy_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_oracle_copy_table::~spider_oracle_copy_table()
-{
- DBUG_ENTER("spider_oracle_copy_table::~spider_oracle_copy_table");
- DBUG_PRINT("info",("spider this=%p", this));
- while (first_str)
- {
- current_str = first_str;
- first_str = first_str->next;
- delete [] current_str;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_copy_table::init()
-{
- DBUG_ENTER("spider_oracle_copy_table::init");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.init_calc_mem(213);
- sql_part.init_calc_mem(215);
- DBUG_RETURN(0);
-}
-
-void spider_oracle_copy_table::set_sql_charset(
- CHARSET_INFO *cs
-) {
- DBUG_ENTER("spider_oracle_copy_table::set_sql_charset");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.set_charset(cs);
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_copy_table::append_select_str()
-{
- DBUG_ENTER("spider_oracle_copy_table::append_select_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_SELECT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_insert_str(
- int insert_flg
-) {
- DBUG_ENTER("spider_oracle_copy_table::append_insert_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_INSERT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_table_columns(
- TABLE_SHARE *table_share
-) {
- int error_num;
- Field **field;
- DBUG_ENTER("spider_oracle_copy_table::append_table_columns");
- DBUG_PRINT("info",("spider this=%p", this));
- for (field = table_share->field; *field; field++)
- {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) (*field)->field_name, spider_dbton_oracle.dbton_id)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_from_str()
-{
- DBUG_ENTER("spider_oracle_copy_table::append_from_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_table_name(
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_copy_table::append_table_name");
- DBUG_PRINT("info",("spider this=%p", this));
- table_name_pos = sql.length();
- error_num = oracle_share->append_table_name(&sql, link_idx);
- store_link_idx = link_idx;
- DBUG_RETURN(error_num);
-}
-
-void spider_oracle_copy_table::set_sql_pos()
-{
- DBUG_ENTER("spider_oracle_copy_table::set_sql_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- pos = sql.length();
- DBUG_VOID_RETURN;
-}
-
-void spider_oracle_copy_table::set_sql_to_pos()
-{
- DBUG_ENTER("spider_oracle_copy_table::set_sql_to_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- sql.length(pos);
- DBUG_VOID_RETURN;
-}
-
-int spider_oracle_copy_table::append_copy_where(
- spider_db_copy_table *source_ct,
- KEY *key_info,
- ulong *last_row_pos,
- ulong *last_lengths
-) {
- int error_num, roop_count, roop_count2;
- DBUG_ENTER("spider_oracle_copy_table::append_copy_where");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- Field *field;
- KEY_PART_INFO *key_part = key_info->key_part;
- for (roop_count = spider_user_defined_key_parts(key_info) - 1;
- roop_count >= 0; roop_count--)
- {
- for (roop_count2 = 0; roop_count2 < roop_count; roop_count2++)
- {
- field = key_part[roop_count2].field;
- if ((error_num = copy_key_row(source_ct,
- field, &last_row_pos[field->field_index],
- &last_lengths[field->field_index],
- SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN)))
- {
- DBUG_RETURN(error_num);
- }
- }
- field = key_part[roop_count2].field;
- if ((error_num = copy_key_row(source_ct,
- field, &last_row_pos[field->field_index],
- &last_lengths[field->field_index],
- SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN)))
- {
- DBUG_RETURN(error_num);
- }
- sql.length(sql.length() - SPIDER_SQL_AND_LEN);
- if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
- SPIDER_SQL_OR_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- sql.q_append(SPIDER_SQL_OR_STR, SPIDER_SQL_OR_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- }
- sql.length(sql.length() - SPIDER_SQL_OR_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_key_order_str(
- KEY *key_info,
- int start_pos,
- bool desc_flg
-) {
- int length, error_num;
- KEY_PART_INFO *key_part;
- Field *field;
- DBUG_ENTER("spider_oracle_copy_table::append_key_order_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (select_rownum_appended)
- {
- if (sql.reserve(SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
- DBUG_RETURN(0);
- }
- sql_part.length(0);
- if (sql_part.reserve(sql.length() + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
- SPIDER_SQL_ROW_NUMBER_HEAD_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR,
- SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN);
- sql_part.q_append(sql.ptr(), table_name_pos - SPIDER_SQL_FROM_LEN);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_HEAD_STR,
- SPIDER_SQL_ROW_NUMBER_HEAD_LEN);
- if ((int) spider_user_defined_key_parts(key_info) > start_pos)
- {
- if (desc_flg == TRUE)
- {
- for (
- key_part = key_info->key_part + start_pos,
- length = 0;
- length + start_pos < (int) spider_user_defined_key_parts(key_info);
- key_part++,
- length++
- ) {
- field = key_part->field;
- if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql_part,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
- DBUG_RETURN(error_num);
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN +
- SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- } else {
- for (
- key_part = key_info->key_part + start_pos,
- length = 0;
- length + start_pos < (int) spider_user_defined_key_parts(key_info);
- key_part++,
- length++
- ) {
- field = key_part->field;
- if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql_part,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
- DBUG_RETURN(error_num);
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN +
- SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- }
- }
- if (desc_flg == TRUE)
- {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + sql.length() - table_name_pos +
- SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
- } else {
- if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + sql.length() - table_name_pos +
- SPIDER_SQL_FROM_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
- SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
- }
- pos_diff = sql_part.length() + SPIDER_SQL_FROM_LEN - table_name_pos;
- sql_part.q_append(sql.ptr() + table_name_pos - SPIDER_SQL_FROM_LEN,
- sql.length() - table_name_pos + SPIDER_SQL_FROM_LEN);
- sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
- SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
-
- if ((int) spider_user_defined_key_parts(key_info) > start_pos)
- {
- if (sql.reserve(SPIDER_SQL_ORDER_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
- if (desc_flg == TRUE)
- {
- for (
- key_part = key_info->key_part + start_pos,
- length = 0;
- length + start_pos < (int) spider_user_defined_key_parts(key_info);
- key_part++,
- length++
- ) {
- field = key_part->field;
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
- DBUG_RETURN(error_num);
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- } else {
- for (
- key_part = key_info->key_part + start_pos,
- length = 0;
- length + start_pos < (int) spider_user_defined_key_parts(key_info);
- key_part++,
- length++
- ) {
- field = key_part->field;
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
- DBUG_RETURN(error_num);
- if (key_part->key_part_flag & HA_REVERSE_SORT)
- {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- } else {
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
- SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- }
- sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_limit(
- longlong offset,
- longlong limit
-) {
- char buf[SPIDER_LONGLONG_LEN + 1];
- uint32 length;
- DBUG_ENTER("spider_oracle_copy_table::append_limit");
- DBUG_PRINT("info",("spider this=%p", this));
- if (offset || limit < 9223372036854775807LL)
- {
- if (!select_rownum_appended)
- {
- select_rownum_appended = TRUE;
- table_name_pos = table_name_pos + pos_diff;
- if (sql.copy(sql_part))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- pos = pos + pos_diff;
- }
- if (offset)
- {
- if (sql.reserve(SPIDER_SQL_BETWEEN_LEN + SPIDER_SQL_AND_LEN +
- ((SPIDER_LONGLONG_LEN) * 2)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_BETWEEN_STR, SPIDER_SQL_BETWEEN_LEN);
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
- sql.q_append(buf, length);
- sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
- sql.q_append(buf, length);
- } else {
- if (sql.reserve(SPIDER_SQL_HS_LTEQUAL_LEN +
- (SPIDER_LONGLONG_LEN)))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_HS_LTEQUAL_STR, SPIDER_SQL_HS_LTEQUAL_LEN);
- length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
- &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
- sql.q_append(buf, length);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_into_str()
-{
- DBUG_ENTER("spider_oracle_copy_table::append_into_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_INTO_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_open_paren_str()
-{
- DBUG_ENTER("spider_oracle_copy_table::append_open_paren_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_values_str()
-{
- DBUG_ENTER("spider_oracle_copy_table::append_values_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
- sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_select_lock_str(
- int lock_mode
-) {
- DBUG_ENTER("spider_oracle_copy_table::append_select_lock_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (select_rownum_appended)
- {
- int error_num;
- table_lock_mode = lock_mode;
- sql_part.length(0);
- if (sql_part.reserve(SPIDER_SQL_LOCK_TABLE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
- if ((error_num = oracle_share->append_table_name(&sql_part,
- store_link_idx)))
- DBUG_RETURN(error_num);
- if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
- {
- if (sql_part.reserve(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR,
- SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN);
- } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
- {
- if (sql_part.reserve(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql_part.q_append(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR,
- SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN);
- }
- } else {
- if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
- {
- if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
- } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
- {
- if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::exec_query(
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
-) {
- int error_num = 0;
- DBUG_ENTER("spider_oracle_copy_table::exec_query");
- DBUG_PRINT("info",("spider this=%p", this));
- if (current_str)
- {
- spider_string *tmp_str = first_str;
- while (tmp_str && tmp_str != current_str)
- {
- if (
- (error_num = spider_db_query(conn, tmp_str->ptr(), tmp_str->length(),
- quick_mode, need_mon)) &&
- error_num != HA_ERR_FOUND_DUPP_KEY
- ) {
- break;
- }
- tmp_str = tmp_str->next;
- }
- if (tmp_str == current_str)
- {
- error_num = spider_db_query(conn, tmp_str->ptr(), tmp_str->length(),
- quick_mode, need_mon);
- }
- if (error_num == HA_ERR_FOUND_DUPP_KEY)
- error_num = 0;
- current_str = NULL;
- } else {
- if (table_lock_mode)
- {
- DBUG_PRINT("info",("spider table_lock_mode=%d", table_lock_mode));
- spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
- db_conn->table_lock_mode = table_lock_mode;
- db_conn->exec_lock_sql = &sql_part;
- table_lock_mode = 0;
- }
- error_num = spider_db_query(conn, sql.ptr(), sql.length(), quick_mode,
- need_mon);
- }
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_copy_table::copy_key_row(
- spider_db_copy_table *source_ct,
- Field *field,
- ulong *row_pos,
- ulong *length,
- const char *joint_str,
- const int joint_length
-) {
- int error_num;
- spider_string *source_str = &((spider_oracle_copy_table *) source_ct)->sql;
- DBUG_ENTER("spider_oracle_copy_table::copy_key_row");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
- DBUG_RETURN(error_num);
- if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length +
- SPIDER_SQL_AND_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- sql.q_append(joint_str, joint_length);
- sql.q_append(source_str->ptr() + *row_pos, *length);
- sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::copy_row(
- Field *field,
- SPIDER_DB_ROW *row
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_copy_table::copy_row");
- DBUG_PRINT("info",("spider this=%p", this));
- if (row->is_null())
- {
- DBUG_PRINT("info",("spider column is null"));
- if (current_str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- current_str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else if (field->str_needs_quotes())
- {
- DBUG_PRINT("info",("spider str_needs_quotes"));
- if (current_str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- current_str->q_append(SPIDER_SQL_VALUE_QUOTE_STR,
- SPIDER_SQL_VALUE_QUOTE_LEN);
- if ((error_num = row->append_escaped_to_str(current_str,
- spider_dbton_oracle.dbton_id)))
- DBUG_RETURN(error_num);
- if (current_str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- current_str->q_append(SPIDER_SQL_VALUE_QUOTE_STR,
- SPIDER_SQL_VALUE_QUOTE_LEN);
- } else {
- DBUG_PRINT("info",("spider without_quotes"));
- if ((error_num = row->append_to_str(current_str)))
- DBUG_RETURN(error_num);
- if (current_str->reserve(SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- current_str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::copy_rows(
- TABLE *table,
- SPIDER_DB_ROW *row,
- ulong **last_row_pos,
- ulong **last_lengths
-) {
- int error_num;
- Field **field;
- ulong *lengths2, *row_pos2;
- DBUG_ENTER("spider_oracle_copy_table::copy_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!current_str)
- {
- if (!first_str)
- {
- if (!(first_str = new spider_string[1]))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- first_str->init_calc_mem(216);
- first_str->set_charset(sql.charset());
- if (first_str->reserve(sql.length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- first_str->q_append(sql.ptr(), sql.length());
- } else {
- first_str->length(sql.length());
- }
- current_str = first_str;
- } else {
- if (!current_str->next)
- {
- if (!(current_str->next = new spider_string[1]))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- current_str->next->init_calc_mem(217);
- current_str->next->set_charset(sql.charset());
- if (current_str->next->reserve(sql.length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- current_str->next->q_append(sql.ptr(), sql.length());
- } else {
- current_str->next->length(sql.length());
- }
- current_str = current_str->next;
- }
- row_pos2 = *last_row_pos;
- lengths2 = *last_lengths;
-
- for (
- field = table->field;
- *field;
- field++,
- lengths2++
- ) {
- *row_pos2 = current_str->length();
- if ((error_num =
- copy_row(*field, row)))
- DBUG_RETURN(error_num);
- *lengths2 = current_str->length() - *row_pos2 - SPIDER_SQL_COMMA_LEN;
- row->next();
- row_pos2++;
- }
- current_str->length(current_str->length() - SPIDER_SQL_COMMA_LEN);
- if (current_str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- current_str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- DBUG_PRINT("info",("spider current_str=%s", current_str->c_ptr_safe()));
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::copy_rows(
- TABLE *table,
- SPIDER_DB_ROW *row
-) {
- int error_num;
- Field **field;
- DBUG_ENTER("spider_oracle_copy_table::copy_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!current_str)
- {
- if (!first_str)
- {
- if (!(first_str = new spider_string[1]))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- first_str->init_calc_mem(218);
- first_str->set_charset(sql.charset());
- if (first_str->reserve(sql.length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- first_str->q_append(sql.ptr(), sql.length());
- } else {
- first_str->length(sql.length());
- }
- current_str = first_str;
- } else {
- if (!current_str->next)
- {
- if (!(current_str->next = new spider_string[1]))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- current_str->next->init_calc_mem(219);
- current_str->next->set_charset(sql.charset());
- if (current_str->next->reserve(sql.length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- current_str->next->q_append(sql.ptr(), sql.length());
- } else {
- current_str->next->length(sql.length());
- }
- current_str = current_str->next;
- }
-
- for (
- field = table->field;
- *field;
- field++
- ) {
- if ((error_num =
- copy_row(*field, row)))
- DBUG_RETURN(error_num);
- row->next();
- }
- current_str->length(current_str->length() - SPIDER_SQL_COMMA_LEN);
- if (current_str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- current_str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- DBUG_PRINT("info",("spider current_str=%s", current_str->c_ptr_safe()));
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::append_insert_terminator()
-{
- DBUG_ENTER("spider_oracle_copy_table::append_insert_terminator");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_oracle_copy_table::copy_insert_values(
- spider_db_copy_table *source_ct
-) {
- spider_oracle_copy_table *tmp_ct = (spider_oracle_copy_table *) source_ct;
- spider_string *source_str = &tmp_ct->sql;
- int values_length = source_str->length() - tmp_ct->pos;
- const char *values_ptr = source_str->ptr() + tmp_ct->pos;
- DBUG_ENTER("spider_oracle_copy_table::copy_insert_values");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql.reserve(values_length))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- sql.q_append(values_ptr, values_length);
- DBUG_RETURN(0);
-}
-#endif
+/* Copyright (C) 2012-2014 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#define MYSQL_SERVER 1
+#include "mysql_version.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_partition.h"
+#include "sql_analyse.h"
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+#include "sql_select.h"
+#endif
+#endif
+
+#ifdef HAVE_ORACLE_OCI
+#include <oci.h>
+#include "spd_err.h"
+#include "spd_param.h"
+#include "spd_db_include.h"
+#include "spd_include.h"
+#include "spd_db_oracle.h"
+#include "ha_spider.h"
+#include "spd_conn.h"
+#include "spd_db_conn.h"
+#include "spd_malloc.h"
+#include "spd_sys_table.h"
+#include "spd_table.h"
+
+extern struct charset_info_st *spd_charset_utf8_bin;
+
+extern handlerton *spider_hton_ptr;
+extern pthread_mutex_t spider_open_conn_mutex;
+extern HASH spider_open_connections;
+extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
+extern const char spider_dig_upper[];
+
+#define SPIDER_DB_WRAPPER_ORACLE "oracle"
+
+#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_ISO_READ_COMMITTED_STR "set transaction isolation level read committed"
+#define SPIDER_SQL_ISO_READ_COMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_COMMITTED_STR) - 1
+#define SPIDER_SQL_ISO_SERIALIZABLE_STR "set transaction isolation level serializable"
+#define SPIDER_SQL_ISO_SERIALIZABLE_LEN sizeof(SPIDER_SQL_ISO_SERIALIZABLE_STR) - 1
+
+#define SPIDER_SQL_START_TRANSACTION_STR "set transaction read write"
+#define SPIDER_SQL_START_TRANSACTION_LEN sizeof(SPIDER_SQL_START_TRANSACTION_STR) - 1
+
+#define SPIDER_SQL_AUTOCOMMIT_OFF_STR "set autocommit off"
+#define SPIDER_SQL_AUTOCOMMIT_OFF_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_OFF_STR) - 1
+#define SPIDER_SQL_AUTOCOMMIT_ON_STR "set autocommit on"
+#define SPIDER_SQL_AUTOCOMMIT_ON_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_ON_STR) - 1
+
+#define SPIDER_SQL_LOCK_TABLE_STR "lock table "
+#define SPIDER_SQL_LOCK_TABLE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_STR) - 1)
+#define SPIDER_SQL_UNLOCK_TABLE_STR "unlock tables"
+#define SPIDER_SQL_UNLOCK_TABLE_LEN (sizeof(SPIDER_SQL_UNLOCK_TABLE_STR) - 1)
+#define SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR " in share mode"
+#define SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR) - 1)
+#define SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR " in exclusive mode"
+#define SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR) - 1)
+
+#define SPIDER_SQL_COMMIT_STR "commit"
+#define SPIDER_SQL_COMMIT_LEN sizeof(SPIDER_SQL_COMMIT_STR) - 1
+
+#define SPIDER_SQL_SET_NLS_DATE_FORMAT_STR "alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'"
+#define SPIDER_SQL_SET_NLS_DATE_FORMAT_LEN sizeof(SPIDER_SQL_SET_NLS_DATE_FORMAT_STR) - 1
+#define SPIDER_SQL_SET_NLS_TIME_FORMAT_STR "alter session set nls_time_format='HH24:MI:SSXFF'"
+#define SPIDER_SQL_SET_NLS_TIME_FORMAT_LEN sizeof(SPIDER_SQL_SET_NLS_TIME_FORMAT_STR) - 1
+#define SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_STR "alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SSXFF'"
+#define SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_LEN sizeof(SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_STR) - 1
+
+#define SPIDER_SQL_SELECT_WRAPPER_HEAD_STR "select * from ("
+#define SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN sizeof(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR) - 1
+#define SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR " where rowid in (select rowid from (select rowid, row_number() over (order by "
+#define SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN sizeof(SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR) - 1
+#define SPIDER_SQL_ROW_NUMBER_HEAD_STR ", row_number() over (order by "
+#define SPIDER_SQL_ROW_NUMBER_HEAD_LEN sizeof(SPIDER_SQL_ROW_NUMBER_HEAD_STR) - 1
+#define SPIDER_SQL_ROW_NUMBER_TAIL_STR "rowid) row_num"
+#define SPIDER_SQL_ROW_NUMBER_TAIL_LEN sizeof(SPIDER_SQL_ROW_NUMBER_TAIL_STR) - 1
+#define SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR "rowid desc) row_num"
+#define SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN sizeof(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR) - 1
+#define SPIDER_SQL_SELECT_WRAPPER_TAIL_STR ") where row_num "
+#define SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN sizeof(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR) - 1
+#define SPIDER_SQL_ROW_NUM_STR "row_num"
+#define SPIDER_SQL_ROW_NUM_LEN sizeof(SPIDER_SQL_ROW_NUM_STR) - 1
+#define SPIDER_SQL_ROWNUM_STR "rownum"
+#define SPIDER_SQL_ROWNUM_LEN sizeof(SPIDER_SQL_ROWNUM_STR) - 1
+#define SPIDER_SQL_NEXTVAL_STR ".nextval"
+#define SPIDER_SQL_NEXTVAL_LEN sizeof(SPIDER_SQL_NEXTVAL_STR) - 1
+#define SPIDER_SQL_CURRVAL_STR ".currval"
+#define SPIDER_SQL_CURRVAL_LEN sizeof(SPIDER_SQL_CURRVAL_STR) - 1
+#define SPIDER_SQL_FROM_DUAL_STR " from dual"
+#define SPIDER_SQL_FROM_DUAL_LEN sizeof(SPIDER_SQL_FROM_DUAL_STR) - 1
+
+#define SPIDER_SQL_SHOW_TABLE_STATUS_STR "show table status from "
+#define SPIDER_SQL_SHOW_TABLE_STATUS_LEN sizeof(SPIDER_SQL_SHOW_TABLE_STATUS_STR) - 1
+#define SPIDER_SQL_SELECT_TABLES_STATUS_STR "select `table_rows`,`avg_row_length`,`data_length`,`max_data_length`,`index_length`,`auto_increment`,`create_time`,`update_time`,`check_time` from `information_schema`.`tables` where `table_schema` = "
+#define SPIDER_SQL_SELECT_TABLES_STATUS_LEN sizeof(SPIDER_SQL_SELECT_TABLES_STATUS_STR) - 1
+
+#define SPIDER_SQL_LIKE_STR " like "
+#define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1)
+#define SPIDER_SQL_LIMIT1_STR "rownum = 1"
+#define SPIDER_SQL_LIMIT1_LEN (sizeof(SPIDER_SQL_LIMIT1_STR) - 1)
+
+#define SPIDER_SQL_ADD_MONTHS_STR "add_months"
+#define SPIDER_SQL_ADD_MONTHS_LEN (sizeof(SPIDER_SQL_ADD_MONTHS_STR) - 1)
+
+#define SPIDER_ORACLE_ERR_BUF_LEN 512
+
+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_table_lock_str[] =
+{
+ " in share mode",
+ " in share mode",
+ " in exclusive mode",
+ " in exclusive mode"
+};
+static const int spider_db_table_lock_len[] =
+{
+ sizeof(" in share mode") - 1,
+ sizeof(" in share mode") - 1,
+ sizeof(" in exclusive mode") - 1,
+ sizeof(" in exclusive mode") - 1
+};
+
+int spider_db_oracle_get_error(
+ sword res,
+ dvoid *hndlp,
+ int error_num,
+ const char *error1,
+ const char *error2,
+ CHARSET_INFO *access_charset,
+ char *stored_error_msg
+) {
+ sb4 error_code;
+ char buf[SPIDER_ORACLE_ERR_BUF_LEN];
+ char buf2[SPIDER_ORACLE_ERR_BUF_LEN];
+ spider_string tmp_str(buf2, SPIDER_ORACLE_ERR_BUF_LEN, system_charset_info);
+ DBUG_ENTER("spider_db_oracle_get_error");
+ tmp_str.init_calc_mem(176);
+ tmp_str.length(0);
+
+ switch (res)
+ {
+ case OCI_SUCCESS:
+ DBUG_PRINT("info",("spider res=OCI_SUCCESS"));
+ break;
+ case OCI_SUCCESS_WITH_INFO:
+ DBUG_PRINT("info",("spider res=OCI_SUCCESS_WITH_INFO"));
+ OCIErrorGet(hndlp, 1, NULL, &error_code, (OraText *) buf, sizeof(buf),
+ OCI_HTYPE_ERROR);
+ DBUG_PRINT("info",("spider error_code=%d error='%s'",error_code ,buf));
+ if (access_charset && access_charset->cset != system_charset_info->cset)
+ {
+ tmp_str.append(buf, strlen(buf), access_charset);
+ } else {
+ tmp_str.set(buf, strlen(buf), system_charset_info);
+ }
+ push_warning_printf(current_thd, SPIDER_WARN_LEVEL_WARN,
+ ER_SPIDER_ORACLE_NUM, ER_SPIDER_ORACLE_STR, res, error_code,
+ tmp_str.c_ptr_safe());
+ break;
+ case OCI_NO_DATA:
+ DBUG_PRINT("info",("spider res=OCI_NO_DATA"));
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+ case OCI_ERROR:
+ DBUG_PRINT("info",("spider res=OCI_ERROR"));
+ OCIErrorGet(hndlp, 1, NULL, &error_code, (OraText *) buf, sizeof(buf),
+ OCI_HTYPE_ERROR);
+ DBUG_PRINT("info",("spider error_code=%d error='%s'",error_code ,buf));
+ if (error_code == 1)
+ {
+ DBUG_PRINT("info",("spider found dupp key"));
+ if (stored_error_msg)
+ strmov(stored_error_msg, buf);
+ DBUG_RETURN(HA_ERR_FOUND_DUPP_KEY);
+ }
+ if (error_num)
+ {
+ if (error1)
+ {
+ if (error2)
+ {
+ my_printf_error(error_num, error1, MYF(0), error2);
+ } else {
+ my_printf_error(error_num, error1, MYF(0));
+ }
+ } else if (error2) {
+ my_error(error_num, MYF(0), error2);
+ } else {
+ my_error(error_num, MYF(0));
+ }
+ }
+ if (access_charset && access_charset->cset != system_charset_info->cset)
+ {
+ tmp_str.append(buf, strlen(buf), access_charset);
+ } else {
+ tmp_str.set(buf, strlen(buf), system_charset_info);
+ }
+ my_printf_error(ER_SPIDER_ORACLE_NUM, ER_SPIDER_ORACLE_STR, MYF(0),
+ res, error_code, tmp_str.c_ptr_safe());
+ if (error_num)
+ {
+ DBUG_RETURN(error_num);
+ } else {
+ DBUG_RETURN(ER_SPIDER_ORACLE_NUM);
+ }
+ case OCI_INVALID_HANDLE:
+ case OCI_NEED_DATA:
+ if (res == OCI_INVALID_HANDLE)
+ DBUG_PRINT("info",("spider res=OCI_INVALID_HANDLE"));
+ else
+ DBUG_PRINT("info",("spider res=OCI_NEED_DATA"));
+ default:
+ DBUG_PRINT("info",("spider res=%d", res));
+ if (error_num)
+ {
+ if (error1)
+ {
+ if (error2)
+ {
+ my_printf_error(error_num, error1, MYF(0), error2);
+ } else {
+ my_printf_error(error_num, error1, MYF(0));
+ }
+ } else if (error2) {
+ my_error(error_num, MYF(0), error2);
+ } else {
+ my_error(error_num, MYF(0));
+ }
+ }
+ my_printf_error(ER_SPIDER_ORACLE_NUM, ER_SPIDER_ORACLE_STR, MYF(0),
+ res, 0, "");
+ if (error_num)
+ {
+ DBUG_RETURN(error_num);
+ } else {
+ DBUG_RETURN(ER_SPIDER_ORACLE_NUM);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_init()
+{
+ DBUG_ENTER("spider_oracle_init");
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_deinit()
+{
+ DBUG_ENTER("spider_oracle_deinit");
+ DBUG_RETURN(0);
+}
+
+spider_db_share *spider_oracle_create_share(
+ SPIDER_SHARE *share
+) {
+ DBUG_ENTER("spider_oracle_create_share");
+ DBUG_RETURN(new spider_oracle_share(share));
+}
+
+spider_db_handler *spider_oracle_create_handler(
+ ha_spider *spider,
+ spider_db_share *db_share
+) {
+ DBUG_ENTER("spider_oracle_create_handler");
+ DBUG_RETURN(new spider_oracle_handler(spider,
+ (spider_oracle_share *) db_share));
+}
+
+spider_db_copy_table *spider_oracle_create_copy_table(
+ spider_db_share *db_share
+) {
+ DBUG_ENTER("spider_oracle_create_copy_table");
+ DBUG_RETURN(new spider_oracle_copy_table(
+ (spider_oracle_share *) db_share));
+}
+
+SPIDER_DB_CONN *spider_oracle_create_conn(
+ SPIDER_CONN *conn
+) {
+ DBUG_ENTER("spider_oracle_create_conn");
+ DBUG_RETURN(new spider_db_oracle(conn));
+}
+
+spider_db_oracle_util spider_db_oracle_utility;
+
+SPIDER_DBTON spider_dbton_oracle = {
+ 0,
+ SPIDER_DB_WRAPPER_ORACLE,
+ SPIDER_DB_ACCESS_TYPE_SQL,
+ spider_oracle_init,
+ spider_oracle_deinit,
+ spider_oracle_create_share,
+ spider_oracle_create_handler,
+ spider_oracle_create_copy_table,
+ spider_oracle_create_conn,
+ &spider_db_oracle_utility
+};
+
+spider_db_oracle_row::spider_db_oracle_row() :
+ spider_db_row(spider_dbton_oracle.dbton_id),
+ db_conn(NULL), result(NULL),
+ ind(NULL), val(NULL), rlen(NULL), ind_first(NULL), val_first(NULL),
+ rlen_first(NULL), val_str(NULL), val_str_first(NULL), defnp(NULL),
+ lobhp(NULL), colhp(NULL), coltp(NULL), colsz(NULL), field_count(0),
+ row_size(NULL), row_size_first(NULL), access_charset(NULL), cloned(FALSE)
+{
+ DBUG_ENTER("spider_db_oracle_row::spider_db_oracle_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_oracle_row::~spider_db_oracle_row()
+{
+ DBUG_ENTER("spider_db_oracle_row::~spider_db_oracle_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ deinit();
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_oracle_row::store_to_field(
+ Field *field,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_oracle_row::store_to_field");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider ind=%d", *ind));
+ if (*ind == -1)
+ {
+ DBUG_PRINT("info", ("spider field is null"));
+ field->set_null();
+ field->reset();
+ } else {
+ DBUG_PRINT("info", ("spider field->type()=%u", field->type()));
+ field->set_notnull();
+ if (field->type() == MYSQL_TYPE_YEAR)
+ {
+ field->store(val_str->ptr(), 4,
+ field->table->s->table_charset);
+ } else if (field->type() == MYSQL_TYPE_DATE)
+ {
+ field->store(val_str->ptr(), 10,
+ field->table->s->table_charset);
+ } else if (field->type() == MYSQL_TYPE_TIME)
+ {
+ field->store(val_str->ptr() + 11, 8,
+ field->table->s->table_charset);
+ } else {
+ DBUG_PRINT("info", ("spider val_str->length()=%u", val_str->length()));
+ if (field->flags & BLOB_FLAG)
+ {
+ DBUG_PRINT("info", ("spider blob field"));
+ ((Field_blob *)field)->set_ptr(
+ val_str->length(), (uchar *) val_str->ptr());
+ } else {
+ field->store(val_str->ptr(), val_str->length(),
+ field->table->s->table_charset);
+ }
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_row::append_to_str(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_oracle_row::append_to_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(val_str->length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(val_str->ptr(), val_str->length());
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_row::append_escaped_to_str(
+ spider_string *str,
+ uint dbton_id
+) {
+ DBUG_ENTER("spider_db_oracle_row::append_escaped_to_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+/*
+ spider_string tmp_str(*val, *rlen, str->charset());
+ tmp_str.init_calc_mem(174);
+ tmp_str.length(*rlen);
+#ifndef DBUG_OFF
+ tmp_str.c_ptr_safe();
+#endif
+ if (str->reserve(*rlen * 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ util.append_escaped(str, tmp_str.get_str());
+*/
+ if (str->reserve(val_str->length() * 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ spider_dbton[dbton_id].db_util->append_escaped_util(str, val_str->get_str());
+ DBUG_RETURN(0);
+}
+
+void spider_db_oracle_row::first()
+{
+ DBUG_ENTER("spider_db_oracle_row::first");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider ind_first=%p", ind_first));
+ ind = ind_first;
+ DBUG_PRINT("info",("spider val_first=%p", val_first));
+ val = val_first;
+ DBUG_PRINT("info",("spider rlen_first=%p", rlen_first));
+ rlen = rlen_first;
+ DBUG_PRINT("info",("spider row_size_first=%p", row_size_first));
+ row_size = row_size_first;
+ DBUG_PRINT("info",("spider val_str_first=%p", val_str_first));
+ val_str = val_str_first;
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_oracle_row::next()
+{
+ DBUG_ENTER("spider_db_oracle_row::next");
+ DBUG_PRINT("info",("spider this=%p", this));
+ ind++;
+ val++;
+ rlen++;
+ row_size++;
+ val_str++;
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_oracle_row::is_null()
+{
+ DBUG_ENTER("spider_db_oracle_row::is_null");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((*ind == -1));
+}
+
+int spider_db_oracle_row::val_int()
+{
+ DBUG_ENTER("spider_db_oracle_row::val_int");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((*ind != -1) ? atoi(*val) : 0);
+}
+
+double spider_db_oracle_row::val_real()
+{
+ DBUG_ENTER("spider_db_oracle_row::val_real");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((*ind != -1) ? my_atof(*val) : 0.0);
+}
+
+my_decimal *spider_db_oracle_row::val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_oracle_row::val_decimal");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (*ind == -1)
+ DBUG_RETURN(NULL);
+
+#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
+ decimal_operation_results(str2my_decimal(0, *val, *rlen, access_charset,
+ decimal_value), "", "");
+#else
+ decimal_operation_results(str2my_decimal(0, *val, *rlen, access_charset,
+ decimal_value));
+#endif
+
+ DBUG_RETURN(decimal_value);
+}
+
+SPIDER_DB_ROW *spider_db_oracle_row::clone()
+{
+ uint i;
+ spider_db_oracle_row *clone_row;
+ DBUG_ENTER("spider_db_oracle_row::clone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(clone_row = new spider_db_oracle_row()))
+ {
+ DBUG_RETURN(NULL);
+ }
+ clone_row->db_conn = db_conn;
+ clone_row->result = result;
+ clone_row->field_count = field_count;
+ clone_row->access_charset = access_charset;
+ clone_row->cloned = TRUE;
+ if (clone_row->init())
+ {
+ delete clone_row;
+ DBUG_RETURN(NULL);
+ }
+ memcpy(clone_row->ind, ind_first, sizeof(ub2) * field_count * 4 +
+ sizeof(ulong) * field_count);
+ for (i = 0; i < field_count; i++)
+ {
+ if (clone_row->val_str[i].copy(val_str_first[i]))
+ {
+ delete clone_row;
+ DBUG_RETURN(NULL);
+ }
+ }
+ DBUG_RETURN((SPIDER_DB_ROW *) clone_row);
+}
+
+int spider_db_oracle_row::store_to_tmp_table(
+ TABLE *tmp_table,
+ spider_string *str
+) {
+ uint i;
+ DBUG_ENTER("spider_db_oracle_row::store_to_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ for (i = 0; i < field_count; i++)
+ {
+ if (row_size_first[i])
+ {
+ if (str->reserve(val_str_first[i].length()))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(val_str_first[i].ptr(), val_str_first[i].length());
+ }
+ }
+ tmp_table->field[0]->set_notnull();
+ tmp_table->field[0]->store(
+ (const char *) row_size_first,
+ sizeof(ulong) * 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_notnull();
+ tmp_table->field[2]->store(
+ (char *) ind_first, (uint) (sizeof(sb2) * field_count), &my_charset_bin);
+ DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
+}
+
+int spider_db_oracle_row::init()
+{
+ char *tmp_val;
+ uint i;
+ DBUG_ENTER("spider_db_oracle_row::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (
+ !(ind = (sb2 *)
+ spider_bulk_malloc(spider_current_trx, 161, MYF(MY_WME | MY_ZEROFILL),
+ &ind, sizeof(sb2) * field_count,
+ &rlen, sizeof(ub2) * field_count,
+ &coltp, sizeof(ub2) * field_count,
+ &colsz, sizeof(ub2) * field_count,
+ &row_size, sizeof(ulong) * field_count,
+ &val, sizeof(char *) * field_count,
+ &tmp_val, MAX_FIELD_WIDTH * field_count,
+ &defnp, sizeof(OCIDefine *) * field_count,
+ &lobhp, sizeof(OCILobLocator *) * field_count,
+ &colhp, sizeof(OCIParam *) * field_count,
+ NullS)
+ ) ||
+ !(val_str = new spider_string[field_count])
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ ind_first = ind;
+ val_first = val;
+ rlen_first = rlen;
+ row_size_first = row_size;
+ val_str_first = val_str;
+ for (i = 0; i < field_count; i++)
+ {
+ val[i] = tmp_val;
+ val_str[i].init_calc_mem(177);
+ val_str[i].set(tmp_val, MAX_FIELD_WIDTH, access_charset);
+ tmp_val += MAX_FIELD_WIDTH;
+ }
+ DBUG_RETURN(0);
+}
+
+void spider_db_oracle_row::deinit()
+{
+ uint i;
+ DBUG_ENTER("spider_db_oracle_row::deinit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!cloned)
+ {
+ for (i = 0; i < field_count; i++)
+ {
+ if (defnp && defnp[i])
+ {
+ OCIHandleFree(defnp[i], OCI_HTYPE_DEFINE);
+ defnp[i] = NULL;
+ }
+ if (lobhp && lobhp[i])
+ {
+ OCIDescriptorFree(lobhp[i], OCI_DTYPE_LOB);
+ lobhp[i] = NULL;
+ }
+ }
+ }
+ if (val_str_first)
+ {
+ delete [] val_str_first;
+ val_str_first = NULL;
+ }
+ if (ind_first)
+ {
+ spider_free(spider_current_trx, ind_first, MYF(0));
+ ind_first = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_oracle_row::define()
+{
+ sword res;
+ uint i;
+ DBUG_ENTER("spider_db_oracle_row::define");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (i = 0; i < field_count; i++)
+ {
+ if (coltp[i] == SQLT_BLOB)
+ {
+ res = OCIDescriptorAlloc(db_conn->envhp, (dvoid **) &lobhp[i],
+ OCI_DTYPE_LOB, 0, 0);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_RETURN(
+ spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
+ access_charset, NULL));
+ }
+ res = OCIDefineByPos(result->stmtp, &defnp[i], db_conn->errhp, i + 1,
+ &lobhp[i], 0, SQLT_BLOB, &ind[i], &rlen[i], NULL,
+ OCI_DEFAULT);
+ } else if (coltp[i] == SQLT_DAT)
+ {
+ res = OCIDefineByPos(result->stmtp, &defnp[i], db_conn->errhp, i + 1,
+ (char *) val_str[i].ptr() + 20, sizeof(ub1) * 7, SQLT_DAT, &ind[i],
+ &rlen[i], NULL, OCI_DEFAULT);
+ } else {
+ if (val_str[i].alloc(colsz[i]))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ res = OCIDefineByPos(result->stmtp, &defnp[i], db_conn->errhp, i + 1,
+ (char *) val_str[i].ptr(), colsz[i], SQLT_CHR, &ind[i], &rlen[i], NULL,
+ OCI_DEFAULT);
+ }
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_RETURN(
+ spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
+ access_charset, NULL));
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_row::fetch()
+{
+ sword res;
+ uint i;
+ DBUG_ENTER("spider_db_oracle_row::fetch");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (i = 0; i < field_count; i++)
+ {
+ if (ind[i] == -1)
+ {
+ DBUG_PRINT("info",("spider NULL"));
+ val_str[i].length(0);
+ } else {
+ if (coltp[i] == SQLT_BLOB)
+ {
+ DBUG_PRINT("info",("spider SQLT_BLOB"));
+ oraub8 len;
+ res = OCILobGetLength2(db_conn->svchp, db_conn->errhp, lobhp[i], &len);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_RETURN(
+ spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
+ access_charset, NULL));
+ }
+#ifndef DBUG_OFF
+ {
+ ulonglong print_len = len;
+ DBUG_PRINT("info",("spider len=%llu", print_len));
+ }
+#endif
+ if (val_str[i].alloc(len))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ res = OCILobRead2(db_conn->svchp, db_conn->errhp, lobhp[i], &len,
+ NULL, 1, (char *) val_str[i].ptr(), len, OCI_ONE_PIECE, NULL, NULL,
+ 0, 0);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_RETURN(
+ spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
+ access_charset, NULL));
+ }
+#ifndef DBUG_OFF
+ {
+ ulonglong print_len = len;
+ DBUG_PRINT("info",("spider lenb=%llu", print_len));
+ }
+#endif
+ val_str[i].length(len);
+ } else if (coltp[i] == SQLT_DAT)
+ {
+ DBUG_PRINT("info",("spider SQLT_DAT"));
+ char *val = (char *) val_str[i].ptr();
+ ub1 *src = (ub1 *) val + 20;
+ val_str[i].length(19);
+ if (src[0] < 100)
+ my_sprintf(val, (val, "0000-00-00 00:00:00"));
+ else
+ my_sprintf(val, (val, "%02u%02u-%02u-%02u %02u:%02u:%02u",
+ src[0] - 100, src[1] - 100, src[2], src[3],
+ src[4] - 1, src[5] - 1, src[6] - 1));
+ } else {
+ val_str[i].length(rlen[i]);
+ }
+ }
+ row_size[i] = val_str[i].length();
+ }
+ DBUG_RETURN(0);
+}
+
+spider_db_oracle_result::spider_db_oracle_result() :
+ spider_db_result(spider_dbton_oracle.dbton_id),
+ db_conn(NULL), stmtp(NULL), field_count(0), access_charset(NULL),
+ fetched(FALSE)
+{
+ DBUG_ENTER("spider_db_oracle_result::spider_db_oracle_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_oracle_result::~spider_db_oracle_result()
+{
+ DBUG_ENTER("spider_db_oracle_result::~spider_db_oracle_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ free_result();
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_oracle_result::has_result()
+{
+ DBUG_ENTER("spider_db_oracle_result::has_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(stmtp);
+}
+
+void spider_db_oracle_result::free_result()
+{
+ DBUG_ENTER("spider_db_oracle_result::free_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (stmtp)
+ {
+ OCIHandleFree(stmtp, OCI_HTYPE_STMT);
+ stmtp = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_DB_ROW *spider_db_oracle_result::current_row()
+{
+ DBUG_ENTER("spider_db_oracle_result::current_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
+}
+
+SPIDER_DB_ROW *spider_db_oracle_result::fetch_row()
+{
+ sword res;
+ DBUG_ENTER("spider_db_oracle_result::fetch_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ row.ind = row.ind_first;
+ row.val = row.val_first;
+ row.rlen = row.rlen_first;
+ row.row_size = row.row_size_first;
+ row.val_str = row.val_str_first;
+ if (fetched)
+ {
+ /* already fetched */
+ fetched = FALSE;
+ } else {
+ res = OCIStmtFetch2(stmtp, db_conn->errhp, 1, OCI_FETCH_NEXT, 0,
+ OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ store_error_num = spider_db_oracle_get_error(res, db_conn->errhp, 0,
+ NULL, NULL, access_charset, NULL);
+ DBUG_RETURN(NULL);
+ }
+ }
+ if ((store_error_num = row.fetch()))
+ {
+ DBUG_RETURN(NULL);
+ }
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+SPIDER_DB_ROW *spider_db_oracle_result::fetch_row_from_result_buffer(
+ spider_db_result_buffer *spider_res_buf
+) {
+ sword res;
+ DBUG_ENTER("spider_db_oracle_result::fetch_row_from_result_buffer");
+ DBUG_PRINT("info",("spider this=%p", this));
+ row.ind = row.ind_first;
+ row.val = row.val_first;
+ row.rlen = row.rlen_first;
+ row.row_size = row.row_size_first;
+ row.val_str = row.val_str_first;
+ if (fetched)
+ {
+ /* already fetched */
+ fetched = FALSE;
+ } else {
+ res = OCIStmtFetch2(stmtp, db_conn->errhp, 1, OCI_FETCH_NEXT, 0,
+ OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ store_error_num = spider_db_oracle_get_error(res, db_conn->errhp, 0,
+ NULL, NULL, access_charset, NULL);
+ DBUG_RETURN(NULL);
+ }
+ }
+ if ((store_error_num = row.fetch()))
+ {
+ DBUG_RETURN(NULL);
+ }
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+SPIDER_DB_ROW *spider_db_oracle_result::fetch_row_from_tmp_table(
+ TABLE *tmp_table
+) {
+ uint i;
+ const char *str;
+ spider_string tmp_str1, tmp_str2, tmp_str3;
+ DBUG_ENTER("spider_db_oracle_result::fetch_row_from_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_str1.init_calc_mem(175);
+ tmp_str2.init_calc_mem(178);
+ tmp_str3.init_calc_mem(179);
+ tmp_table->field[0]->val_str(tmp_str1.get_str());
+ tmp_table->field[1]->val_str(tmp_str2.get_str());
+ tmp_table->field[2]->val_str(tmp_str3.get_str());
+ tmp_str1.mem_calc();
+ tmp_str2.mem_calc();
+ tmp_str3.mem_calc();
+ row.ind = row.ind_first;
+ row.val = row.val_first;
+ row.rlen = row.rlen_first;
+ row.row_size = row.row_size_first;
+ row.val_str = row.val_str_first;
+ DBUG_PRINT("info",("spider tmp_str1.length()=%u", tmp_str1.length()));
+ DBUG_PRINT("info",("spider tmp_str2.length()=%u", tmp_str2.length()));
+ DBUG_PRINT("info",("spider tmp_str3.length()=%u", tmp_str3.length()));
+ memcpy(row.ind, tmp_str3.ptr(), tmp_str3.length());
+ memcpy(row.row_size, tmp_str1.ptr(), tmp_str1.length());
+ row.field_count = tmp_str1.length() / sizeof(ulong);
+ str = tmp_str2.ptr();
+ for (i = 0; i < row.field_count; i++)
+ {
+ row.val_str[i].length(0);
+ if (row.row_size[i])
+ {
+ if (row.val_str[i].reserve(row.row_size[i]))
+ {
+ store_error_num = HA_ERR_OUT_OF_MEM;
+ DBUG_RETURN(NULL);
+ }
+ row.val_str[i].q_append(str, row.row_size[i]);
+ str += row.row_size[i];
+ }
+ }
+ DBUG_RETURN((SPIDER_DB_ROW *) &row);
+}
+
+int spider_db_oracle_result::fetch_table_status(
+ int mode,
+ ha_rows &records,
+ ulong &mean_rec_length,
+ ulonglong &data_file_length,
+ ulonglong &max_data_file_length,
+ ulonglong &index_file_length,
+ ulonglong &auto_increment_value,
+ time_t &create_time,
+ time_t &update_time,
+ time_t &check_time
+) {
+ DBUG_ENTER("spider_db_oracle_result::fetch_table_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* TODO: develop later */
+ records = 2;
+ mean_rec_length = 65535;
+ data_file_length = 65535;
+ max_data_file_length = 65535;
+ index_file_length = 65535;
+/*
+ auto_increment_value = 0;
+*/
+ create_time = (time_t) 0;
+ update_time = (time_t) 0;
+ check_time = (time_t) 0;
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_result::fetch_table_records(
+ int mode,
+ ha_rows &records
+) {
+ DBUG_ENTER("spider_db_oracle_result::fetch_table_records");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!fetch_row())
+ {
+ records = 0;
+ } else {
+ records = row.val_int();
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_result::fetch_table_cardinality(
+ int mode,
+ TABLE *table,
+ longlong *cardinality,
+ uchar *cardinality_upd,
+ int bitmap_size
+) {
+ DBUG_ENTER("spider_db_oracle_result::fetch_table_cardinality");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* TODO: develop later */
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_result::fetch_table_mon_status(
+ int &status
+) {
+ DBUG_ENTER("spider_db_oracle_result::fetch_table_mon_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* TODO: develop later */
+ status = SPIDER_LINK_MON_OK;
+ DBUG_RETURN(0);
+}
+
+longlong spider_db_oracle_result::num_rows()
+{
+ sword res;
+ ub4 rowcnt;
+ DBUG_ENTER("spider_db_oracle_result::num_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ res = OCIAttrGet(stmtp, OCI_HTYPE_STMT, &rowcnt, 0,
+ OCI_ATTR_ROW_COUNT, db_conn->errhp);
+ if (res != OCI_SUCCESS)
+ {
+ spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
+ access_charset, NULL);
+ DBUG_RETURN(0);
+ }
+ DBUG_PRINT("info",("spider rowcnt=%u", rowcnt));
+ DBUG_RETURN((longlong) rowcnt);
+}
+
+uint spider_db_oracle_result::num_fields()
+{
+ sword res;
+ ub4 parmcnt;
+ DBUG_ENTER("spider_db_oracle_result::num_fields");
+ DBUG_PRINT("info",("spider this=%p", this));
+ res = OCIAttrGet(stmtp, OCI_HTYPE_STMT, &parmcnt, 0,
+ OCI_ATTR_PARAM_COUNT, db_conn->errhp);
+ if (res != OCI_SUCCESS)
+ {
+ spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
+ access_charset, NULL);
+ DBUG_RETURN(0);
+ }
+ DBUG_RETURN((uint) parmcnt);
+}
+
+void spider_db_oracle_result::move_to_pos(
+ longlong pos
+) {
+ sword res;
+ DBUG_ENTER("spider_db_oracle_result::move_to_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider pos=%lld", pos));
+ res = OCIStmtFetch2(stmtp, db_conn->errhp, 1, OCI_FETCH_ABSOLUTE, pos,
+ OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL, NULL,
+ access_charset, NULL);
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_oracle_result::set_column_info()
+{
+ sword res;
+ uint i;
+ DBUG_ENTER("spider_db_oracle_result::set_column_info");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (i = 0; i < field_count; i++)
+ {
+ res = OCIParamGet(stmtp, OCI_HTYPE_STMT, db_conn->errhp,
+ (dvoid **) &row.colhp[i], i + 1);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_RETURN(spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL,
+ NULL, access_charset, NULL));
+ }
+ res = OCIAttrGet(row.colhp[i], OCI_DTYPE_PARAM, &row.coltp[i], NULL,
+ OCI_ATTR_DATA_TYPE, db_conn->errhp);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_RETURN(spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL,
+ NULL, access_charset, NULL));
+ }
+ res = OCIAttrGet(row.colhp[i], OCI_DTYPE_PARAM, &row.colsz[i], NULL,
+ OCI_ATTR_DATA_SIZE, db_conn->errhp);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_RETURN(spider_db_oracle_get_error(res, db_conn->errhp, 0, NULL,
+ NULL, access_charset, NULL));
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_result::get_errno()
+{
+ DBUG_ENTER("spider_db_oracle_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_oracle_result::fetch_columns_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_oracle_result::fetch_columns_for_discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+}
+
+int spider_db_oracle_result::fetch_index_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_oracle_result::fetch_index_for_discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+}
+#endif
+
+spider_db_oracle::spider_db_oracle(
+ SPIDER_CONN *conn
+) : spider_db_conn(conn), envhp(NULL), errhp(NULL), srvhp(NULL), svchp(NULL),
+ usrhp(NULL), stmtp(NULL), txnhp(NULL), result(NULL), table_lock_mode(0),
+ lock_table_hash_inited(FALSE), handler_open_array_inited(FALSE)
+{
+ DBUG_ENTER("spider_db_oracle::spider_db_oracle");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_oracle::~spider_db_oracle()
+{
+ DBUG_ENTER("spider_db_oracle::~spider_db_oracle");
+ 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);
+ }
+ if (lock_table_hash_inited)
+ {
+ spider_free_mem_calc(spider_current_trx,
+ lock_table_hash_id,
+ lock_table_hash.array.max_element *
+ lock_table_hash.array.size_of_element);
+ my_hash_free(&lock_table_hash);
+ }
+ disconnect();
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_oracle::init()
+{
+ DBUG_ENTER("spider_db_oracle::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (
+ my_hash_init(&lock_table_hash, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_link_get_key, 0, 0)
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ spider_alloc_calc_mem_init(lock_table_hash, 199);
+ spider_alloc_calc_mem(spider_current_trx,
+ lock_table_hash,
+ lock_table_hash.array.max_element *
+ lock_table_hash.array.size_of_element);
+ lock_table_hash_inited = TRUE;
+
+ 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, 164);
+ 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_oracle::is_connected()
+{
+ DBUG_ENTER("spider_db_oracle::is_connected");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(svchp);
+}
+
+void spider_db_oracle::bg_connect()
+{
+ sword res;
+ DBUG_ENTER("spider_db_oracle::bg_connect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ res = OCIEnvNlsCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0, 0, 0);
+/*
+ res = OCIEnvCreate(&envhp, OCI_THREADED, 0, 0, 0, 0, 0, 0);
+*/
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider create environment error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ goto error;
+ }
+ DBUG_PRINT("info",("spider OCI init envhp=%p", envhp));
+
+ res = OCIHandleAlloc(envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR, 0, 0);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider create error handler error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+ DBUG_PRINT("info",("spider OCI init errhp=%p", errhp));
+
+ res = OCIHandleAlloc(envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER, 0, 0);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider create server handler error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+ DBUG_PRINT("info",("spider OCI init srvhp=%p", srvhp));
+
+ res = OCIServerAttach(srvhp, errhp, (OraText *) tgt_host, strlen(tgt_host),
+ OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider attach server error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+
+ res = OCIHandleAlloc(envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX, 0, 0);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider create service context error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+ DBUG_PRINT("info",("spider OCI init svchp=%p", svchp));
+
+ res = OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, srvhp, 0, OCI_ATTR_SERVER, errhp);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider set server attr error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+
+ res = OCIHandleAlloc(envhp, (dvoid **) &usrhp, OCI_HTYPE_SESSION, 0, 0);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider create session handler error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+ DBUG_PRINT("info",("spider OCI init usrhp=%p", usrhp));
+
+ res = OCIAttrSet(usrhp, OCI_HTYPE_SESSION,
+ tgt_username, strlen(tgt_username), OCI_ATTR_USERNAME, errhp);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider set username attr error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+
+ res = OCIAttrSet(usrhp, OCI_HTYPE_SESSION,
+ tgt_password, strlen(tgt_password), OCI_ATTR_PASSWORD, errhp);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider set password attr error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+
+ res = OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider session begin error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+ DBUG_PRINT("info",("spider OCISessionBegin"));
+
+ // set the session in the context handle
+ res = OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, usrhp, 0, OCI_ATTR_SESSION, errhp);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider set session attr error"));
+ stored_error_num = set_error(res, errhp, 0, NULL, NULL);
+ bg_disconnect();
+ goto error;
+ }
+
+ if (
+ (stored_error_num = exec_query(SPIDER_SQL_SET_NLS_DATE_FORMAT_STR,
+ SPIDER_SQL_SET_NLS_DATE_FORMAT_LEN, -1)) ||
+ (stored_error_num = exec_query(SPIDER_SQL_SET_NLS_TIME_FORMAT_STR,
+ SPIDER_SQL_SET_NLS_TIME_FORMAT_LEN, -1)) ||
+ (stored_error_num = exec_query(SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_STR,
+ SPIDER_SQL_SET_NLS_TIMESTAMP_FORMAT_LEN, -1))
+ ) {
+ DBUG_PRINT("info",("spider init connection error"));
+ bg_disconnect();
+ goto error;
+ }
+ DBUG_VOID_RETURN;
+
+error:
+ strmov(stored_error_msg, spider_stmt_da_message(current_thd));
+ current_thd->clear_error();
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_oracle::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
+) {
+ int error_num;
+ DBUG_ENTER("spider_db_oracle::connect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ this->tgt_host = tgt_host;
+ this->tgt_username = tgt_username;
+ this->tgt_password = tgt_password;
+ this->tgt_port = tgt_port;
+ this->tgt_socket = tgt_socket;
+ this->server_name = server_name;
+ this->connect_retry_count = connect_retry_count;
+ this->connect_retry_interval = connect_retry_interval;
+ if ((error_num = spider_create_conn_thread(conn)))
+ DBUG_RETURN(error_num);
+ spider_bg_conn_simple_action(conn, SPIDER_BG_SIMPLE_CONNECT, TRUE, NULL,
+ 0, NULL);
+
+ if (stored_error_num)
+ {
+ my_message(stored_error_num, stored_error_msg, MYF(0));
+ DBUG_RETURN(stored_error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::ping(
+) {
+ sword res;
+ DBUG_ENTER("spider_db_oracle::ping");
+ DBUG_PRINT("info",("spider this=%p", this));
+ res = OCIPing(svchp, errhp, OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider ping error %d", res));
+ DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
+ }
+ DBUG_RETURN(0);
+}
+
+void spider_db_oracle::bg_disconnect()
+{
+ DBUG_ENTER("spider_db_oracle::bg_disconnect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (result)
+ {
+ delete result;
+ result = NULL;
+ }
+ if (txnhp)
+ {
+ DBUG_PRINT("info",("spider OCI free txnhp=%p", txnhp));
+ OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
+ txnhp = NULL;
+ }
+ if (stmtp)
+ {
+ DBUG_PRINT("info",("spider OCI free stmtp=%p", stmtp));
+ OCIHandleFree(stmtp, OCI_HTYPE_STMT);
+ stmtp = NULL;
+ }
+ if (svchp && errhp && usrhp)
+ {
+ DBUG_PRINT("info",("spider OCISessionEnd"));
+ OCISessionEnd(svchp, errhp, usrhp, OCI_DEFAULT);
+ }
+ if (usrhp)
+ {
+ DBUG_PRINT("info",("spider OCI free usrhp=%p", usrhp));
+ OCIHandleFree(usrhp, OCI_HTYPE_SESSION);
+ usrhp = NULL;
+ }
+ if (svchp)
+ {
+ DBUG_PRINT("info",("spider OCI free svchp=%p", svchp));
+ OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
+ svchp = NULL;
+ }
+ if (srvhp)
+ {
+ DBUG_PRINT("info",("spider OCI free srvhp=%p", srvhp));
+ OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
+ OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
+ srvhp = NULL;
+ }
+ if (errhp)
+ {
+ DBUG_PRINT("info",("spider OCI free errhp=%p", errhp));
+ OCIHandleFree(errhp, OCI_HTYPE_ERROR);
+ errhp = NULL;
+ }
+ if (envhp)
+ {
+ DBUG_PRINT("info",("spider OCI free envhp=%p", envhp));
+ OCIHandleFree(envhp, OCI_HTYPE_ENV);
+ envhp = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_db_oracle::disconnect()
+{
+ DBUG_ENTER("spider_db_oracle::disconnect");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!conn->bg_init)
+ DBUG_VOID_RETURN;
+ spider_bg_conn_simple_action(conn, SPIDER_BG_SIMPLE_DISCONNECT, TRUE, NULL,
+ 0, NULL);
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_oracle::set_net_timeout()
+{
+ DBUG_ENTER("spider_db_oracle::set_net_timeout");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* TODO: develop later */
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::exec_query(
+ const char *query,
+ uint length,
+ int quick_mode
+) {
+ sword res;
+ int error_num;
+ DBUG_ENTER("spider_db_oracle::exec_query");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_param_general_log())
+ {
+ const char *tgt_str = conn->tgt_host;
+ uint32 tgt_len = conn->tgt_host_length;
+ spider_string tmp_query_str(length + conn->tgt_wrapper_length +
+ tgt_len + (SPIDER_SQL_SPACE_LEN * 2));
+ tmp_query_str.init_calc_mem(232);
+ 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(query, length);
+ general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
+ tmp_query_str.length());
+ }
+ stored_error_num = 0;
+ if (table_lock_mode && !conn->in_before_query)
+ {
+ DBUG_PRINT("info",("spider table_lock_mode=%d", table_lock_mode));
+ table_lock_mode = 0;
+ if ((error_num = exec_query(exec_lock_sql->ptr(), exec_lock_sql->length(),
+ -1))) {
+ DBUG_RETURN(error_num);
+ }
+ }
+
+ if (length)
+ {
+ if (result)
+ {
+ delete result;
+ result = NULL;
+ }
+
+ if (!stmtp)
+ {
+ DBUG_PRINT("info",("spider create stmt"));
+ res = OCIHandleAlloc(envhp, (dvoid **) &stmtp, OCI_HTYPE_STMT, 0, 0);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider create stmt handler error"));
+ DBUG_RETURN(set_error(res, errhp, 0, NULL, NULL));
+ }
+ }
+
+ res = OCIStmtPrepare(stmtp, errhp, (OraText *) query, length,
+ OCI_NTV_SYNTAX, OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider stmt prepare error"));
+ DBUG_RETURN(set_error(res, errhp, 0, NULL, NULL));
+ }
+
+/*
+ if ((result = new spider_db_oracle_result()))
+ {
+ result->db_conn = this;
+ result->stmtp = stmtp;
+ stmtp = NULL;
+ result->field_count = result->num_fields();
+ result->row.field_count = result->field_count;
+ result->row.db_conn = this;
+ result->row.result = result;
+ if ((error_num = result->row.init()))
+ {
+ delete result;
+ result = NULL;
+ DBUG_RETURN(error_num);
+ }
+ } else {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+*/
+
+ /* select statement check */
+ ub4 iters;
+ if (
+ !strncasecmp(query, "select ", sizeof("select ") - 1) ||
+ !strncasecmp(query, "(select ", sizeof("(select ") - 1)
+ ) {
+ iters = 0;
+ } else {
+ iters = 1;
+ }
+
+ if (quick_mode)
+ {
+ DBUG_PRINT("info",("spider use OCI_DEFAULT"));
+ res = OCIStmtExecute(svchp, stmtp, errhp, iters, 0, NULL, NULL,
+ OCI_DEFAULT);
+ } else {
+ DBUG_PRINT("info",("spider use OCI_STMT_SCROLLABLE_READONLY"));
+ res = OCIStmtExecute(svchp, stmtp, errhp, iters, 0, NULL, NULL,
+ OCI_STMT_SCROLLABLE_READONLY);
+/*
+ if (res == OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider fetch last for row count"));
+ res = OCIStmtFetch2(result->stmtp, errhp, 1, OCI_FETCH_LAST, 0,
+ OCI_DEFAULT);
+ }
+ if (res == OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider fetch first for row count"));
+ res = OCIStmtFetch2(result->stmtp, errhp, 1, OCI_FETCH_FIRST, 0,
+ OCI_DEFAULT);
+ }
+*/
+ }
+ if (res == OCI_SUCCESS && iters)
+ {
+ DBUG_PRINT("info",("spider get row count"));
+ ub4 row_count;
+ res = OCIAttrGet(stmtp, OCI_HTYPE_STMT, &row_count, 0,
+ OCI_ATTR_ROW_COUNT, errhp);
+ update_rows = (uint) row_count;
+ DBUG_PRINT("info",("spider row_count=%u", update_rows));
+ }
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider stmt execute error"));
+ error_num = set_error(res, errhp, 0, NULL, NULL);
+ if (error_num == HA_ERR_END_OF_FILE)
+ DBUG_RETURN(0);
+ DBUG_RETURN(error_num);
+ }
+
+ if ((result = new spider_db_oracle_result()))
+ {
+ result->db_conn = this;
+ result->stmtp = stmtp;
+ stmtp = NULL;
+ result->field_count = result->num_fields();
+ result->row.field_count = result->field_count;
+ result->row.db_conn = this;
+ result->row.result = result;
+ result->row.access_charset = conn->access_charset;
+ result->access_charset = conn->access_charset;
+ if (
+ (error_num = result->row.init()) ||
+ (error_num = result->set_column_info())
+ ) {
+ delete result;
+ result = NULL;
+ DBUG_RETURN(error_num);
+ }
+ result->row.define();
+ } else {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ if (!quick_mode && !iters)
+ {
+ if (res == OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider fetch last for row count"));
+ res = OCIStmtFetch2(result->stmtp, errhp, 1, OCI_FETCH_LAST, 0,
+ OCI_DEFAULT);
+ }
+ if (res == OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider fetch first for row count"));
+ res = OCIStmtFetch2(result->stmtp, errhp, 1, OCI_FETCH_FIRST, 0,
+ OCI_DEFAULT);
+ }
+ if (res != OCI_SUCCESS)
+ {
+ DBUG_PRINT("info",("spider stmt execute error"));
+ error_num = set_error(res, errhp, 0, NULL, NULL);
+ if (error_num == HA_ERR_END_OF_FILE)
+ DBUG_RETURN(0);
+ DBUG_RETURN(error_num);
+ }
+ result->fetched = TRUE;
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::get_errno()
+{
+ DBUG_ENTER("spider_db_oracle::get_errno");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider stored_error=%d", stored_error_num));
+ DBUG_RETURN(stored_error_num);
+}
+
+const char *spider_db_oracle::get_error()
+{
+ DBUG_ENTER("spider_db_oracle::get_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider error=%s", stored_error));
+ DBUG_RETURN(stored_error);
+}
+
+bool spider_db_oracle::is_server_gone_error(
+ int error_num
+) {
+ DBUG_ENTER("spider_db_oracle::is_server_gone_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* TODO: develop later */
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_db_oracle::is_dup_entry_error(
+ int error_num
+) {
+ DBUG_ENTER("spider_db_oracle::is_dup_entry_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (error_num == HA_ERR_FOUND_DUPP_KEY)
+ DBUG_RETURN(TRUE);
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_db_oracle::is_xa_nota_error(
+ int error_num
+) {
+ DBUG_ENTER("spider_db_oracle::is_xa_nota_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* TODO: develop later */
+ DBUG_RETURN(FALSE);
+}
+
+spider_db_result *spider_db_oracle::store_result(
+ spider_db_result_buffer **spider_res_buf,
+ st_spider_db_request_key *request_key,
+ int *error_num
+) {
+ spider_db_oracle_result *tmp_result = result;
+ DBUG_ENTER("spider_db_oracle::store_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(!spider_res_buf);
+ if (stored_error_num == HA_ERR_END_OF_FILE)
+ {
+ *error_num = HA_ERR_END_OF_FILE;
+ DBUG_RETURN(NULL);
+ }
+
+ *error_num = 0;
+ result = NULL;
+ DBUG_RETURN(tmp_result);
+}
+
+spider_db_result *spider_db_oracle::use_result(
+ st_spider_db_request_key *request_key,
+ int *error_num
+) {
+ spider_db_oracle_result *tmp_result = result;
+ DBUG_ENTER("spider_db_oracle::use_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (stored_error_num == HA_ERR_END_OF_FILE)
+ {
+ *error_num = HA_ERR_END_OF_FILE;
+ DBUG_RETURN(NULL);
+ }
+
+ *error_num = 0;
+ result = NULL;
+ DBUG_RETURN(tmp_result);
+}
+
+int spider_db_oracle::next_result()
+{
+ DBUG_ENTER("spider_db_oracle::next_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* TODO: develop later */
+ DBUG_RETURN(-1);
+}
+
+uint spider_db_oracle::affected_rows()
+{
+ DBUG_ENTER("spider_db_oracle::affected_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(update_rows);
+}
+
+ulonglong spider_db_oracle::last_insert_id()
+{
+ DBUG_ENTER("spider_db_oracle::last_insert_id");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(stored_last_insert_id);
+}
+
+int spider_db_oracle::set_character_set(
+ const char *csname
+) {
+ DBUG_ENTER("spider_db_oracle::set_character_set");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* TODO: develop later */
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::select_db(
+ const char *dbname
+) {
+ DBUG_ENTER("spider_db_oracle::select_db");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do for oracle */
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::consistent_snapshot(
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_oracle::consistent_snapshot");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do for oracle */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_oracle::trx_start_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_oracle::trx_start_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_oracle::start_transaction(
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_oracle::start_transaction");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (conn->in_before_query)
+ {
+ if (conn->queued_semi_trx_isolation)
+ {
+ if (conn->queued_semi_trx_isolation_val != conn->trx_isolation)
+ {
+ /* nothing to do */
+ DBUG_RETURN(0);
+ }
+ } else if (conn->queued_trx_isolation)
+ {
+ if (conn->queued_trx_isolation_val != conn->trx_isolation)
+ {
+ /* nothing to do */
+ DBUG_RETURN(0);
+ }
+ }
+ DBUG_RETURN(set_trx_isolation(conn->trx_isolation, need_mon));
+ }
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_START_TRANSACTION_STR,
+ SPIDER_SQL_START_TRANSACTION_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::commit(
+ int *need_mon
+) {
+ sword res;
+ DBUG_ENTER("spider_db_oracle::commit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (conn->table_locked)
+ {
+ conn->table_locked = FALSE;
+ spider_current_trx->locked_connections--;
+ }
+ res = OCITransCommit(svchp, errhp, OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ *need_mon = set_error(res, errhp, 0, NULL, NULL);
+ DBUG_RETURN(*need_mon);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::rollback(
+ int *need_mon
+) {
+ sword res;
+ DBUG_ENTER("spider_db_oracle::rollback");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (conn->table_locked)
+ {
+ conn->table_locked = FALSE;
+ spider_current_trx->locked_connections--;
+ }
+ if (svchp && errhp)
+ {
+ res = OCITransRollback(svchp, errhp, OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ *need_mon = set_error(res, errhp, 0, NULL, NULL);
+ DBUG_RETURN(*need_mon);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_db_oracle::xa_start_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_oracle::xa_start_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_oracle::xa_start(
+ XID *xid,
+ int *need_mon
+) {
+ sword res;
+ DBUG_ENTER("spider_db_oracle::xa_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (txnhp)
+ {
+ OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
+ txnhp = NULL;
+ }
+ OCIHandleAlloc((dvoid *)envhp, (dvoid **)&txnhp, OCI_HTYPE_TRANS, 0, 0);
+ OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp, 0,
+ OCI_ATTR_TRANS, errhp);
+ OCIAttrSet((dvoid *)txnhp, OCI_HTYPE_TRANS, (dvoid *)xid, sizeof(XID),
+ OCI_ATTR_XID, errhp);
+
+ res = OCITransStart(svchp, errhp, 31622400, OCI_TRANS_NEW);
+ if (res != OCI_SUCCESS)
+ {
+ *need_mon = set_error(res, errhp, 0, NULL, NULL);
+ DBUG_RETURN(*need_mon);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::xa_end(
+ XID *xid,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_oracle::xa_end");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do for oracle */
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::xa_prepare(
+ XID *xid,
+ int *need_mon
+) {
+ sword res;
+ DBUG_ENTER("spider_db_oracle::xa_prepare");
+ DBUG_PRINT("info",("spider this=%p", this));
+ res = OCITransPrepare(svchp, errhp, OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ *need_mon = set_error(res, errhp, 0, NULL, NULL);
+ DBUG_RETURN(*need_mon);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::xa_commit(
+ XID *xid,
+ int *need_mon
+) {
+ sword res;
+ DBUG_ENTER("spider_db_oracle::xa_commit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (conn->table_locked)
+ {
+ conn->table_locked = FALSE;
+ spider_current_trx->locked_connections--;
+ }
+ res = OCITransCommit(svchp, errhp, OCI_TRANS_TWOPHASE);
+ if (res != OCI_SUCCESS)
+ {
+ *need_mon = set_error(res, errhp, 0, NULL, NULL);
+ if (txnhp)
+ {
+ OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
+ txnhp = NULL;
+ }
+ DBUG_RETURN(*need_mon);
+ }
+ if (txnhp)
+ {
+ OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
+ txnhp = NULL;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::xa_rollback(
+ XID *xid,
+ int *need_mon
+) {
+ sword res;
+ DBUG_ENTER("spider_db_oracle::xa_rollback");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (svchp && errhp)
+ {
+ res = OCITransRollback(svchp, errhp, OCI_DEFAULT);
+ if (res != OCI_SUCCESS)
+ {
+ *need_mon = set_error(res, errhp, 0, NULL, NULL);
+ if (txnhp)
+ {
+ OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
+ txnhp = NULL;
+ }
+ DBUG_RETURN(*need_mon);
+ }
+ }
+ if (txnhp)
+ {
+ OCIHandleFree(txnhp, OCI_HTYPE_TRANS);
+ txnhp = NULL;
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_db_oracle::set_trx_isolation_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_oracle::set_trx_isolation_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_oracle::set_trx_isolation(
+ int trx_isolation,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_oracle::set_trx_isolation");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (trx_isolation)
+ {
+ case ISO_READ_UNCOMMITTED:
+ case ISO_READ_COMMITTED:
+ if (conn->in_before_query)
+ {
+ DBUG_RETURN(exec_query(SPIDER_SQL_ISO_READ_COMMITTED_STR,
+ SPIDER_SQL_ISO_READ_COMMITTED_LEN, -1));
+ }
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_ISO_READ_COMMITTED_STR,
+ SPIDER_SQL_ISO_READ_COMMITTED_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ break;
+ case ISO_REPEATABLE_READ:
+ case ISO_SERIALIZABLE:
+ if (conn->in_before_query)
+ {
+ DBUG_RETURN(exec_query(SPIDER_SQL_ISO_SERIALIZABLE_STR,
+ SPIDER_SQL_ISO_SERIALIZABLE_LEN, -1));
+ }
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_ISO_SERIALIZABLE_STR,
+ SPIDER_SQL_ISO_SERIALIZABLE_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ break;
+ default:
+ DBUG_RETURN(HA_ERR_UNSUPPORTED);
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_db_oracle::set_autocommit_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_oracle::set_autocommit_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_oracle::set_autocommit(
+ bool autocommit,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_oracle::set_autocommit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (autocommit)
+ {
+ if (conn->in_before_query)
+ {
+ DBUG_RETURN(exec_query(SPIDER_SQL_AUTOCOMMIT_ON_STR,
+ SPIDER_SQL_AUTOCOMMIT_ON_LEN, -1));
+ }
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_AUTOCOMMIT_ON_STR,
+ SPIDER_SQL_AUTOCOMMIT_ON_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ } else {
+ if (conn->in_before_query)
+ {
+ DBUG_RETURN(exec_query(SPIDER_SQL_AUTOCOMMIT_OFF_STR,
+ SPIDER_SQL_AUTOCOMMIT_OFF_LEN, -1));
+ }
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_AUTOCOMMIT_OFF_STR,
+ SPIDER_SQL_AUTOCOMMIT_OFF_LEN,
+ -1,
+ need_mon)
+ )
+ DBUG_RETURN(spider_db_errorno(conn));
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_db_oracle::set_sql_log_off_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_oracle::set_sql_log_off_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_oracle::set_sql_log_off(
+ bool sql_log_off,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_oracle::set_sql_log_off");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+bool spider_db_oracle::set_time_zone_in_bulk_sql()
+{
+ DBUG_ENTER("spider_db_oracle::set_time_zone_in_bulk_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_db_oracle::set_time_zone(
+ Time_zone *time_zone,
+ int *need_mon
+) {
+ DBUG_ENTER("spider_db_oracle::set_time_zone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+int spider_db_oracle::append_sql(
+ char *sql,
+ ulong sql_length,
+ st_spider_db_request_key *request_key
+) {
+ DBUG_ENTER("spider_db_oracle::append_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::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
+) {
+ DBUG_ENTER("spider_db_oracle::append_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::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
+) {
+ DBUG_ENTER("spider_db_oracle::append_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::append_insert(
+ uint handler_id,
+ SPIDER_DB_HS_STRING_REF_BUFFER *upds,
+ st_spider_db_request_key *request_key
+) {
+ DBUG_ENTER("spider_db_oracle::append_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::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
+) {
+ DBUG_ENTER("spider_db_oracle::append_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::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
+) {
+ DBUG_ENTER("spider_db_oracle::append_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+void spider_db_oracle::reset_request_queue()
+{
+ DBUG_ENTER("spider_db_oracle::reset_request_queue");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_VOID_RETURN;
+}
+#endif
+
+size_t spider_db_oracle::escape_string(
+ char *to,
+ const char *from,
+ size_t from_length
+) {
+ DBUG_ENTER("spider_db_oracle::escape_string");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(util.escape_string(to, from, from_length, conn->access_charset));
+}
+
+bool spider_db_oracle::have_lock_table_list()
+{
+ DBUG_ENTER("spider_db_oracle::have_lock_table_list");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(lock_table_hash.records);
+}
+
+int spider_db_oracle::append_lock_tables(
+ spider_string *str
+) {
+ int error_num;
+ ha_spider *tmp_spider;
+ int lock_type;
+ uint conn_link_idx;
+ int tmp_link_idx;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
+ 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;
+ DBUG_ENTER("spider_db_oracle::lock_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((tmp_link_for_hash =
+ (SPIDER_LINK_FOR_HASH *) my_hash_element(&lock_table_hash, 0)))
+ {
+ if ((error_num = spider_db_oracle_utility.append_lock_table_head(str)))
+ {
+ DBUG_RETURN(error_num);
+ }
+
+ tmp_spider = tmp_link_for_hash->spider;
+ tmp_link_idx = tmp_link_for_hash->link_idx;
+ switch (tmp_spider->lock_type)
+ {
+ case TL_READ:
+ lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL;
+ break;
+ case TL_READ_NO_INSERT:
+ lock_type = SPIDER_DB_TABLE_LOCK_READ;
+ break;
+ case TL_WRITE_LOW_PRIORITY:
+ lock_type = SPIDER_DB_TABLE_LOCK_LOW_PRIORITY_WRITE;
+ break;
+ case TL_WRITE:
+ lock_type = SPIDER_DB_TABLE_LOCK_WRITE;
+ break;
+ default:
+ // no lock
+ DBUG_PRINT("info",("spider lock_type=%d", tmp_spider->lock_type));
+ DBUG_RETURN(0);
+ }
+ conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx];
+ spider_oracle_share *db_share = (spider_oracle_share *)
+ tmp_spider->share->dbton_share[conn->dbton_id];
+ if (&db_share->db_names_str[conn_link_idx])
+ {
+ db_name = db_share->db_names_str[conn_link_idx].ptr();
+ db_name_length = db_share->db_names_str[conn_link_idx].length();
+ db_name_charset = tmp_spider->share->access_charset;
+ } else {
+ db_name = tmp_spider->share->tgt_dbs[conn_link_idx];
+ db_name_length = tmp_spider->share->tgt_dbs_lengths[conn_link_idx];
+ db_name_charset = system_charset_info;
+ }
+ if (&db_share->table_names_str[conn_link_idx])
+ {
+ table_name = db_share->table_names_str[conn_link_idx].ptr();
+ table_name_length = db_share->table_names_str[conn_link_idx].length();
+ table_name_charset = tmp_spider->share->access_charset;
+ } else {
+ table_name = tmp_spider->share->tgt_table_names[conn_link_idx];
+ table_name_length =
+ tmp_spider->share->tgt_table_names_lengths[conn_link_idx];
+ table_name_charset = system_charset_info;
+ }
+ if ((error_num = spider_db_oracle_utility.
+ append_lock_table_body(
+ str,
+ db_name,
+ db_name_length,
+ db_name_charset,
+ table_name,
+ table_name_length,
+ table_name_charset,
+ lock_type
+ )
+ )) {
+ my_hash_reset(&lock_table_hash);
+ DBUG_RETURN(error_num);
+ }
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ my_hash_delete_with_hash_value(&lock_table_hash,
+ tmp_link_for_hash->db_table_str_hash_value, (uchar*) tmp_link_for_hash);
+#else
+ my_hash_delete(&lock_table_hash, (uchar*) tmp_link_for_hash);
+#endif
+
+ if ((error_num = spider_db_oracle_utility.append_lock_table_tail(str)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle::append_unlock_tables(
+ spider_string *str
+) {
+ int error_num;
+ DBUG_ENTER("spider_db_oracle::append_unlock_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = spider_db_oracle_utility.append_unlock_table(str)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+uint spider_db_oracle::get_lock_table_hash_count()
+{
+ DBUG_ENTER("spider_db_oracle::get_lock_table_hash_count");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(lock_table_hash.records);
+}
+
+void spider_db_oracle::reset_lock_table_hash()
+{
+ DBUG_ENTER("spider_db_oracle::reset_lock_table_hash");
+ DBUG_PRINT("info",("spider this=%p", this));
+ my_hash_reset(&lock_table_hash);
+ DBUG_VOID_RETURN;
+}
+
+uint spider_db_oracle::get_opened_handler_count()
+{
+ DBUG_ENTER("spider_db_oracle::get_opened_handler_count");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(handler_open_array.elements);
+}
+
+void spider_db_oracle::reset_opened_handler()
+{
+ ha_spider *tmp_spider;
+ int tmp_link_idx;
+ SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
+ DBUG_ENTER("spider_db_oracle::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_oracle::set_dup_key_idx(
+ ha_spider *spider,
+ int link_idx
+) {
+ TABLE *table = spider->get_table();
+ uint roop_count, pk_idx = table->s->primary_key;
+ int key_name_length;
+ int max_length = 0;
+ char *key_name, *tmp_pos;
+ char buf[SPIDER_ORACLE_ERR_BUF_LEN];
+ DBUG_ENTER("spider_db_oracle::set_dup_key_idx");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider error_str=%s", stored_error_msg));
+ memcpy(buf, spider->share->tgt_dbs[link_idx],
+ spider->share->tgt_dbs_lengths[link_idx]);
+ tmp_pos = buf + spider->share->tgt_dbs_lengths[link_idx];
+ *tmp_pos = '.';
+ ++tmp_pos;
+ for (roop_count = 0; roop_count < table->s->keys; roop_count++)
+ {
+ if (roop_count == pk_idx)
+ {
+ DBUG_PRINT("info",("spider pk_idx=%u", roop_count));
+ int all_link_idx = spider->conn_link_idx[link_idx];
+ key_name = spider->share->tgt_pk_names[all_link_idx];
+ key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx];
+ } else {
+ key_name = table->s->key_info[roop_count].name;
+ key_name_length = strlen(key_name);
+ }
+ memcpy(tmp_pos, key_name, key_name_length + 1);
+ DBUG_PRINT("info",("spider key_name=%s", key_name));
+ DBUG_PRINT("info",("spider full key name=%s", buf));
+ if (
+ max_length < key_name_length &&
+ strcasestr(stored_error_msg, buf)
+ ) {
+ max_length = key_name_length;
+ spider->dup_key_idx = roop_count;
+ }
+ }
+ if (max_length == 0)
+ spider->dup_key_idx = (uint) -1;
+ DBUG_PRINT("info",("spider dup_key_idx=%d", spider->dup_key_idx));
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_oracle::cmp_request_key_to_snd(
+ st_spider_db_request_key *request_key
+) {
+ DBUG_ENTER("spider_db_oracle::cmp_request_key_to_snd");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(TRUE);
+}
+
+int spider_db_oracle::set_error(
+ sword res,
+ dvoid *hndlp,
+ int error_num,
+ const char *error1,
+ const char *error2
+) {
+ DBUG_ENTER("spider_db_oracle::set_error");
+ DBUG_PRINT("info",("spider this=%p", this));
+ stored_error_num =
+ spider_db_oracle_get_error(res, hndlp, error_num, error1, error2,
+ conn->access_charset, stored_error_msg);
+ if (stored_error_num)
+ stored_error = ER_SPIDER_ORACLE_ERR;
+ else
+ stored_error = "";
+ DBUG_RETURN(stored_error_num);
+}
+
+spider_db_oracle_util::spider_db_oracle_util() : spider_db_util()
+{
+ DBUG_ENTER("spider_db_oracle_util::spider_db_oracle_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_oracle_util::~spider_db_oracle_util()
+{
+ DBUG_ENTER("spider_db_oracle_util::~spider_db_oracle_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_oracle_util::append_name(
+ spider_string *str,
+ const char *name,
+ uint name_length
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_name");
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->q_append(name, name_length);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_name_with_charset(
+ spider_string *str,
+ const char *name,
+ uint name_length,
+ CHARSET_INFO *name_charset
+) {
+ DBUG_ENTER("spider_db_oracle_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);
+}
+
+bool spider_db_oracle_util::is_name_quote(
+ const char head_code
+) {
+ DBUG_ENTER("spider_db_oracle_util::is_name_quote");
+ DBUG_RETURN(head_code == *name_quote_str);
+}
+
+int spider_db_oracle_util::append_escaped_name_quote(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_oracle_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_oracle_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_oracle_util::append_column_value");
+ tmp_str.init_calc_mem(181);
+
+ 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
+*/
+ if (field->result_type() == STRING_RESULT)
+ {
+ DBUG_PRINT("info", ("spider STRING_RESULT"));
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ if (
+ field->type() == MYSQL_TYPE_VARCHAR ||
+ (field->type() >= MYSQL_TYPE_ENUM &&
+ field->type() <= MYSQL_TYPE_GEOMETRY)
+ ) {
+ DBUG_PRINT("info", ("spider append_escaped"));
+ char buf2[MAX_FIELD_WIDTH];
+ spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, access_charset);
+ tmp_str2.init_calc_mem(182);
+ tmp_str2.length(0);
+ if (
+ tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
+ str->reserve(tmp_str2.length() * 2) ||
+ append_escaped_util(str, tmp_str2.get_str())
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ } else if (str->append(*ptr))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ } else if (field->str_needs_quotes())
+ {
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ append_escaped_util(str, ptr);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ } else if (str->append(*ptr))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_from_with_alias(
+ spider_string *str,
+ const char **table_names,
+ uint *table_name_lengths,
+ const char **table_aliases,
+ uint *table_alias_lengths,
+ uint table_count,
+ int *table_name_pos,
+ bool over_write
+) {
+ uint roop_count, length = 0;
+ DBUG_ENTER("spider_db_oracle_util::append_from_with_alias");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!over_write)
+ {
+ for (roop_count = 0; roop_count < table_count; roop_count++)
+ length += table_name_lengths[roop_count] + SPIDER_SQL_SPACE_LEN +
+ table_alias_lengths[roop_count] + SPIDER_SQL_COMMA_LEN;
+ if (str->reserve(SPIDER_SQL_FROM_LEN + length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ *table_name_pos = str->length();
+ }
+ for (roop_count = 0; roop_count < table_count; roop_count++)
+ {
+ str->q_append(table_names[roop_count], table_name_lengths[roop_count]);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(table_aliases[roop_count], table_alias_lengths[roop_count]);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_trx_isolation(
+ spider_string *str,
+ int trx_isolation
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_trx_isolation");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
+ SPIDER_SQL_ISO_READ_COMMITTED_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ {
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+ switch (trx_isolation)
+ {
+ case ISO_READ_UNCOMMITTED:
+ case ISO_READ_COMMITTED:
+ str->q_append(SPIDER_SQL_ISO_READ_COMMITTED_STR,
+ SPIDER_SQL_ISO_READ_COMMITTED_LEN);
+ break;
+ case ISO_REPEATABLE_READ:
+ case ISO_SERIALIZABLE:
+ str->q_append(SPIDER_SQL_ISO_SERIALIZABLE_STR,
+ SPIDER_SQL_ISO_SERIALIZABLE_LEN);
+ break;
+ default:
+ DBUG_RETURN(HA_ERR_UNSUPPORTED);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_autocommit(
+ spider_string *str,
+ bool autocommit
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_autocommit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_AUTOCOMMIT_OFF_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ {
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+ if (autocommit)
+ {
+ str->q_append(SPIDER_SQL_AUTOCOMMIT_ON_STR,
+ SPIDER_SQL_AUTOCOMMIT_ON_LEN);
+ } else {
+ str->q_append(SPIDER_SQL_AUTOCOMMIT_OFF_STR,
+ SPIDER_SQL_AUTOCOMMIT_OFF_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_sql_log_off(
+ spider_string *str,
+ bool sql_log_off
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_sql_log_off");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_time_zone(
+ spider_string *str,
+ Time_zone *time_zone
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_time_zone");
+ DBUG_PRINT("info",("spider this=%p", this));
+ /* nothing to do */
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_start_transaction(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_start_transaction");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
+ SPIDER_SQL_START_TRANSACTION_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ {
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+ str->q_append(SPIDER_SQL_START_TRANSACTION_STR,
+ SPIDER_SQL_START_TRANSACTION_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_xa_start(
+ spider_string *str,
+ XID *xid
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_xa_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_lock_table_head(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_lock_table_head");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_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_oracle_util::append_lock_table_body");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_LOCK_TABLE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->length())
+ {
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+ str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
+ 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);
+ if (
+ str->append(db_name, db_name_length, db_name_charset) ||
+ str->reserve((SPIDER_SQL_NAME_QUOTE_LEN) * 2 + SPIDER_SQL_DOT_LEN)
+ ) {
+ 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_DOT_STR, SPIDER_SQL_DOT_LEN);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if (
+ str->append(table_name, table_name_length, table_name_charset) ||
+ str->reserve(SPIDER_SQL_NAME_QUOTE_LEN +
+ spider_db_table_lock_len[lock_type])
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->q_append(spider_db_table_lock_str[lock_type],
+ spider_db_table_lock_len[lock_type]);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_lock_table_tail(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_lock_table_tail");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_unlock_table(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_unlock_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_COMMIT_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_COMMIT_STR, SPIDER_SQL_COMMIT_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::open_item_func(
+ Item_func *item_func,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ uint dbton_id = spider_dbton_oracle.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,
+ *separete_str = SPIDER_SQL_NULL_CHAR_STR,
+ *last_str = SPIDER_SQL_NULL_CHAR_STR;
+ int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
+ separete_str_length = SPIDER_SQL_NULL_CHAR_LEN,
+ last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
+ int use_pushdown_udf;
+ DBUG_ENTER("spider_db_oracle_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) &&
+ !item_func->arg_count
+ ) {
+ if (str)
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
+ alias, alias_length, dbton_id));
+ } 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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], spider, str,
+ alias, alias_length, dbton_id)))
+ 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, spider, str,
+ alias, alias_length, dbton_id));
+ } 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, spider, str,
+ alias, alias_length, dbton_id));
+ } 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 &&
+ !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 (func_name_length == 12)
+ {
+ if (!strncasecmp("cast_as_date", func_name, func_name_length))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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 &&
+ !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, spider, str,
+ alias, alias_length, dbton_id));
+ } else if (func_name_length == 14)
+ {
+ if (!strncasecmp("cast_as_binary", func_name, func_name_length))
+ {
+ 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 (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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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))
+ {
+ 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 (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))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ 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;
+ switch (item_date_add_interval->int_type)
+ {
+ case INTERVAL_YEAR:
+ case INTERVAL_QUARTER:
+ case INTERVAL_MONTH:
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_ADD_MONTHS_LEN +
+ SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ADD_MONTHS_STR,
+ SPIDER_SQL_ADD_MONTHS_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
+ SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ if ((error_num = spider_db_print_item_type(item_list[0], spider,
+ str, alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (item_date_add_interval->date_sub_interval)
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN +
+ SPIDER_SQL_MINUS_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ str->q_append(SPIDER_SQL_MINUS_STR, SPIDER_SQL_MINUS_LEN);
+ } else {
+ 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], spider,
+ str, alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (item_date_add_interval->int_type == INTERVAL_YEAR)
+ {
+ func_name = " * 12";
+ func_name_length = sizeof(" * 12") - 1;
+ if (str->reserve(func_name_length +
+ (SPIDER_SQL_CLOSE_PAREN_LEN * 2)))
+ 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);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ } else if (item_date_add_interval->int_type ==
+ INTERVAL_QUARTER)
+ {
+ func_name = " * 3";
+ func_name_length = sizeof(" * 3") - 1;
+ if (str->reserve(func_name_length +
+ (SPIDER_SQL_CLOSE_PAREN_LEN * 2)))
+ 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);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN * 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ }
+ break;
+ case INTERVAL_WEEK:
+ case INTERVAL_DAY:
+ case INTERVAL_HOUR:
+ case INTERVAL_MINUTE:
+ case INTERVAL_SECOND:
+ case INTERVAL_MICROSECOND:
+ if ((error_num = spider_db_print_item_type(item_list[0], spider,
+ str, alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (item_date_add_interval->date_sub_interval)
+ {
+ if (str->reserve(SPIDER_SQL_MINUS_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_MINUS_STR, SPIDER_SQL_MINUS_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_PLUS_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_PLUS_STR, SPIDER_SQL_PLUS_LEN);
+ }
+ }
+ if ((error_num = spider_db_print_item_type(item_list[1], spider,
+ str, alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (item_date_add_interval->int_type == INTERVAL_WEEK)
+ {
+ func_name = " * 7";
+ func_name_length = sizeof(" * 7") - 1;
+ 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);
+ } else if (item_date_add_interval->int_type == INTERVAL_HOUR)
+ {
+ func_name = " / 24";
+ func_name_length = sizeof(" / 24") - 1;
+ 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);
+ } else if (item_date_add_interval->int_type == INTERVAL_MINUTE)
+ {
+ func_name = " / 1440";
+ func_name_length = sizeof(" / 1440") - 1;
+ 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);
+ } else if (item_date_add_interval->int_type == INTERVAL_SECOND)
+ {
+ func_name = " / 86400";
+ func_name_length = sizeof(" / 86400") - 1;
+ 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);
+ } else if (item_date_add_interval->int_type ==
+ INTERVAL_MICROSECOND)
+ {
+ func_name = " / 86400000000";
+ func_name_length = sizeof(" / 86400000000") - 1;
+ 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);
+ } else {
+ 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;
+ default:
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ }
+ DBUG_RETURN(0);
+ break;
+ }
+ }
+ 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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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, spider, str,
+ alias, alias_length, dbton_id));
+ case Item_func::CHAR_TYPECAST_FUNC:
+ {
+ 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 (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:
+ 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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_AND_STR;
+ separete_str_length = SPIDER_SQL_AND_LEN;
+ } else {
+ func_name = (char*) item_func->func_name();
+ func_name_length = strlen(func_name);
+ separete_str = SPIDER_SQL_AND_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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));
+ 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, spider, str,
+ alias, alias_length, dbton_id));
+ else
+ DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
+ alias, alias_length, dbton_id));
+ 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);
+ }
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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;
+ separete_str = SPIDER_SQL_COMMA_STR;
+ separete_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 separete_str = %s", separete_str));
+ DBUG_PRINT("info",("spider separete_str_length = %d", separete_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, spider, str,
+ alias, alias_length, dbton_id)))
+ DBUG_RETURN(error_num);
+ if (roop_count == 1)
+ {
+ func_name = separete_str;
+ func_name_length = separete_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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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->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 (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_oracle_util::open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ uint dbton_id = spider_dbton_oracle.dbton_id;
+ uint roop_count, item_count = item_sum->get_arg_count();
+ int error_num;
+ DBUG_ENTER("spider_db_oracle_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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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, spider, str,
+ alias, alias_length, dbton_id)))
+ 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
+
+size_t spider_db_oracle_util::escape_string(
+ char *to,
+ const char *from,
+ size_t from_length,
+ CHARSET_INFO *access_charset
+) {
+ DBUG_ENTER("spider_db_oracle::escape_string");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(escape_quotes_for_mysql(access_charset, to, 0,
+ from, from_length));
+}
+
+int spider_db_oracle_util::append_escaped_util(
+ spider_string *to,
+ String *from
+) {
+ size_t copy_length;
+ DBUG_ENTER("spider_db_oracle_util::append_escaped_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider to=%s", to->c_ptr_safe()));
+ DBUG_PRINT("info",("spider from=%s", from->c_ptr_safe()));
+ copy_length = escape_string((char *) to->ptr() + to->length(), from->ptr(),
+ from->length(), to->charset());
+ DBUG_PRINT("info",("spider copy_length=%zu", copy_length));
+ to->length(to->length() + copy_length);
+ to->mem_calc();
+ DBUG_RETURN(0);
+}
+
+spider_oracle_share::spider_oracle_share(
+ st_spider_share *share
+) : spider_db_share(
+ share
+),
+ table_select(NULL),
+ table_select_pos(0),
+ key_select(NULL),
+ key_select_pos(NULL),
+ key_hint(NULL),
+ show_table_status(NULL),
+ show_records(NULL),
+ show_autoinc(NULL),
+ show_last_insert_id(NULL),
+ show_index(NULL),
+ table_names_str(NULL),
+ db_names_str(NULL),
+ db_table_str(NULL),
+ nextval_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),
+ nextval_max_length(0),
+ column_name_str(NULL),
+ same_db_table_name(TRUE),
+ first_all_link_idx(-1)
+{
+ DBUG_ENTER("spider_oracle_share::spider_oracle_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_alloc_calc_mem_init(mem_calc, 220);
+ spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+spider_oracle_share::~spider_oracle_share()
+{
+ DBUG_ENTER("spider_oracle_share::~spider_oracle_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (table_select)
+ delete [] table_select;
+ if (key_select)
+ delete [] key_select;
+ if (key_hint)
+ delete [] key_hint;
+ free_show_table_status();
+ free_show_records();
+ free_show_autoinc();
+ free_show_last_insert_id();
+ free_show_index();
+ free_column_name_str();
+ free_table_names_str();
+ if (key_select_pos)
+ {
+ spider_free(spider_current_trx, key_select_pos, MYF(0));
+ }
+ spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_share::init()
+{
+ int error_num;
+ uint roop_count;
+ TABLE_SHARE *table_share = spider_share->table_share;
+ uint keys = table_share ? table_share->keys : 0;
+ DBUG_ENTER("spider_oracle_share::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(key_select_pos = (int *)
+ spider_bulk_alloc_mem(spider_current_trx, 221,
+ __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
+ &key_select_pos,
+ sizeof(int) * keys,
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ &db_table_str_hash_value,
+ sizeof(my_hash_value_type) * spider_share->all_link_count,
+#endif
+ NullS))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ if (keys > 0 &&
+ !(key_hint = new spider_string[keys])
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ for (roop_count = 0; roop_count < keys; roop_count++)
+ {
+ key_hint[roop_count].init_calc_mem(190);
+ key_hint[roop_count].set_charset(spider_share->access_charset);
+ }
+ DBUG_PRINT("info",("spider key_hint=%p", key_hint));
+
+ if (
+ !(table_select = new spider_string[1]) ||
+ (keys > 0 &&
+ !(key_select = new spider_string[keys])
+ ) ||
+ (error_num = create_table_names_str()) ||
+ (table_share &&
+ (
+ (error_num = create_column_name_str()) ||
+ (error_num = convert_key_hint_str()) ||
+ (error_num = append_show_table_status()) ||
+ (error_num = append_show_records()) ||
+ (error_num = append_show_autoinc()) ||
+ (error_num = append_show_last_insert_id()) ||
+ (error_num = append_show_index())
+ )
+ )
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ table_select->init_calc_mem(191);
+ if (table_share && (error_num = append_table_select()))
+ DBUG_RETURN(error_num);
+
+ for (roop_count = 0; roop_count < keys; roop_count++)
+ {
+ key_select[roop_count].init_calc_mem(192);
+ if ((error_num = append_key_select(roop_count)))
+ DBUG_RETURN(error_num);
+ }
+
+ DBUG_RETURN(error_num);
+}
+
+uint spider_oracle_share::get_column_name_length(
+ uint field_index
+) {
+ DBUG_ENTER("spider_oracle_share::get_column_name_length");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(column_name_str[field_index].length());
+}
+
+int spider_oracle_share::append_column_name(
+ spider_string *str,
+ uint field_index
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_share::append_column_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = spider_db_oracle_utility.append_name(str,
+ column_name_str[field_index].ptr(), column_name_str[field_index].length());
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_share::append_column_name_with_alias(
+ spider_string *str,
+ uint field_index,
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_oracle_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);
+}
+
+int spider_oracle_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_oracle_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_oracle_utility.append_name(str, db_nm, db_nm_len);
+ str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
+ spider_db_oracle_utility.append_name(str, table_nm, table_nm_len);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_share::append_table_name_with_adjusting(
+ 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();
+ uint db_nm_max_len = db_nm_max_length;
+ const char *table_nm = table_names_str[all_link_idx].ptr();
+ uint table_nm_len = table_names_str[all_link_idx].length();
+ uint table_nm_max_len = table_nm_max_length;
+ DBUG_ENTER("spider_oracle_share::append_table_name_with_adjusting");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_db_oracle_utility.append_name(str, db_nm, db_nm_len);
+ str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
+ spider_db_oracle_utility.append_name(str, table_nm, table_nm_len);
+ uint length =
+ db_nm_max_len - db_nm_len +
+ table_nm_max_len - table_nm_len;
+ memset((char *) str->ptr() + str->length(), ' ', length);
+ str->length(str->length() + length);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_share::append_from_with_adjusted_table_name(
+ spider_string *str,
+ int *table_name_pos
+) {
+ const char *db_nm = db_names_str[0].ptr();
+ uint db_nm_len = db_names_str[0].length();
+ uint db_nm_max_len = db_nm_max_length;
+ const char *table_nm = table_names_str[0].ptr();
+ uint table_nm_len = table_names_str[0].length();
+ uint table_nm_max_len = table_nm_max_length;
+ DBUG_ENTER("spider_oracle_share::append_from_with_adjusted_table_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_FROM_LEN + db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ *table_name_pos = str->length();
+ spider_db_oracle_utility.append_name(str, db_nm, db_nm_len);
+ str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
+ spider_db_oracle_utility.append_name(str, table_nm, table_nm_len);
+ uint length =
+ db_nm_max_len - db_nm_len +
+ table_nm_max_len - table_nm_len;
+ memset((char *) str->ptr() + str->length(), ' ', length);
+ str->length(str->length() + length);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_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_oracle.dbton_id;
+ DBUG_ENTER("spider_oracle_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(193);
+ db_names_str[roop_count].init_calc_mem(194);
+ db_table_str[roop_count].init_calc_mem(195);
+ 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_oracle_share::free_table_names_str()
+{
+ DBUG_ENTER("spider_oracle_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_oracle_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_oracle.dbton_id;
+ DBUG_ENTER("spider_oracle_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(196);
+ str->set_charset(spider_share->access_charset);
+ if ((error_num = spider_db_append_name_with_quote_str(str,
+ (char *) (*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_oracle_share::free_column_name_str()
+{
+ DBUG_ENTER("spider_oracle_share::free_column_name_str");
+ if (column_name_str)
+ {
+ delete [] column_name_str;
+ column_name_str = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_share::convert_key_hint_str()
+{
+ spider_string *tmp_key_hint;
+ int roop_count;
+ TABLE_SHARE *table_share = spider_share->table_share;
+ DBUG_ENTER("spider_oracle_share::convert_key_hint_str");
+ if (spider_share->access_charset->cset != system_charset_info->cset)
+ {
+ /* need convertion */
+ for (roop_count = 0, tmp_key_hint = key_hint;
+ roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
+ {
+ tmp_key_hint->length(0);
+ if (tmp_key_hint->append(spider_share->key_hint->ptr(),
+ spider_share->key_hint->length(), system_charset_info))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ } else {
+ for (roop_count = 0, tmp_key_hint = key_hint;
+ roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
+ {
+ if (tmp_key_hint->copy(spider_share->key_hint[roop_count]))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_share::append_show_table_status()
+{
+ int roop_count;
+ spider_string *str;
+ uint dbton_id = spider_dbton_oracle.dbton_id;
+ DBUG_ENTER("spider_oracle_append_show_table_status");
+ if (!(show_table_status =
+ new spider_string[2 * spider_share->all_link_count]))
+ goto error;
+
+ for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
+ roop_count++)
+ {
+ show_table_status[0 + (2 * roop_count)].init_calc_mem(197);
+ show_table_status[1 + (2 * roop_count)].init_calc_mem(207);
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+
+ if (
+ show_table_status[0 + (2 * roop_count)].reserve(
+ SPIDER_SQL_SHOW_TABLE_STATUS_LEN +
+ db_names_str[roop_count].length() +
+ SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
+ ((SPIDER_SQL_NAME_QUOTE_LEN) * 2) +
+ ((SPIDER_SQL_VALUE_QUOTE_LEN) * 2)) ||
+ show_table_status[1 + (2 * roop_count)].reserve(
+ SPIDER_SQL_SELECT_TABLES_STATUS_LEN +
+ db_names_str[roop_count].length() +
+ SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
+ table_names_str[roop_count].length() +
+ ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4))
+ )
+ goto error;
+ str = &show_table_status[0 + (2 * roop_count)];
+ str->q_append(
+ SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->q_append(db_names_str[roop_count].ptr(),
+ db_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(table_names_str[roop_count].ptr(),
+ table_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str = &show_table_status[1 + (2 * roop_count)];
+ str->q_append(
+ SPIDER_SQL_SELECT_TABLES_STATUS_STR,
+ SPIDER_SQL_SELECT_TABLES_STATUS_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(db_names_str[roop_count].ptr(),
+ db_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(table_names_str[roop_count].ptr(),
+ table_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (show_table_status)
+ {
+ delete [] show_table_status;
+ show_table_status = NULL;
+ }
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+}
+
+void spider_oracle_share::free_show_table_status()
+{
+ DBUG_ENTER("spider_oracle_free_show_table_status");
+ if (show_table_status)
+ {
+ delete [] show_table_status;
+ show_table_status = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_share::append_show_records()
+{
+ int roop_count;
+ spider_string *str;
+ uint dbton_id = spider_dbton_oracle.dbton_id;
+ DBUG_ENTER("spider_oracle_share::append_show_records");
+ if (!(show_records = new spider_string[spider_share->all_link_count]))
+ goto error;
+
+ for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
+ roop_count++)
+ {
+ show_records[roop_count].init_calc_mem(208);
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+
+ if (
+ show_records[roop_count].reserve(
+ SPIDER_SQL_SHOW_RECORDS_LEN +
+ db_names_str[roop_count].length() +
+ SPIDER_SQL_DOT_LEN +
+ table_names_str[roop_count].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)
+ )
+ goto error;
+ str = &show_records[roop_count];
+ str->q_append(SPIDER_SQL_SHOW_RECORDS_STR, SPIDER_SQL_SHOW_RECORDS_LEN);
+ append_table_name(str, roop_count);
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (show_records)
+ {
+ delete [] show_records;
+ show_records = NULL;
+ }
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+}
+
+void spider_oracle_share::free_show_records()
+{
+ DBUG_ENTER("spider_oracle_share::free_show_records");
+ if (show_records)
+ {
+ delete [] show_records;
+ show_records = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_share::append_show_autoinc()
+{
+ uint roop_count, field_length;
+ spider_string *str;
+ uint dbton_id = spider_dbton_oracle.dbton_id;
+ Field **found_next_number_field =
+ spider_share->table_share->found_next_number_field;
+ DBUG_ENTER("spider_oracle_share::append_show_autoinc");
+ if (!found_next_number_field)
+ DBUG_RETURN(0);
+
+ if (!(show_autoinc = new spider_string[spider_share->all_link_count]))
+ goto error;
+
+ field_length =
+ column_name_str[(*found_next_number_field)->field_index].length();
+ for (roop_count = 0; roop_count < spider_share->all_link_count;
+ roop_count++)
+ {
+ show_autoinc[roop_count].init_calc_mem(224);
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+
+ if (
+ show_autoinc[roop_count].reserve(
+ SPIDER_SQL_SELECT_LEN +
+ SPIDER_SQL_MAX_LEN +
+ SPIDER_SQL_OPEN_PAREN_LEN +
+ field_length +
+ SPIDER_SQL_CLOSE_PAREN_LEN +
+ SPIDER_SQL_FROM_LEN +
+ db_names_str[roop_count].length() +
+ SPIDER_SQL_DOT_LEN +
+ table_names_str[roop_count].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 6)
+ )
+ goto error;
+ str = &show_autoinc[roop_count];
+ str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
+ str->q_append(SPIDER_SQL_MAX_STR, SPIDER_SQL_MAX_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ append_column_name(str, (*found_next_number_field)->field_index);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ append_table_name(str, roop_count);
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (show_autoinc)
+ {
+ delete [] show_autoinc;
+ show_autoinc = NULL;
+ }
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+}
+
+void spider_oracle_share::free_show_autoinc()
+{
+ DBUG_ENTER("spider_oracle_share::free_show_autoinc");
+ if (show_autoinc)
+ {
+ delete [] show_autoinc;
+ show_autoinc = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_share::append_show_last_insert_id()
+{
+ uint roop_count;
+ spider_string *str;
+ uint dbton_id = spider_dbton_oracle.dbton_id;
+ Field **found_next_number_field =
+ spider_share->table_share->found_next_number_field;
+ uint seq_nm_max_length = 0;
+ DBUG_ENTER("spider_oracle_share::append_show_last_insert_id");
+ if (!found_next_number_field)
+ DBUG_RETURN(0);
+
+ if (
+ !(show_last_insert_id = new spider_string[spider_share->all_link_count]) ||
+ !(nextval_str = new spider_string[spider_share->all_link_count])
+ )
+ goto error;
+
+ for (roop_count = 0; roop_count < spider_share->all_link_count;
+ roop_count++)
+ {
+ show_last_insert_id[roop_count].init_calc_mem(225);
+ nextval_str[roop_count].init_calc_mem(226);
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+
+ if (
+ show_last_insert_id[roop_count].reserve(
+ SPIDER_SQL_SELECT_LEN +
+ spider_share->tgt_sequence_names_lengths[roop_count] +
+ SPIDER_SQL_CURRVAL_LEN +
+ SPIDER_SQL_FROM_DUAL_LEN +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2)
+ )
+ goto error;
+ str = &show_last_insert_id[roop_count];
+ str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
+ spider_db_oracle_utility.append_name(str,
+ spider_share->tgt_sequence_names[roop_count],
+ spider_share->tgt_sequence_names_lengths[roop_count]);
+ str->q_append(SPIDER_SQL_CURRVAL_STR, SPIDER_SQL_CURRVAL_LEN);
+ str->q_append(SPIDER_SQL_FROM_DUAL_STR, SPIDER_SQL_FROM_DUAL_LEN);
+
+ if (seq_nm_max_length <
+ spider_share->tgt_sequence_names_lengths[roop_count])
+ {
+ seq_nm_max_length =
+ spider_share->tgt_sequence_names_lengths[roop_count];
+ }
+ }
+ for (roop_count = 0; roop_count < spider_share->all_link_count;
+ roop_count++)
+ {
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+
+ if (
+ nextval_str[roop_count].reserve(
+ seq_nm_max_length +
+ SPIDER_SQL_NEXTVAL_LEN +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2)
+ )
+ goto error;
+ str = &nextval_str[roop_count];
+ spider_db_oracle_utility.append_name(str,
+ spider_share->tgt_sequence_names[roop_count],
+ spider_share->tgt_sequence_names_lengths[roop_count]);
+ str->q_append(SPIDER_SQL_NEXTVAL_STR, SPIDER_SQL_NEXTVAL_LEN);
+ uint length =
+ seq_nm_max_length - spider_share->tgt_sequence_names_lengths[roop_count];
+ memset((char *) str->ptr() + str->length(), ' ', length);
+ str->length(str->length() + length);
+ nextval_max_length = str->length();
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (show_last_insert_id)
+ {
+ delete [] show_last_insert_id;
+ show_last_insert_id = NULL;
+ }
+ if (nextval_str)
+ {
+ delete [] nextval_str;
+ nextval_str = NULL;
+ }
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+}
+
+void spider_oracle_share::free_show_last_insert_id()
+{
+ DBUG_ENTER("spider_oracle_share::free_show_last_insert_id");
+ if (show_last_insert_id)
+ {
+ delete [] show_last_insert_id;
+ show_last_insert_id = NULL;
+ }
+ if (nextval_str)
+ {
+ delete [] nextval_str;
+ nextval_str = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_share::append_show_index()
+{
+ int roop_count;
+ spider_string *str;
+ uint dbton_id = spider_dbton_oracle.dbton_id;
+ DBUG_ENTER("spider_oracle_share::append_show_index");
+ if (!(show_index = new spider_string[2 * spider_share->all_link_count]))
+ goto error;
+
+ for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
+ roop_count++)
+ {
+ show_index[0 + (2 * roop_count)].init_calc_mem(209);
+ show_index[1 + (2 * roop_count)].init_calc_mem(210);
+ if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
+ continue;
+
+ if (
+ show_index[0 + (2 * roop_count)].reserve(
+ SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
+ SPIDER_SQL_DOT_LEN +
+ table_names_str[roop_count].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4) ||
+ show_index[1 + (2 * roop_count)].reserve(
+ SPIDER_SQL_SELECT_STATISTICS_LEN +
+ db_names_str[roop_count].length() +
+ SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
+ table_names_str[roop_count].length() +
+ ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4) +
+ SPIDER_SQL_GROUP_LEN + SPIDER_SQL_COLUMN_NAME_LEN)
+ )
+ goto error;
+ str = &show_index[0 + (2 * roop_count)];
+ str->q_append(
+ SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
+ append_table_name(str, roop_count);
+ str = &show_index[1 + (2 * roop_count)];
+ str->q_append(
+ SPIDER_SQL_SELECT_STATISTICS_STR, SPIDER_SQL_SELECT_STATISTICS_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(db_names_str[roop_count].ptr(),
+ db_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(table_names_str[roop_count].ptr(),
+ table_names_str[roop_count].length());
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
+ str->q_append(SPIDER_SQL_COLUMN_NAME_STR, SPIDER_SQL_COLUMN_NAME_LEN);
+ }
+ DBUG_RETURN(0);
+
+error:
+ if (show_index)
+ {
+ delete [] show_index;
+ show_index = NULL;
+ }
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+}
+
+void spider_oracle_share::free_show_index()
+{
+ DBUG_ENTER("spider_oracle_share::free_show_index");
+ if (show_index)
+ {
+ delete [] show_index;
+ show_index = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_share::append_table_select()
+{
+ Field **field;
+ uint field_length;
+ spider_string *str = table_select;
+ TABLE_SHARE *table_share = spider_share->table_share;
+ DBUG_ENTER("spider_oracle_share::append_table_select");
+ for (field = table_share->field; *field; field++)
+ {
+ field_length = column_name_str[(*field)->field_index].length();
+ if (str->reserve(field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(append_from_with_adjusted_table_name(str, &table_select_pos));
+}
+
+int spider_oracle_share::append_key_select(
+ uint idx
+) {
+ KEY_PART_INFO *key_part;
+ Field *field;
+ uint part_num;
+ uint field_length;
+ spider_string *str = &key_select[idx];
+ TABLE_SHARE *table_share = spider_share->table_share;
+ const KEY *key_info = &table_share->key_info[idx];
+ DBUG_ENTER("spider_oracle_share::append_key_select");
+ for (key_part = key_info->key_part, part_num = 0;
+ part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
+ {
+ field = key_part->field;
+ field_length = column_name_str[field->field_index].length();
+ if (str->reserve(field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(append_from_with_adjusted_table_name(str, &key_select_pos[idx]));
+}
+
+bool spider_oracle_share::need_change_db_table_name()
+{
+ DBUG_ENTER("spider_oracle_share::need_change_db_table_name");
+ DBUG_RETURN(!same_db_table_name);
+}
+
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+int spider_oracle_share::discover_table_structure(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *spider_share,
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_share::discover_table_structure");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+}
+#endif
+
+spider_oracle_handler::spider_oracle_handler(
+ ha_spider *spider,
+ spider_oracle_share *db_share
+) : spider_db_handler(
+ spider,
+ db_share
+),
+ where_pos(0),
+ order_pos(0),
+ limit_pos(0),
+ table_name_pos(0),
+ update_set_pos(0),
+ ha_read_pos(0),
+ ha_next_pos(0),
+ ha_where_pos(0),
+ ha_limit_pos(0),
+ ha_table_name_pos(0),
+ insert_pos(0),
+ insert_table_name_pos(0),
+ upd_tmp_tbl(NULL),
+ tmp_sql_pos1(0),
+ tmp_sql_pos2(0),
+ tmp_sql_pos3(0),
+ tmp_sql_pos4(0),
+ tmp_sql_pos5(0),
+ table_lock_mode(0),
+ reading_from_bulk_tmp_table(FALSE),
+ filled_up(FALSE),
+ select_rownum_appended(FALSE),
+ update_rownum_appended(FALSE),
+ union_table_name_pos_first(NULL),
+ union_table_name_pos_current(NULL),
+ oracle_share(db_share),
+ link_for_hash(NULL)
+{
+ DBUG_ENTER("spider_oracle_handler::spider_oracle_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_alloc_calc_mem_init(mem_calc, 222);
+ spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+spider_oracle_handler::~spider_oracle_handler()
+{
+ DBUG_ENTER("spider_oracle_handler::~spider_oracle_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ while (union_table_name_pos_first)
+ {
+ SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
+ union_table_name_pos_first = tmp_pos->next;
+ spider_free(spider_current_trx, tmp_pos, MYF(0));
+ }
+ if (link_for_hash)
+ {
+ spider_free(spider_current_trx, link_for_hash, MYF(0));
+ }
+ spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_handler::init()
+{
+ uint roop_count;
+ 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);
+ TABLE *table = spider->get_table();
+ DBUG_ENTER("spider_oracle_handler::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.init_calc_mem(67);
+ sql_part.init_calc_mem(68);
+ sql_part2.init_calc_mem(69);
+ ha_sql.init_calc_mem(70);
+ insert_sql.init_calc_mem(72);
+ update_sql.init_calc_mem(73);
+ tmp_sql.init_calc_mem(74);
+ dup_update_sql.init_calc_mem(167);
+ if (
+ (sql.real_alloc(init_sql_alloc_size)) ||
+ (insert_sql.real_alloc(init_sql_alloc_size)) ||
+ (update_sql.real_alloc(init_sql_alloc_size)) ||
+ (tmp_sql.real_alloc(init_sql_alloc_size))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.set_charset(share->access_charset);
+ sql_part.set_charset(share->access_charset);
+ ha_sql.set_charset(share->access_charset);
+ insert_sql.set_charset(share->access_charset);
+ update_sql.set_charset(share->access_charset);
+ tmp_sql.set_charset(share->access_charset);
+ upd_tmp_tbl_prm.init();
+ upd_tmp_tbl_prm.field_count = 1;
+ if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
+ spider_bulk_alloc_mem(spider_current_trx, 223,
+ __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);
+ }
+ 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 =
+ &oracle_share->db_table_str[roop_count];
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ link_for_hash[roop_count].db_table_str_hash_value =
+ oracle_share->db_table_str_hash_value[roop_count];
+#endif
+ }
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ hs_upds.init();
+#endif
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_table_name_with_adjusting(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+) {
+ int error_num = 0;
+ DBUG_ENTER("spider_oracle_handler::append_table_name_with_adjusting");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type == SPIDER_SQL_TYPE_HANDLER)
+ {
+ str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
+ } else {
+ error_num = oracle_share->append_table_name_with_adjusting(str,
+ spider->conn_link_idx[link_idx]);
+ }
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_key_column_types(
+ const key_range *start_key,
+ spider_string *str
+) {
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ KEY *key_info = result_list->key_info;
+ uint key_name_length, key_count;
+ key_part_map full_key_part_map =
+ make_prev_keypart_map(spider_user_defined_key_parts(key_info));
+ key_part_map start_key_part_map;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ char tmp_buf[MAX_FIELD_WIDTH];
+ spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info);
+ DBUG_ENTER("spider_oracle_handler::append_key_column_types");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_str.init_calc_mem(227);
+
+ start_key_part_map = start_key->keypart_map & full_key_part_map;
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+ DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
+ DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
+
+ if (!start_key_part_map)
+ DBUG_RETURN(0);
+
+ for (
+ key_part = key_info->key_part,
+ key_count = 0;
+ start_key_part_map;
+ start_key_part_map >>= 1,
+ key_part++,
+ key_count++
+ ) {
+ field = key_part->field;
+ key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
+ if (str->reserve(key_name_length + SPIDER_SQL_SPACE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(tmp_buf, key_name_length);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+
+ if (tmp_str.ptr() != tmp_buf)
+ tmp_str.set(tmp_buf, sizeof(tmp_buf), system_charset_info);
+ else
+ tmp_str.set_charset(system_charset_info);
+ field->sql_type(*tmp_str.get_str());
+ tmp_str.mem_calc();
+ str->append(tmp_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);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_key_join_columns_for_bka(
+ const key_range *start_key,
+ spider_string *str,
+ const char **table_aliases,
+ uint *table_alias_lengths
+) {
+ KEY *key_info = spider->result_list.key_info;
+ uint length, key_name_length, key_count;
+ key_part_map full_key_part_map =
+ make_prev_keypart_map(spider_user_defined_key_parts(key_info));
+ key_part_map start_key_part_map;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ char tmp_buf[MAX_FIELD_WIDTH];
+ bool start_where = ((int) str->length() == where_pos);
+ DBUG_ENTER("spider_oracle_handler::append_key_join_columns_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ start_key_part_map = start_key->keypart_map & full_key_part_map;
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+ DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
+ DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
+
+ if (!start_key_part_map)
+ DBUG_RETURN(0);
+
+ if (start_where)
+ {
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+
+ for (
+ key_part = key_info->key_part,
+ key_count = 0;
+ start_key_part_map;
+ start_key_part_map >>= 1,
+ key_part++,
+ key_count++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
+ if (str->reserve(length + table_alias_lengths[0] + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ table_alias_lengths[1] + SPIDER_SQL_PF_EQUAL_LEN + SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(table_aliases[0], table_alias_lengths[0]);
+ str->q_append(tmp_buf, length);
+ str->q_append(SPIDER_SQL_PF_EQUAL_STR, SPIDER_SQL_PF_EQUAL_LEN);
+ str->q_append(table_aliases[1], table_alias_lengths[1]);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_tmp_table_and_sql_for_bka(
+ const key_range *start_key
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_tmp_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ char tmp_table_name[MAX_FIELD_WIDTH * 2],
+ tgt_table_name[MAX_FIELD_WIDTH * 2];
+ int tmp_table_name_length;
+ spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
+ oracle_share->db_names_str[0].charset());
+ const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
+ uint table_name_lengths[2], table_alias_lengths[2],
+ table_dot_alias_lengths[2];
+ tgt_table_name_str.init_calc_mem(200);
+ tgt_table_name_str.length(0);
+ create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
+ first_link_idx);
+ if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
+ first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ table_names[0] = tmp_table_name;
+ table_names[1] = tgt_table_name_str.c_ptr_safe();
+ table_name_lengths[0] = tmp_table_name_length;
+ table_name_lengths[1] = tgt_table_name_str.length();
+ table_aliases[0] = SPIDER_SQL_A_STR;
+ table_aliases[1] = SPIDER_SQL_B_STR;
+ table_alias_lengths[0] = SPIDER_SQL_A_LEN;
+ table_alias_lengths[1] = SPIDER_SQL_B_LEN;
+ table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
+ table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
+ table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
+ table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
+ if (
+ (error_num = append_drop_tmp_bka_table(
+ &tmp_sql, tmp_table_name, tmp_table_name_length,
+ &tmp_sql_pos1, &tmp_sql_pos5, TRUE)) ||
+ (error_num = append_create_tmp_bka_table(
+ start_key,
+ &tmp_sql, tmp_table_name,
+ tmp_table_name_length,
+ &tmp_sql_pos2, spider->share->table_share->table_charset)) ||
+ (error_num = append_insert_tmp_bka_table(
+ start_key,
+ &tmp_sql, tmp_table_name,
+ tmp_table_name_length, &tmp_sql_pos3))
+ )
+ DBUG_RETURN(error_num);
+ tmp_sql_pos4 = tmp_sql.length();
+ if ((error_num = spider_db_append_select(spider)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
+ sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if (
+ (error_num = append_select_columns_with_alias(&sql,
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) ||
+ (error_num = spider_db_oracle_utility.append_from_with_alias(&sql,
+ table_names, table_name_lengths,
+ table_aliases, table_alias_lengths, 2,
+ &table_name_pos, FALSE))
+ )
+ DBUG_RETURN(error_num);
+ if (
+ oracle_share->key_hint &&
+ (error_num = spider_db_append_hint_after_table(spider,
+ &sql, &oracle_share->key_hint[spider->active_index]))
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ where_pos = sql.length();
+ if (
+ (error_num = append_key_join_columns_for_bka(
+ start_key, &sql,
+ table_dot_aliases, table_dot_alias_lengths)) ||
+ (error_num = append_condition_part(
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
+ SPIDER_SQL_TYPE_SELECT_SQL, FALSE))
+ )
+ DBUG_RETURN(error_num);
+ if (spider->result_list.direct_order_limit)
+ {
+ if ((error_num = append_key_order_for_direct_order_limit_with_alias(&sql,
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
+ DBUG_RETURN(error_num);
+ }
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ else if (spider->result_list.direct_aggregate)
+ {
+ if ((error_num =
+ append_group_by(&sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::reuse_tmp_table_and_sql_for_bka()
+{
+ DBUG_ENTER("spider_oracle_handler::reuse_tmp_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_sql.length(tmp_sql_pos4);
+ sql.length(limit_pos);
+ ha_sql.length(ha_limit_pos);
+ DBUG_RETURN(0);
+}
+
+void spider_oracle_handler::create_tmp_bka_table_name(
+ char *tmp_table_name,
+ int *tmp_table_name_length,
+ int link_idx
+) {
+ uint adjust_length =
+ oracle_share->db_nm_max_length -
+ oracle_share->db_names_str[spider->conn_link_idx[link_idx]].length() +
+ oracle_share->table_nm_max_length -
+ oracle_share->table_names_str[spider->conn_link_idx[link_idx]].length(),
+ length;
+ DBUG_ENTER("spider_oracle_handler::create_tmp_bka_table_name");
+ *tmp_table_name_length = oracle_share->db_nm_max_length +
+ oracle_share->table_nm_max_length;
+ memset(tmp_table_name, ' ', adjust_length);
+ tmp_table_name += adjust_length;
+ memcpy(tmp_table_name, oracle_share->db_names_str[link_idx].c_ptr(),
+ oracle_share->db_names_str[link_idx].length());
+ tmp_table_name += oracle_share->db_names_str[link_idx].length();
+ length = my_sprintf(tmp_table_name, (tmp_table_name,
+ "%s%s%p%s", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider,
+ SPIDER_SQL_UNDERSCORE_STR));
+ *tmp_table_name_length += length;
+ tmp_table_name += length;
+ memcpy(tmp_table_name,
+ oracle_share->table_names_str[spider->conn_link_idx[link_idx]].c_ptr(),
+ oracle_share->table_names_str[spider->conn_link_idx[link_idx]].length());
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_handler::append_create_tmp_bka_table(
+ const key_range *start_key,
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos,
+ CHARSET_INFO *table_charset
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ THD *thd = spider->trx->thd;
+ char *bka_engine = spider_param_bka_engine(thd, share->bka_engine);
+ uint bka_engine_length = strlen(bka_engine),
+ cset_length = strlen(table_charset->csname);
+ DBUG_ENTER("spider_oracle_handler::append_create_tmp_bka_table");
+ if (str->reserve(SPIDER_SQL_CREATE_TMP_LEN + tmp_table_name_length +
+ SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_ID_TYPE_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CREATE_TMP_STR, SPIDER_SQL_CREATE_TMP_LEN);
+ *db_name_pos = str->length();
+ str->q_append(tmp_table_name, tmp_table_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ str->q_append(SPIDER_SQL_ID_TYPE_STR, SPIDER_SQL_ID_TYPE_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if ((error_num = append_key_column_types(start_key, str)))
+ DBUG_RETURN(error_num);
+ if (str->reserve(SPIDER_SQL_ENGINE_LEN + bka_engine_length +
+ SPIDER_SQL_DEF_CHARSET_LEN + cset_length + SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ENGINE_STR, SPIDER_SQL_ENGINE_LEN);
+ str->q_append(bka_engine, bka_engine_length);
+ str->q_append(SPIDER_SQL_DEF_CHARSET_STR, SPIDER_SQL_DEF_CHARSET_LEN);
+ str->q_append(table_charset->csname, cset_length);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_drop_tmp_bka_table(
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos,
+ int *drop_table_end_pos,
+ bool with_semicolon
+) {
+ DBUG_ENTER("spider_oracle_handler::append_drop_tmp_bka_table");
+ if (str->reserve(SPIDER_SQL_DROP_TMP_LEN + tmp_table_name_length +
+ (with_semicolon ? SPIDER_SQL_SEMICOLON_LEN : 0)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_DROP_TMP_STR, SPIDER_SQL_DROP_TMP_LEN);
+ *db_name_pos = str->length();
+ str->q_append(tmp_table_name, tmp_table_name_length);
+ *drop_table_end_pos = str->length();
+ if (with_semicolon)
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_insert_tmp_bka_table(
+ const key_range *start_key,
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_insert_tmp_bka_table");
+ if (str->reserve(SPIDER_SQL_INSERT_LEN + SPIDER_SQL_INTO_LEN +
+ tmp_table_name_length + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
+ str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
+ *db_name_pos = str->length();
+ str->q_append(tmp_table_name, tmp_table_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if ((error_num = spider_db_append_key_columns(start_key, spider, str)))
+ DBUG_RETURN(error_num);
+ if (str->reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_union_table_and_sql_for_bka(
+ const key_range *start_key
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_union_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ char tgt_table_name[MAX_FIELD_WIDTH * 2];
+ spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
+ oracle_share->db_names_str[0].charset());
+ const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
+ uint table_name_lengths[2], table_alias_lengths[2],
+ table_dot_alias_lengths[2];
+ tgt_table_name_str.init_calc_mem(234);
+ tgt_table_name_str.length(0);
+ if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
+ first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ table_names[0] = "";
+ table_names[1] = tgt_table_name_str.c_ptr_safe();
+ table_name_lengths[0] = 0;
+ table_name_lengths[1] = tgt_table_name_str.length();
+ table_aliases[0] = SPIDER_SQL_A_STR;
+ table_aliases[1] = SPIDER_SQL_B_STR;
+ table_alias_lengths[0] = SPIDER_SQL_A_LEN;
+ table_alias_lengths[1] = SPIDER_SQL_B_LEN;
+ table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
+ table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
+ table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
+ table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
+
+ if ((error_num = spider_db_append_select(spider)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
+ sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ if ((error_num = append_select_columns_with_alias(&sql,
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_FROM_LEN + (SPIDER_SQL_OPEN_PAREN_LEN * 2)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ tmp_sql_pos1 = sql.length();
+
+ if (
+ (error_num = spider_db_oracle_utility.append_from_with_alias(&tmp_sql,
+ table_names, table_name_lengths,
+ table_aliases, table_alias_lengths, 2,
+ &table_name_pos, FALSE))
+ )
+ DBUG_RETURN(error_num);
+ if (
+ oracle_share->key_hint &&
+ (error_num = spider_db_append_hint_after_table(spider,
+ &tmp_sql, &oracle_share->key_hint[spider->active_index]))
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ where_pos = tmp_sql.length();
+ if (
+ (error_num = append_key_join_columns_for_bka(
+ start_key, &tmp_sql,
+ table_dot_aliases, table_dot_alias_lengths)) ||
+ (error_num = append_condition_part(
+ SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
+ SPIDER_SQL_TYPE_TMP_SQL, FALSE))
+ )
+ DBUG_RETURN(error_num);
+ if (spider->result_list.direct_order_limit)
+ {
+ if ((error_num = append_key_order_for_direct_order_limit_with_alias(
+ &tmp_sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
+ DBUG_RETURN(error_num);
+ }
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ else if (spider->result_list.direct_aggregate)
+ {
+ if ((error_num =
+ append_group_by(&tmp_sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::reuse_union_table_and_sql_for_bka()
+{
+ DBUG_ENTER("spider_oracle_handler::reuse_union_table_and_sql_for_bka");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.length(tmp_sql_pos1);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_insert_for_recovery(
+ ulong sql_type,
+ int link_idx
+) {
+ const TABLE *table = spider->get_table();
+ SPIDER_SHARE *share = spider->share;
+ Field **field;
+ uint field_name_length = 0;
+ bool add_value = FALSE;
+ spider_string *insert_sql;
+ DBUG_ENTER("spider_oracle_handler::append_insert_for_recovery");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
+ {
+ insert_sql = &spider->result_list.insert_sqls[link_idx];
+ insert_sql->length(0);
+ } else {
+ insert_sql = &spider->result_list.update_sqls[link_idx];
+ }
+ if (insert_sql->reserve(
+ SPIDER_SQL_INSERT_LEN + SPIDER_SQL_SQL_IGNORE_LEN +
+ SPIDER_SQL_INTO_LEN + oracle_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ insert_sql->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
+ insert_sql->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
+ insert_sql->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
+ oracle_share->append_table_name(insert_sql, spider->conn_link_idx[link_idx]);
+ insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ for (field = table->field; *field; field++)
+ {
+ field_name_length =
+ oracle_share->column_name_str[(*field)->field_index].length();
+ if (insert_sql->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(insert_sql, (*field)->field_index);
+ insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (field_name_length)
+ insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
+ if (insert_sql->reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ insert_sql->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
+ insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ for (field = table->field; *field; field++)
+ {
+ add_value = TRUE;
+ if ((*field)->is_null())
+ {
+ if (insert_sql->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ insert_sql->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else {
+ if (
+ spider_db_oracle_utility.
+ append_column_value(spider, insert_sql, *field, NULL,
+ share->access_charset) ||
+ insert_sql->reserve(SPIDER_SQL_COMMA_LEN)
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (add_value)
+ insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
+ if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN, SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
+ {
+ exec_insert_sql = insert_sql;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+) {
+ int error_num;
+ spider_string *str = &update_sql;
+ DBUG_ENTER("spider_oracle_handler::append_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->length() > 0)
+ {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+
+ if (
+ (error_num = append_update(str, 0)) ||
+ (error_num = append_update_set(str)) ||
+ (error_num = append_update_where(str, table, ptr_diff))
+ )
+ DBUG_RETURN(error_num);
+ filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.update_sqls[link_idx];
+ DBUG_ENTER("spider_oracle_handler::append_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->length() > 0)
+ {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+
+ if (
+ (error_num = append_update(str, link_idx)) ||
+ (error_num = append_update_set(str)) ||
+ (error_num = append_update_where(str, table, ptr_diff))
+ )
+ DBUG_RETURN(error_num);
+
+ if (
+ spider->pk_update &&
+ share->link_statuses[link_idx] == SPIDER_LINK_STATUS_RECOVERY
+ ) {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ if ((error_num = append_insert_for_recovery(
+ SPIDER_SQL_TYPE_UPDATE_SQL, link_idx)))
+ DBUG_RETURN(error_num);
+ }
+
+ if (!filled_up)
+ filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+) {
+ int error_num;
+ spider_string *str = &update_sql;
+ DBUG_ENTER("spider_oracle_handler::append_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->length() > 0)
+ {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+
+ if (
+ (error_num = append_delete(str)) ||
+ (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL,
+ first_link_idx)) ||
+ (error_num = append_update_where(str, table, ptr_diff))
+ )
+ DBUG_RETURN(error_num);
+ filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str = &spider->result_list.update_sqls[link_idx];
+ DBUG_ENTER("spider_oracle_handler::append_delete");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->length() > 0)
+ {
+ if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
+ }
+
+ if (
+ (error_num = append_delete(str)) ||
+ (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL, link_idx)) ||
+ (error_num = append_update_where(str, table, ptr_diff))
+ )
+ DBUG_RETURN(error_num);
+ if (!filled_up)
+ filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_insert_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_insert_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_insert(&insert_sql, 0);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_insert(
+ spider_string *str,
+ int link_idx
+) {
+ DBUG_ENTER("spider_oracle_handler::append_insert");
+ if (str->reserve(SPIDER_SQL_INSERT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_update_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_update_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_update(&update_sql, 0);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_update(
+ spider_string *str,
+ int link_idx
+) {
+ DBUG_ENTER("spider_oracle_handler::append_update");
+ if (str->reserve(SPIDER_SQL_UPDATE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_UPDATE_STR, SPIDER_SQL_UPDATE_LEN);
+ if (str->reserve(oracle_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ table_name_pos = str->length();
+ append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_UPDATE_SQL);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_delete_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_delete_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_delete(&update_sql);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_delete(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_delete");
+ if (str->reserve(SPIDER_SQL_DELETE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_DELETE_STR, SPIDER_SQL_DELETE_LEN);
+ str->length(str->length() - 1);
+ DBUG_RETURN(0);
+}
+
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+int spider_oracle_handler::append_increment_update_set_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_increment_update_set_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_increment_update_set(&update_sql);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_increment_update_set(
+ spider_string *str
+) {
+ uint field_name_length;
+ uint roop_count;
+ Field *field;
+ DBUG_ENTER("spider_oracle_handler::append_increment_update_set");
+ if (str->reserve(SPIDER_SQL_SET_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
+ const SPIDER_HS_STRING_REF *value = hs_upds.ptr();
+ for (roop_count = 0; roop_count < hs_upds.size();
+ roop_count++)
+ {
+ DBUG_PRINT("info",("spider value_size[%u]=%zu", roop_count,
+ value[roop_count].size()));
+#ifndef DBUG_OFF
+ char print_buf[MAX_FIELD_WIDTH];
+ if (value[roop_count].size() < MAX_FIELD_WIDTH)
+ {
+ memcpy(print_buf, value[roop_count].begin(), value[roop_count].size());
+ print_buf[value[roop_count].size()] = '\0';
+ DBUG_PRINT("info",("spider value[%u]=%s", roop_count, print_buf));
+ }
+#endif
+ if (
+ value[roop_count].size() == 1 &&
+ *(value[roop_count].begin()) == '0'
+ )
+ continue;
+
+ 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;
+ field_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+
+ if (str->reserve(field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
+ SPIDER_SQL_COMMA_LEN + value[roop_count].size()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ oracle_share->append_column_name(str, field->field_index);
+ if (spider->hs_increment)
+ str->q_append(SPIDER_SQL_HS_INCREMENT_STR,
+ SPIDER_SQL_HS_INCREMENT_LEN);
+ else
+ str->q_append(SPIDER_SQL_HS_DECREMENT_STR,
+ SPIDER_SQL_HS_DECREMENT_LEN);
+ str->q_append(value[roop_count].begin(), value[roop_count].size());
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+#endif
+#endif
+
+int spider_oracle_handler::append_update_set_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_update_set_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ update_set_pos = update_sql.length();
+ error_num = append_update_set(&update_sql);
+ where_pos = update_sql.length();
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_update_set(
+ spider_string *str
+) {
+ uint field_name_length;
+ SPIDER_SHARE *share = spider->share;
+ TABLE *table = spider->get_table();
+ Field **fields;
+ DBUG_ENTER("spider_oracle_handler::append_update_set");
+ if (str->reserve(SPIDER_SQL_SET_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
+ for (fields = table->field; *fields; fields++)
+ {
+ if (bitmap_is_set(table->write_set, (*fields)->field_index))
+ {
+ field_name_length =
+ oracle_share->column_name_str[(*fields)->field_index].length();
+ if ((*fields)->is_null())
+ {
+ if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, (*fields)->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else {
+ if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 2 + SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, (*fields)->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+#ifndef DBUG_OFF
+ my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
+ table->read_set);
+#endif
+ if (
+ spider_db_oracle_utility.
+ append_column_value(spider, str, *fields, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_COMMA_LEN)
+ ) {
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+int spider_oracle_handler::append_direct_update_set_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_direct_update_set_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ update_set_pos = update_sql.length();
+ error_num = append_direct_update_set(&update_sql);
+ where_pos = update_sql.length();
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_direct_update_set(
+ spider_string *str
+) {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ uint field_name_length;
+ SPIDER_SHARE *share = spider->share;
+#ifndef DBUG_OFF
+ TABLE *table = spider->get_table();
+#endif
+#endif
+ DBUG_ENTER("spider_oracle_handler::append_direct_update_set");
+ if (
+ spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
+ spider->direct_update_fields
+ ) {
+ if (str->reserve(SPIDER_SQL_SET_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
+ DBUG_RETURN(append_update_columns(str, NULL, 0));
+ }
+
+ if (
+ (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
+ ) {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ size_t roop_count;
+ Field *field;
+ if (str->reserve(SPIDER_SQL_SET_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
+ 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;
+ field_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (top_table_field->is_null())
+ {
+ if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else {
+ if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
+ 2 + SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+#ifndef DBUG_OFF
+ my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
+ table->read_set);
+#endif
+ if (
+ spider_db_oracle_utility.
+ append_column_value(spider, str, top_table_field, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_COMMA_LEN)
+ ) {
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+#else
+ DBUG_ASSERT(0);
+#endif
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_dup_update_pushdown_part(
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_dup_update_pushdown_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ dup_update_sql.length(0);
+ error_num = append_update_columns(&dup_update_sql, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_update_columns_part(
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_update_columns_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_update_columns(&update_sql, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::check_update_columns_part()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::check_update_columns_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = append_update_columns(NULL, NULL, 0);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_update_columns(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ List_iterator_fast<Item> fi(*spider->direct_update_fields),
+ vi(*spider->direct_update_values);
+ Item *field, *value;
+ DBUG_ENTER("spider_oracle_handler::append_update_columns");
+ while ((field = fi++))
+ {
+ value = vi++;
+ if ((error_num = spider_db_print_item_type(
+ (Item *) field, spider, str, alias, alias_length,
+ spider_dbton_oracle.dbton_id)))
+ {
+ if (
+ error_num == ER_SPIDER_COND_SKIP_NUM &&
+ field->type() == Item::FIELD_ITEM &&
+ ((Item_field *) field)->field
+ )
+ continue;
+ DBUG_RETURN(error_num);
+ }
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ }
+ if ((error_num = spider_db_print_item_type(
+ (Item *) value, spider, str, alias, alias_length,
+ spider_dbton_oracle.dbton_id)))
+ 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 (str)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+/*
+ error_num = spider_db_append_update_columns(spider, str,
+ alias, alias_length, spider_dbton_oracle.dbton_id);
+ DBUG_RETURN(error_num);
+*/
+}
+#endif
+
+int spider_oracle_handler::append_select_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_select(str, sql_type);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_select(
+ spider_string *str,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::append_select");
+ if (sql_type == SPIDER_SQL_TYPE_HANDLER)
+ {
+ if (str->reserve(SPIDER_SQL_HANDLER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_SELECT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_table_select_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_table_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_table_select(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_table_select(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_table_select");
+ table_name_pos = str->length() + oracle_share->table_select_pos;
+ if (str->append(*(oracle_share->table_select)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_key_select_part(
+ ulong sql_type,
+ uint idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_key_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_select(str, idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_key_select(
+ spider_string *str,
+ uint idx
+) {
+ DBUG_ENTER("spider_oracle_handler::append_key_select");
+ table_name_pos = str->length() + oracle_share->key_select_pos[idx];
+ if (str->append(oracle_share->key_select[idx]))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_minimum_select_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_minimum_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_minimum_select(str, sql_type);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_minimum_select(
+ spider_string *str,
+ ulong sql_type
+) {
+ TABLE *table = spider->get_table();
+ Field **field;
+ int field_length;
+ bool appended = FALSE;
+ DBUG_ENTER("spider_oracle_handler::append_minimum_select");
+ 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 =
+ oracle_share->column_name_str[(*field)->field_index].length();
+ if (str->reserve(field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ appended = TRUE;
+ }
+ }
+ if (appended)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ else {
+ if (str->reserve(SPIDER_SQL_ONE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
+ }
+ DBUG_RETURN(append_from(str, sql_type, first_link_idx));
+}
+
+int spider_oracle_handler::append_table_select_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ TABLE *table = spider->get_table();
+ Field **field;
+ int field_length;
+ DBUG_ENTER("spider_oracle_handler::append_table_select_with_alias");
+ for (field = table->field; *field; field++)
+ {
+ field_length =
+ oracle_share->column_name_str[(*field)->field_index].length();
+ if (str->reserve(alias_length + field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_key_select_with_alias(
+ spider_string *str,
+ const KEY *key_info,
+ const char *alias,
+ uint alias_length
+) {
+ KEY_PART_INFO *key_part;
+ Field *field;
+ uint part_num;
+ int field_length;
+ DBUG_ENTER("spider_oracle_handler::append_key_select_with_alias");
+ for (key_part = key_info->key_part, part_num = 0;
+ part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
+ {
+ field = key_part->field;
+ field_length = oracle_share->column_name_str[field->field_index].length();
+ if (str->reserve(alias_length + field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_minimum_select_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ TABLE *table = spider->get_table();
+ Field **field;
+ int field_length;
+ bool appended = FALSE;
+ DBUG_ENTER("spider_oracle_handler::append_minimum_select_with_alias");
+ 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 =
+ oracle_share->column_name_str[(*field)->field_index].length();
+ if (str->reserve(alias_length + field_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ appended = TRUE;
+ }
+ }
+ if (appended)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ else {
+ if (str->reserve(SPIDER_SQL_ONE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_select_columns_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ DBUG_ENTER("spider_oracle_handler::append_select_columns_with_alias");
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (
+ result_list->direct_aggregate &&
+ (error_num = append_sum_select(str, alias, alias_length))
+ )
+ DBUG_RETURN(error_num);
+#endif
+ if ((error_num = append_match_select(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ if (!spider->select_column_mode)
+ {
+ if (result_list->keyread)
+ DBUG_RETURN(append_key_select_with_alias(
+ str, result_list->key_info, alias, alias_length));
+ else
+ DBUG_RETURN(append_table_select_with_alias(
+ str, alias, alias_length));
+ }
+ DBUG_RETURN(append_minimum_select_with_alias(str, alias, alias_length));
+}
+
+int spider_oracle_handler::append_hint_after_table_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_hint_after_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_hint_after_table(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_hint_after_table(
+ spider_string *str
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_hint_after_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (
+ oracle_share->key_hint &&
+ (error_num = spider_db_append_hint_after_table(spider,
+ str, &oracle_share->key_hint[spider->active_index]))
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+}
+
+void spider_oracle_handler::set_where_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::set_where_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ where_pos = sql.length();
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ where_pos = update_sql.length();
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ ha_read_pos = ha_sql.length();
+ break;
+ default:
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_oracle_handler::set_where_to_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::set_where_to_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ sql.length(where_pos);
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ update_sql.length(where_pos);
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ ha_sql.length(ha_read_pos);
+ break;
+ default:
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_handler::check_item_type(
+ Item *item
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::check_item_type");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = spider_db_print_item_type(item, spider, NULL, NULL, 0,
+ spider_dbton_oracle.dbton_id);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_values_connector_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_values_connector_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_values_connector(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_values_connector(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_values_connector");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
+ SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_values_terminator_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_values_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_values_terminator(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_values_terminator(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_values_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(str->length() -
+ SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_union_table_connector_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_union_table_connector_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_table_connector(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_union_table_connector(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_union_table_connector");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_union_table_terminator_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_union_table_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_table_terminator(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_union_table_terminator(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_union_table_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(str->length() -
+ ((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN));
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ table_name_pos = str->length() + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_A_LEN +
+ SPIDER_SQL_COMMA_LEN;
+ if (str->reserve(tmp_sql.length() - SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(tmp_sql.ptr() + SPIDER_SQL_FROM_LEN,
+ tmp_sql.length() - SPIDER_SQL_FROM_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_key_column_values_part(
+ const key_range *start_key,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_key_column_values_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_column_values(str, start_key);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_key_column_values(
+ spider_string *str,
+ const key_range *start_key
+) {
+ int error_num;
+ const uchar *ptr;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ SPIDER_SHARE *share = spider->share;
+ KEY *key_info = result_list->key_info;
+ uint length;
+ uint store_length;
+ key_part_map full_key_part_map =
+ make_prev_keypart_map(spider_user_defined_key_parts(key_info));
+ key_part_map start_key_part_map;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ DBUG_ENTER("spider_oracle_handler::append_key_column_values");
+ start_key_part_map = start_key->keypart_map & full_key_part_map;
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+ DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
+ DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
+
+ if (!start_key_part_map)
+ DBUG_RETURN(0);
+
+ for (
+ key_part = key_info->key_part,
+ length = 0;
+ start_key_part_map;
+ start_key_part_map >>= 1,
+ key_part++,
+ length += store_length
+ ) {
+ store_length = key_part->store_length;
+ ptr = start_key->key + length;
+ field = key_part->field;
+ if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
+ {
+ if (error_num > 0)
+ DBUG_RETURN(error_num);
+ } else {
+ if (spider_db_oracle_utility.append_column_value(spider, str, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ 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);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_key_column_values_with_name_part(
+ const key_range *start_key,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_key_column_values_with_name_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_column_values_with_name(str, start_key);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_key_column_values_with_name(
+ spider_string *str,
+ const key_range *start_key
+) {
+ int error_num;
+ const uchar *ptr;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ SPIDER_SHARE *share = spider->share;
+ KEY *key_info = result_list->key_info;
+ uint length;
+ uint key_name_length, key_count;
+ uint store_length;
+ key_part_map full_key_part_map =
+ make_prev_keypart_map(spider_user_defined_key_parts(key_info));
+ key_part_map start_key_part_map;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ char tmp_buf[MAX_FIELD_WIDTH];
+ DBUG_ENTER("spider_oracle_handler::append_key_column_values_with_name");
+ start_key_part_map = start_key->keypart_map & full_key_part_map;
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+ DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
+ DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
+
+ if (!start_key_part_map)
+ DBUG_RETURN(0);
+
+ for (
+ key_part = key_info->key_part,
+ length = 0,
+ key_count = 0;
+ start_key_part_map;
+ start_key_part_map >>= 1,
+ key_part++,
+ length += store_length,
+ key_count++
+ ) {
+ store_length = key_part->store_length;
+ ptr = start_key->key + length;
+ field = key_part->field;
+ if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
+ {
+ if (error_num > 0)
+ DBUG_RETURN(error_num);
+ } else {
+ if (spider_db_oracle_utility.append_column_value(spider, str, field, ptr,
+ share->access_charset))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
+ if (str->reserve(SPIDER_SQL_SPACE_LEN + key_name_length +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(tmp_buf, key_name_length);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_key_where_part(
+ const key_range *start_key,
+ const key_range *end_key,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str, *str_part = NULL, *str_part2 = NULL;
+ bool set_order;
+ DBUG_ENTER("spider_oracle_handler::append_key_where_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ set_order = FALSE;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ set_order = FALSE;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ set_order = FALSE;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ ha_read_pos = str->length();
+ str_part = &sql_part;
+ str_part2 = &sql_part2;
+ str_part->length(0);
+ str_part2->length(0);
+ set_order = TRUE;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_where(str, str_part, str_part2, start_key, end_key,
+ sql_type, set_order);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_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_oracle_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_oracle.dbton_id);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_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, *str_part = NULL, *str_part2 = NULL;
+ DBUG_ENTER("spider_oracle_handler::append_is_null_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ str_part = &sql_part;
+ str_part2 = &sql_part2;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_is_null(sql_type, str, str_part, str_part2,
+ key_part, key, ptr, key_eq, tgt_final);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_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_oracle_handler::append_is_null");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (key_part->null_bit)
+ {
+ if (*(*ptr)++)
+ {
+ if (sql_type == SPIDER_SQL_TYPE_HANDLER)
+ {
+ str = str_part;
+ if (
+ key_eq ||
+ key->flag == HA_READ_KEY_EXACT ||
+ key->flag == HA_READ_KEY_OR_NEXT
+ ) {
+ if (str->reserve(SPIDER_SQL_IS_NULL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
+ } else {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ ha_next_pos = str->length();
+ if (str->reserve(SPIDER_SQL_FIRST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
+ spider->result_list.ha_read_kind = 1;
+ }
+ str = str_part2;
+ }
+ if (
+ key_eq ||
+ key->flag == HA_READ_KEY_EXACT ||
+ key->flag == HA_READ_KEY_OR_NEXT
+ ) {
+ if (str->reserve(SPIDER_SQL_IS_NULL_LEN +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ oracle_share->column_name_str[key_part->field->field_index].length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, key_part->field->field_index);
+ str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_IS_NOT_NULL_LEN +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ oracle_share->column_name_str[key_part->field->field_index].length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, key_part->field->field_index);
+ str->q_append(SPIDER_SQL_IS_NOT_NULL_STR, SPIDER_SQL_IS_NOT_NULL_LEN);
+ }
+ DBUG_RETURN(-1);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_where_terminator_part(
+ ulong sql_type,
+ bool set_order,
+ int key_count
+) {
+ int error_num;
+ spider_string *str, *str_part = NULL, *str_part2 = NULL;
+ DBUG_ENTER("spider_oracle_handler::append_where_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ str_part = &sql_part;
+ str_part2 = &sql_part2;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_where_terminator(sql_type, str, str_part, str_part2,
+ set_order, key_count);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_where_terminator(
+ ulong sql_type,
+ spider_string *str,
+ spider_string *str_part,
+ spider_string *str_part2,
+ bool set_order,
+ int key_count
+) {
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ DBUG_ENTER("spider_oracle_handler::append_where_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type != SPIDER_SQL_TYPE_HANDLER)
+ {
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+ if (!set_order)
+ result_list->key_order = key_count;
+ } else {
+ str_part2->length(str_part2->length() - SPIDER_SQL_AND_LEN);
+
+ str_part->length(str_part->length() - SPIDER_SQL_COMMA_LEN);
+ if (!result_list->ha_read_kind)
+ str_part->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ if (str->append(*str_part))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ uint clause_length = str->length() - ha_next_pos;
+ if (clause_length < SPIDER_SQL_NEXT_LEN)
+ {
+ int roop_count;
+ clause_length = SPIDER_SQL_NEXT_LEN - clause_length;
+ if (str->reserve(clause_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ for (roop_count = 0; roop_count < (int) clause_length; roop_count++)
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_match_where_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_match_where_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+ }
+ error_num = append_match_where(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_match_where(
+ spider_string *str
+) {
+ int error_num;
+ bool first = TRUE;
+ st_spider_ft_info *ft_info = spider->ft_first;
+ DBUG_ENTER("spider_oracle_handler::append_match_where");
+ if (spider->ft_current)
+ {
+ while (TRUE)
+ {
+ if (ft_info->used_in_where)
+ {
+ if (first)
+ {
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ first = FALSE;
+ }
+ if ((error_num = append_match_against(str, ft_info, NULL, 0)))
+ DBUG_RETURN(error_num);
+ if (str->reserve(SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+
+ if (ft_info == spider->ft_current)
+ break;
+ ft_info = ft_info->next;
+ }
+ if (!first)
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_update_where(
+ spider_string *str,
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+) {
+ uint field_name_length;
+ Field **field;
+ SPIDER_SHARE *share = spider->share;
+ DBUG_ENTER("spider_oracle_handler::append_update_where");
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ for (field = table->field; *field; field++)
+ {
+ if (
+ table->s->primary_key == MAX_KEY ||
+ bitmap_is_set(table->read_set, (*field)->field_index)
+ ) {
+ field_name_length =
+ oracle_share->column_name_str[(*field)->field_index].length();
+ if ((*field)->is_null(ptr_diff))
+ {
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
+ } else {
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ (*field)->move_field_offset(ptr_diff);
+ if (
+ spider_db_oracle_utility.
+ append_column_value(spider, str, *field, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_AND_LEN)
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ (*field)->move_field_offset(-ptr_diff);
+ }
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+ }
+/*
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+*/
+ if (str->reserve(SPIDER_SQL_LIMIT1_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LIMIT1_STR, SPIDER_SQL_LIMIT1_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_condition_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type,
+ bool test_flg
+) {
+ int error_num;
+ spider_string *str;
+ bool start_where = FALSE;
+ DBUG_ENTER("spider_oracle_handler::append_condition_part");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ DBUG_PRINT("info",("spider case1 sql_type=%lu", sql_type));
+ if (test_flg)
+ {
+ str = NULL;
+ } else {
+ str = &sql;
+ start_where = ((int) str->length() == where_pos);
+ }
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ DBUG_PRINT("info",("spider case1 sql_type=%lu", sql_type));
+ if (test_flg)
+ {
+ str = NULL;
+ } else {
+ str = &tmp_sql;
+ start_where = ((int) str->length() == where_pos);
+ }
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ DBUG_PRINT("info",("spider case2 sql_type=%lu", sql_type));
+ if (test_flg)
+ {
+ str = NULL;
+ } else {
+ str = &update_sql;
+ start_where = ((int) str->length() == where_pos);
+ }
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ DBUG_PRINT("info",("spider case3 sql_type=%lu", sql_type));
+ if (test_flg)
+ {
+ str = NULL;
+ } else {
+ str = &ha_sql;
+ start_where = TRUE;
+ if (spider->active_index == MAX_KEY)
+ {
+ set_where_pos(SPIDER_SQL_TYPE_HANDLER);
+ if (str->reserve(SPIDER_SQL_READ_LEN + SPIDER_SQL_FIRST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_READ_STR, SPIDER_SQL_READ_LEN);
+ ha_next_pos = str->length();
+ str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
+ sql_part2.length(0);
+ }
+ ha_where_pos = str->length();
+
+ if (sql_part2.length())
+ {
+ str->append(sql_part2);
+ start_where = FALSE;
+ }
+ }
+ break;
+ default:
+ DBUG_PRINT("info",("spider default sql_type=%lu", sql_type));
+ DBUG_RETURN(0);
+ }
+ error_num = append_condition(str, alias, alias_length, start_where,
+ sql_type);
+ DBUG_PRINT("info",("spider str=%s", str ? str->c_ptr_safe() : "NULL"));
+ DBUG_PRINT("info",("spider length=%u", str ? str->length() : 0));
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_condition(
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool start_where,
+ ulong sql_type
+) {
+ int error_num, restart_pos = 0, start_where_pos;
+ SPIDER_CONDITION *tmp_cond = spider->condition;
+ DBUG_ENTER("spider_oracle_handler::append_condition");
+ DBUG_PRINT("info",("spider str=%p", str));
+ DBUG_PRINT("info",("spider alias=%p", alias));
+ DBUG_PRINT("info",("spider alias_length=%u", alias_length));
+ DBUG_PRINT("info",("spider start_where=%s", start_where ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider sql_type=%lu", sql_type));
+ if (str && start_where)
+ {
+ start_where_pos = str->length();
+ } else {
+ start_where_pos = 0;
+ }
+
+ if (spider->is_clone && !tmp_cond)
+ {
+ tmp_cond = spider->pt_clone_source_handler->condition;
+ }
+
+ while (tmp_cond)
+ {
+ if (str)
+ {
+ restart_pos = str->length();
+ if (start_where)
+ {
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ start_where = FALSE;
+ } else {
+ if (str->reserve(SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+ }
+ if ((error_num = spider_db_print_item_type(
+ (Item *) tmp_cond->cond, spider, str, alias, alias_length,
+ spider_dbton_oracle.dbton_id)))
+ {
+ if (str && error_num == ER_SPIDER_COND_SKIP_NUM)
+ {
+ DBUG_PRINT("info",("spider COND skip"));
+ str->length(restart_pos);
+ start_where = (restart_pos == start_where_pos);
+ } else
+ DBUG_RETURN(error_num);
+ }
+ tmp_cond = tmp_cond->next;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_match_against_part(
+ ulong sql_type,
+ st_spider_ft_info *ft_info,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_match_against_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_match_against(str, ft_info, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_match_against(
+ spider_string *str,
+ st_spider_ft_info *ft_info,
+ const char *alias,
+ uint alias_length
+) {
+ SPIDER_SHARE *share = spider->share;
+ TABLE *table = spider->get_table();
+ String *ft_init_key;
+ KEY *key_info;
+ uint key_name_length;
+ int key_count;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ DBUG_ENTER("spider_oracle_handler::append_match_against");
+ DBUG_PRINT("info",("spider this=%p", this));
+ 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);
+
+ ft_init_key = ft_info->key;
+ key_info = &table->key_info[ft_info->inx];
+ DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
+ spider_user_defined_key_parts(key_info)));
+
+ for (
+ key_part = key_info->key_part,
+ key_count = 0;
+ key_count < (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ key_count++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (alias_length)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ } else {
+ if (str->reserve(key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ if (str->reserve(SPIDER_SQL_AGAINST_LEN + SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+
+ char buf[MAX_FIELD_WIDTH];
+ spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
+ tmp_str.init_calc_mem(211);
+ tmp_str.length(0);
+ if (
+ tmp_str.append(ft_init_key->ptr(), ft_init_key->length(),
+ ft_init_key->charset()) ||
+ str->reserve(tmp_str.length() * 2) ||
+ spider_db_oracle_utility.append_escaped_util(str, tmp_str.get_str())
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+
+ if (str->reserve(
+ SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_CLOSE_PAREN_LEN +
+ ((ft_info->flags & FT_BOOL) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
+ ((ft_info->flags & FT_EXPAND) ?
+ SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
+ ))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ if (ft_info->flags & FT_BOOL)
+ str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
+ SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
+ if (ft_info->flags & FT_EXPAND)
+ str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
+ SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_match_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_match_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_match_select(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_match_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_match_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider->ft_current)
+ {
+ st_spider_ft_info *ft_info = spider->ft_first;
+ while (TRUE)
+ {
+ if ((error_num = append_match_against(str, ft_info,
+ alias, alias_length)))
+ DBUG_RETURN(error_num);
+ 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 (ft_info == spider->ft_current)
+ break;
+ ft_info = ft_info->next;
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_oracle_handler::append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_sum_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_sum_select(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_sum_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ st_select_lex *select_lex;
+ DBUG_ENTER("spider_oracle_handler::append_sum_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ select_lex = spider_get_select_lex(spider);
+ JOIN *join = select_lex->join;
+ Item_sum **item_sum_ptr;
+ for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
+ {
+ if ((error_num = spider_db_oracle_utility.open_item_sum_func(*item_sum_ptr,
+ spider, str, alias, alias_length)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ 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);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
+void spider_oracle_handler::set_order_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::set_order_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ order_pos = sql.length();
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ order_pos = update_sql.length();
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ ha_next_pos = ha_sql.length();
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_oracle_handler::set_order_to_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::set_order_to_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ sql.length(order_pos);
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ update_sql.length(order_pos);
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ ha_sql.length(ha_next_pos);
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+int spider_oracle_handler::append_group_by_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_group_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_group_by(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_group_by(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ st_select_lex *select_lex;
+ DBUG_ENTER("spider_oracle_handler::append_group_by");
+ DBUG_PRINT("info",("spider this=%p", this));
+ select_lex = spider_get_select_lex(spider);
+ ORDER *group = (ORDER *) select_lex->group_list.first;
+ if (group)
+ {
+ if (str->reserve(SPIDER_SQL_GROUP_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
+ for (; group; group = group->next)
+ {
+ if ((error_num = spider_db_print_item_type((*group->item), spider, str,
+ alias, alias_length, spider_dbton_oracle.dbton_id)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ 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);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
+int spider_oracle_handler::append_key_order_for_merge_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_key_order_for_merge_with_alias_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ ha_limit_pos = ha_sql.length();
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_order_for_merge_with_alias(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_key_order_for_merge_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ /* sort for index merge */
+ TABLE *table = spider->get_table();
+ int length;
+ Field *field;
+ uint key_name_length;
+ DBUG_ENTER("spider_oracle_handler::append_key_order_for_merge_with_alias");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ int error_num;
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+ if (
+ spider->result_list.direct_order_limit ||
+ spider->result_list.internal_limit < 9223372036854775807LL ||
+ spider->result_list.split_read < 9223372036854775807LL ||
+ spider->result_list.internal_offset
+ ) {
+ if (update_rownum_appended || select_rownum_appended)
+ {
+ if (str->reserve(SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ order_pos = str->length();
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+ }
+ sql_part.length(0);
+ if (str == &update_sql)
+ {
+ if (sql_part.reserve(str->length() + SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(str->ptr(), where_pos);
+ sql_part.q_append(SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR,
+ SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN);
+ } else {
+ if (sql_part.reserve(str->length() + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
+ SPIDER_SQL_ROW_NUMBER_HEAD_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR,
+ SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN);
+ sql_part.q_append(str->ptr(), table_name_pos - SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_HEAD_STR,
+ SPIDER_SQL_ROW_NUMBER_HEAD_LEN);
+ }
+ if (table->s->primary_key < MAX_KEY)
+ {
+ /* sort by primary key */
+ KEY *key_info = &table->key_info[table->s->primary_key];
+ KEY_PART_INFO *key_part;
+ for (
+ key_part = key_info->key_part,
+ length = 1;
+ length <= (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (sql_part.reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(alias, alias_length);
+ oracle_share->append_column_name(&sql_part, field->field_index);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ } else {
+ /* sort by all columns */
+ Field **fieldp;
+ for (
+ fieldp = table->field, length = 1;
+ *fieldp;
+ fieldp++, length++
+ ) {
+ key_name_length =
+ oracle_share->column_name_str[(*fieldp)->field_index].length();
+ if (sql_part.reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(alias, alias_length);
+ oracle_share->append_column_name(&sql_part, (*fieldp)->field_index);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ uint pos_diff;
+ if (str == &update_sql)
+ {
+ uint table_name_size = (update_set_pos ? update_set_pos : where_pos) -
+ table_name_pos;
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
+ SPIDER_SQL_FROM_LEN + table_name_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
+ sql_part.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(str->ptr() + table_name_pos, table_name_size);
+ pos_diff = sql_part.length() - where_pos;
+ sql_part.q_append(str->ptr() + where_pos, str->length() - where_pos);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ update_rownum_appended = TRUE;
+ } else {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
+ SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
+ pos_diff = sql_part.length() + SPIDER_SQL_FROM_LEN - table_name_pos;
+ sql_part.q_append(str->ptr() + table_name_pos - SPIDER_SQL_FROM_LEN,
+ str->length() - table_name_pos + SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ select_rownum_appended = TRUE;
+ table_name_pos = table_name_pos + pos_diff;
+ }
+ if (str->copy(sql_part))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ where_pos = where_pos + pos_diff;
+ order_pos = str->length();
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+ }
+ if (table->s->primary_key < MAX_KEY)
+ {
+ /* sort by primary key */
+ KEY *key_info = &table->key_info[table->s->primary_key];
+ KEY_PART_INFO *key_part;
+ for (
+ key_part = key_info->key_part,
+ length = 1;
+ length <= (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (length > 1)
+ {
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ } else {
+ /* sort by all columns */
+ Field **fieldp;
+ for (
+ fieldp = table->field, length = 1;
+ *fieldp;
+ fieldp++, length++
+ ) {
+ key_name_length =
+ oracle_share->column_name_str[(*fieldp)->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, (*fieldp)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (length > 1)
+ {
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_order_for_direct_order_limit_with_alias(
+ str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ int error_num;
+ ORDER *order;
+ st_select_lex *select_lex;
+ longlong select_limit;
+ longlong offset_limit;
+ DBUG_ENTER("spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+ spider_get_select_limit(spider, &select_lex, &select_limit,
+ &offset_limit);
+ if (
+ spider->result_list.direct_order_limit ||
+ spider->result_list.internal_limit < 9223372036854775807LL ||
+ spider->result_list.split_read < 9223372036854775807LL ||
+ spider->result_list.internal_offset
+ ) {
+ if (update_rownum_appended || select_rownum_appended)
+ {
+ if (str->reserve(SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ order_pos = str->length();
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+ }
+ sql_part.length(0);
+ if (str == &update_sql)
+ {
+ if (sql_part.reserve(str->length() + SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(str->ptr(), where_pos);
+ sql_part.q_append(SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR,
+ SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN);
+ } else {
+ if (sql_part.reserve(str->length() + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
+ SPIDER_SQL_ROW_NUMBER_HEAD_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR,
+ SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN);
+ sql_part.q_append(str->ptr(), table_name_pos - SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_HEAD_STR,
+ SPIDER_SQL_ROW_NUMBER_HEAD_LEN);
+ }
+ bool all_desc = TRUE;
+ if (select_lex->order_list.first)
+ {
+ for (order = (ORDER *) select_lex->order_list.first; order;
+ order = order->next)
+ {
+ if ((error_num =
+ spider_db_print_item_type((*order->item), spider, &sql_part, alias,
+ alias_length, spider_dbton_oracle.dbton_id)))
+ {
+ DBUG_PRINT("info",("spider error=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if (order->asc)
+ {
+ if (sql_part.reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ all_desc = FALSE;
+ } else {
+ if (sql_part.reserve(SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ } else {
+ all_desc = FALSE;
+ }
+ uint pos_diff;
+ if (str == &update_sql)
+ {
+ uint table_name_size = (update_set_pos ? update_set_pos : where_pos) -
+ table_name_pos;
+ if (all_desc)
+ {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
+ SPIDER_SQL_FROM_LEN + table_name_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
+ } else {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
+ SPIDER_SQL_FROM_LEN + table_name_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
+ }
+ sql_part.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(str->ptr() + table_name_pos, table_name_size);
+ pos_diff = sql_part.length() - where_pos;
+ sql_part.q_append(str->ptr() + where_pos, str->length() - where_pos);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ update_rownum_appended = TRUE;
+ } else {
+ if (all_desc)
+ {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
+ SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
+ } else {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
+ SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
+ }
+ pos_diff = sql_part.length() + SPIDER_SQL_FROM_LEN - table_name_pos;
+ sql_part.q_append(str->ptr() + table_name_pos - SPIDER_SQL_FROM_LEN,
+ str->length() - table_name_pos + SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ select_rownum_appended = TRUE;
+ table_name_pos = table_name_pos + pos_diff;
+ }
+ if (str->copy(sql_part))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ where_pos = where_pos + pos_diff;
+ order_pos = str->length();
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+ }
+ if (select_lex->order_list.first)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ for (order = (ORDER *) select_lex->order_list.first; order;
+ order = order->next)
+ {
+ if ((error_num =
+ spider_db_print_item_type((*order->item), spider, str, alias,
+ alias_length, spider_dbton_oracle.dbton_id)))
+ {
+ DBUG_PRINT("info",("spider error=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if (order->asc)
+ {
+ 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);
+ } else {
+ if (str->reserve(SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_key_order_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_key_order_with_alias_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ error_num = append_key_order_for_handler(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_key_order_with_alias(str, alias, alias_length);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_key_order_for_handler(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ DBUG_ENTER("spider_oracle_handler::append_key_order_for_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider ha_next_pos=%d", ha_next_pos));
+ DBUG_PRINT("info",("spider ha_where_pos=%d", ha_where_pos));
+ str->q_append(alias, alias_length);
+ memset((char *) str->ptr() + str->length(), ' ',
+ ha_where_pos - ha_next_pos - alias_length);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_key_order_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+) {
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ KEY *key_info = result_list->key_info;
+ int length;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ uint key_name_length;
+ DBUG_ENTER("spider_oracle_handler::append_key_order_with_alias");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ if (spider->result_list.direct_aggregate)
+ {
+ int error_num;
+ if ((error_num = append_group_by(str, alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+#endif
+ if (
+ spider->result_list.direct_order_limit ||
+ spider->result_list.internal_limit < 9223372036854775807LL ||
+ spider->result_list.split_read < 9223372036854775807LL ||
+ spider->result_list.internal_offset
+ ) {
+ if (update_rownum_appended || select_rownum_appended)
+ {
+ if (str->reserve(SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ order_pos = str->length();
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+ }
+ sql_part.length(0);
+ if (str == &update_sql)
+ {
+ if (sql_part.reserve(str->length() + SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(str->ptr(), where_pos);
+ sql_part.q_append(SPIDER_SQL_UPDATE_WRAPPER_HEAD_STR,
+ SPIDER_SQL_UPDATE_WRAPPER_HEAD_LEN);
+ } else {
+ if (sql_part.reserve(str->length() + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
+ SPIDER_SQL_ROW_NUMBER_HEAD_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR,
+ SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN);
+ sql_part.q_append(str->ptr(), table_name_pos - SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_HEAD_STR,
+ SPIDER_SQL_ROW_NUMBER_HEAD_LEN);
+ }
+ if (result_list->sorted == TRUE)
+ {
+ if (result_list->desc_flg == TRUE)
+ {
+ for (
+ key_part = key_info->key_part + result_list->key_order,
+ length = 1;
+ length + result_list->key_order <=
+ (int) spider_user_defined_key_parts(key_info) &&
+ length <= result_list->max_order;
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (sql_part.reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(alias, alias_length);
+ oracle_share->append_column_name(&sql_part, field->field_index);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (sql_part.reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(alias, alias_length);
+ oracle_share->append_column_name(&sql_part, field->field_index);
+ sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ } else {
+ for (
+ key_part = key_info->key_part + result_list->key_order,
+ length = 1;
+ length + result_list->key_order <=
+ (int) spider_user_defined_key_parts(key_info) &&
+ length <= result_list->max_order;
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (sql_part.reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(alias, alias_length);
+ oracle_share->append_column_name(&sql_part, field->field_index);
+ sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (sql_part.reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(alias, alias_length);
+ oracle_share->append_column_name(&sql_part, field->field_index);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ }
+ }
+ uint pos_diff;
+ if (str == &update_sql)
+ {
+ uint table_name_size = (update_set_pos ? update_set_pos : where_pos) -
+ table_name_pos;
+ if (result_list->sorted == TRUE && result_list->desc_flg == TRUE)
+ {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
+ SPIDER_SQL_FROM_LEN + table_name_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
+ } else {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - where_pos +
+ SPIDER_SQL_FROM_LEN + table_name_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
+ }
+ sql_part.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(str->ptr() + table_name_pos,
+ table_name_size);
+ pos_diff = sql_part.length() - where_pos;
+ sql_part.q_append(str->ptr() + where_pos, str->length() - where_pos);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ update_rownum_appended = TRUE;
+ } else {
+ if (result_list->sorted == TRUE && result_list->desc_flg == TRUE)
+ {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
+ SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
+ } else {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + str->length() - table_name_pos +
+ SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
+ }
+ pos_diff = sql_part.length() + SPIDER_SQL_FROM_LEN - table_name_pos;
+ sql_part.q_append(str->ptr() + table_name_pos - SPIDER_SQL_FROM_LEN,
+ str->length() - table_name_pos + SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ select_rownum_appended = TRUE;
+ table_name_pos = table_name_pos + pos_diff;
+ }
+ if (str->copy(sql_part))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ where_pos = where_pos + pos_diff;
+ order_pos = str->length();
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+ }
+ if (result_list->sorted == TRUE)
+ {
+ if (result_list->desc_flg == TRUE)
+ {
+ for (
+ key_part = key_info->key_part + result_list->key_order,
+ length = 1;
+ length + result_list->key_order <
+ (int) spider_user_defined_key_parts(key_info) &&
+ length < result_list->max_order;
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ if (
+ length + result_list->key_order <=
+ (int) spider_user_defined_key_parts(key_info) &&
+ length <= result_list->max_order
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ } else {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ }
+ }
+ } else {
+ for (
+ key_part = key_info->key_part + result_list->key_order,
+ length = 1;
+ length + result_list->key_order <
+ (int) spider_user_defined_key_parts(key_info) &&
+ length < result_list->max_order;
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ if (
+ length + result_list->key_order <=
+ (int) spider_user_defined_key_parts(key_info) &&
+ length <= result_list->max_order
+ ) {
+ field = key_part->field;
+ key_name_length =
+ oracle_share->column_name_str[field->field_index].length();
+ if (length == 1)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ }
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ } else {
+ if (str->reserve(alias_length + key_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(alias, alias_length);
+ oracle_share->append_column_name(str, field->field_index);
+ }
+ }
+ }
+ }
+ limit_pos = str->length();
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_limit_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ limit_pos = str->length();
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ limit_pos = str->length();
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ limit_pos = str->length();
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ ha_limit_pos = str->length();
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_limit(str, offset, limit);
+ DBUG_PRINT("info",("spider str=%s", str->c_ptr_safe()));
+ DBUG_PRINT("info",("spider length=%u", str->length()));
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::reappend_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::reappend_limit_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ str->length(limit_pos);
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ str->length(limit_pos);
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ str->length(limit_pos);
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ str->length(ha_limit_pos);
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_limit(str, offset, limit);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_limit(
+ spider_string *str,
+ longlong offset,
+ longlong limit
+) {
+ char buf[SPIDER_LONGLONG_LEN + 1];
+ uint32 length;
+ DBUG_ENTER("spider_oracle_handler::append_limit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info", ("spider offset=%lld", offset));
+ DBUG_PRINT("info", ("spider limit=%lld", limit));
+ if (offset || limit < 9223372036854775807LL)
+ {
+ if ((int) str->length() == where_pos)
+ {
+ if (offset)
+ {
+ int error_num;
+ if ((error_num = append_key_order_for_direct_order_limit_with_alias(
+ str, NULL, 0)))
+ DBUG_RETURN(error_num);
+ } else {
+ if (str->reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_ROWNUM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ str->q_append(SPIDER_SQL_ROWNUM_STR, SPIDER_SQL_ROWNUM_LEN);
+ }
+ }
+ if (offset)
+ {
+ if (str->reserve(SPIDER_SQL_BETWEEN_LEN + SPIDER_SQL_AND_LEN +
+ ((SPIDER_LONGLONG_LEN) * 2)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_BETWEEN_STR, SPIDER_SQL_BETWEEN_LEN);
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset + 1);
+ str->q_append(buf, length);
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit + offset);
+ str->q_append(buf, length);
+ } else {
+ if (str->reserve(SPIDER_SQL_HS_LTEQUAL_LEN +
+ (SPIDER_LONGLONG_LEN)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HS_LTEQUAL_STR, SPIDER_SQL_HS_LTEQUAL_LEN);
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
+ str->q_append(buf, length);
+ }
+ if (update_rownum_appended)
+ {
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_select_lock_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_select_lock_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_select_lock(str);
+ DBUG_PRINT("info",("spider str=%s", str->c_ptr_safe()));
+ DBUG_PRINT("info",("spider length=%u", str->length()));
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_select_lock(
+ spider_string *str
+) {
+ int lock_mode = spider_conn_lock_mode(spider);
+ DBUG_ENTER("spider_oracle_handler::append_select_lock");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (select_rownum_appended)
+ {
+ table_lock_mode = lock_mode;
+ } else {
+ if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
+ {
+ if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
+ } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
+ {
+ if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_union_all_start_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_union_all_start_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_all_start(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_union_all_start(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_union_all_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ 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_RETURN(0);
+}
+
+int spider_oracle_handler::append_union_all_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_union_all_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_all(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_union_all(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_union_all");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_UNION_ALL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_union_all_end_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_union_all_end_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_union_all_end(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_union_all_end(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_union_all_end");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(str->length() -
+ SPIDER_SQL_UNION_ALL_LEN + SPIDER_SQL_CLOSE_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_multi_range_cnt_part(
+ ulong sql_type,
+ uint multi_range_cnt,
+ bool with_comma
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_multi_range_cnt_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_multi_range_cnt(str, multi_range_cnt, with_comma);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_multi_range_cnt(
+ spider_string *str,
+ uint multi_range_cnt,
+ bool with_comma
+) {
+ int range_cnt_length;
+ char range_cnt_str[SPIDER_SQL_INT_LEN];
+ DBUG_ENTER("spider_oracle_handler::append_multi_range_cnt");
+ DBUG_PRINT("info",("spider this=%p", this));
+ range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
+ multi_range_cnt));
+ if (with_comma)
+ {
+ if (str->reserve(range_cnt_length + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(range_cnt_str, range_cnt_length);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (str->reserve(range_cnt_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(range_cnt_str, range_cnt_length);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_multi_range_cnt_with_name_part(
+ ulong sql_type,
+ uint multi_range_cnt
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_multi_range_cnt_with_name_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ str = &tmp_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_multi_range_cnt_with_name(str, multi_range_cnt);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_multi_range_cnt_with_name(
+ spider_string *str,
+ uint multi_range_cnt
+) {
+ int range_cnt_length;
+ char range_cnt_str[SPIDER_SQL_INT_LEN];
+ DBUG_ENTER("spider_oracle_handler::append_multi_range_cnt_with_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
+ multi_range_cnt));
+ if (str->reserve(range_cnt_length + SPIDER_SQL_SPACE_LEN +
+ SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(range_cnt_str, range_cnt_length);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_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_oracle_handler::append_open_handler_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_open_handler(str, handler_id, conn, link_idx);
+ exec_ha_sql = str;
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_open_handler(
+ spider_string *str,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_open_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider link_idx=%d", link_idx));
+ DBUG_PRINT("info",("spider m_handler_cid=%s",
+ spider->m_handler_cid[link_idx]));
+ if (str->reserve(SPIDER_SQL_HANDLER_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
+ if ((error_num = oracle_share->append_table_name(str,
+ spider->conn_link_idx[link_idx])))
+ DBUG_RETURN(error_num);
+ if (str->reserve(SPIDER_SQL_OPEN_LEN + SPIDER_SQL_AS_LEN +
+ SPIDER_SQL_HANDLER_CID_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_OPEN_STR, SPIDER_SQL_OPEN_LEN);
+ str->q_append(SPIDER_SQL_AS_STR, SPIDER_SQL_AS_LEN);
+ str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_close_handler_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_close_handler_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_close_handler(str, link_idx);
+ exec_ha_sql = str;
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_close_handler(
+ spider_string *str,
+ int link_idx
+) {
+ DBUG_ENTER("spider_oracle_handler::append_close_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_HANDLER_LEN + SPIDER_SQL_CLOSE_LEN +
+ SPIDER_SQL_HANDLER_CID_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
+ str->q_append(spider->m_handler_cid[link_idx],
+ SPIDER_SQL_HANDLER_CID_LEN);
+ str->q_append(SPIDER_SQL_CLOSE_STR, SPIDER_SQL_CLOSE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_insert_terminator_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_insert_terminator_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ str = &insert_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_insert_terminator(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_insert_terminator(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_oracle_handler::append_insert_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider->result_list.insert_dup_update_pushdown)
+ {
+ DBUG_PRINT("info",("spider add duplicate key update"));
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ if (str->reserve(SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN +
+ dup_update_sql.length()))
+ {
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_DUPLICATE_KEY_UPDATE_STR,
+ SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN);
+ if (str->append(dup_update_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ } else {
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_insert_values_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_insert_values_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ str = &insert_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_insert_values(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_insert_values(
+ spider_string *str
+) {
+ SPIDER_SHARE *share = spider->share;
+ TABLE *table = spider->get_table();
+ Field **field;
+ bool add_value = FALSE;
+ DBUG_ENTER("spider_oracle_handler::append_insert_values");
+ DBUG_PRINT("info",("spider this=%p", this));
+ nextval_pos = 0;
+ if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ 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
+ add_value = TRUE;
+ 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 (
+ table->next_number_field == *field &&
+ !table->auto_increment_field_not_null &&
+ !spider->force_auto_increment
+ ) {
+ nextval_pos = str->length();
+ if (str->reserve(oracle_share->nextval_max_length +
+ SPIDER_SQL_COMMA_LEN))
+ {
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->length(str->length() + oracle_share->nextval_max_length);
+ } else if ((*field)->is_null())
+ {
+ if (str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
+ {
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else {
+ if (
+ spider_db_oracle_utility.
+ append_column_value(spider, str, *field, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_COMMA_LEN)
+ ) {
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+#ifndef DBUG_OFF
+ dbug_tmp_restore_column_map(table->read_set, tmp_map);
+#endif
+ }
+ }
+ if (add_value)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
+ {
+ str->length(0);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_into_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_into_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ str = &insert_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_into(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_into(
+ spider_string *str
+) {
+ const TABLE *table = spider->get_table();
+ Field **field;
+ uint field_name_length = 0;
+ DBUG_ENTER("spider_oracle_handler::append_into");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_INTO_LEN + oracle_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
+ insert_table_name_pos = str->length();
+ append_table_name_with_adjusting(str, first_link_idx,
+ SPIDER_SQL_TYPE_INSERT_SQL);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ for (field = table->field; *field; field++)
+ {
+ if (
+ bitmap_is_set(table->write_set, (*field)->field_index) ||
+ bitmap_is_set(table->read_set, (*field)->field_index)
+ ) {
+ field_name_length =
+ oracle_share->column_name_str[(*field)->field_index].length();
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ if (field_name_length)
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ if (str->reserve(SPIDER_SQL_VALUES_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
+ insert_pos = str->length();
+ DBUG_RETURN(0);
+}
+
+void spider_oracle_handler::set_insert_to_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::set_insert_to_pos");
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ insert_sql.length(insert_pos);
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_handler::append_from_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_from_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_HANDLER:
+ str = &ha_sql;
+ break;
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ str = &update_sql;
+ break;
+ default:
+ str = &sql;
+ break;
+ }
+ error_num = append_from(str, sql_type, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_from(
+ spider_string *str,
+ ulong sql_type,
+ int link_idx
+) {
+ DBUG_ENTER("spider_oracle_handler::append_from");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider link_idx=%d", link_idx));
+ if (sql_type == SPIDER_SQL_TYPE_HANDLER)
+ {
+ ha_table_name_pos = str->length();
+ DBUG_PRINT("info",("spider ha_table_name_pos=%u", ha_table_name_pos));
+ ha_sql_handler_id = spider->m_handler_id[link_idx];
+ DBUG_PRINT("info",("spider ha_sql_handler_id=%u", ha_sql_handler_id));
+ if (str->reserve(SPIDER_SQL_HANDLER_CID_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
+ DBUG_PRINT("info",("spider m_handler_cid=%s",
+ spider->m_handler_cid[link_idx]));
+ } else {
+ if (str->reserve(SPIDER_SQL_FROM_LEN + oracle_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ table_name_pos = str->length();
+ append_table_name_with_adjusting(str, link_idx, sql_type);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_flush_tables_part(
+ ulong sql_type,
+ int link_idx,
+ bool lock
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_flush_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_flush_tables(str, link_idx, lock);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_flush_tables(
+ spider_string *str,
+ int link_idx,
+ bool lock
+) {
+ DBUG_ENTER("spider_oracle_handler::append_flush_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (lock)
+ {
+ if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN +
+ SPIDER_SQL_WITH_READ_LOCK_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
+ str->q_append(SPIDER_SQL_WITH_READ_LOCK_STR,
+ SPIDER_SQL_WITH_READ_LOCK_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_optimize_table_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_optimize_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_optimize_table(str, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_optimize_table(
+ spider_string *str,
+ int link_idx
+) {
+ SPIDER_SHARE *share = spider->share;
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ int local_length = spider_param_internal_optimize_local(spider->trx->thd,
+ share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
+ DBUG_ENTER("spider_oracle_handler::append_optimize_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_OPTIMIZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
+ local_length +
+ oracle_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ oracle_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_OPTIMIZE_STR, SPIDER_SQL_SQL_OPTIMIZE_LEN);
+ if (local_length)
+ str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
+ str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
+ oracle_share->append_table_name(str, conn_link_idx);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_analyze_table_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_analyze_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_analyze_table(str, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_analyze_table(
+ spider_string *str,
+ int link_idx
+) {
+ SPIDER_SHARE *share = spider->share;
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ int local_length = spider_param_internal_optimize_local(spider->trx->thd,
+ share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
+ DBUG_ENTER("spider_oracle_handler::append_analyze_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_ANALYZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
+ local_length +
+ oracle_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ oracle_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_ANALYZE_STR, SPIDER_SQL_SQL_ANALYZE_LEN);
+ if (local_length)
+ str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
+ str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
+ oracle_share->append_table_name(str, conn_link_idx);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_repair_table_part(
+ ulong sql_type,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_repair_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_repair_table(str, link_idx, check_opt);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_repair_table(
+ spider_string *str,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ SPIDER_SHARE *share = spider->share;
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ int local_length = spider_param_internal_optimize_local(spider->trx->thd,
+ share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
+ DBUG_ENTER("spider_oracle_handler::append_repair_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_REPAIR_LEN + SPIDER_SQL_SQL_TABLE_LEN +
+ local_length +
+ oracle_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ oracle_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_REPAIR_STR, SPIDER_SQL_SQL_REPAIR_LEN);
+ if (local_length)
+ str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
+ str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
+ oracle_share->append_table_name(str, conn_link_idx);
+ if (check_opt->flags & T_QUICK)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
+ }
+ if (check_opt->flags & T_EXTEND)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
+ }
+ if (check_opt->sql_flags & TT_USEFRM)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_USE_FRM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_USE_FRM_STR, SPIDER_SQL_SQL_USE_FRM_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_check_table_part(
+ ulong sql_type,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_check_table_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_check_table(str, link_idx, check_opt);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_check_table(
+ spider_string *str,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_oracle_handler::append_check_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_CHECK_TABLE_LEN +
+ oracle_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ oracle_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_CHECK_TABLE_STR,
+ SPIDER_SQL_SQL_CHECK_TABLE_LEN);
+ oracle_share->append_table_name(str, conn_link_idx);
+ if (check_opt->flags & T_QUICK)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
+ }
+ if (check_opt->flags & T_FAST)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_FAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_FAST_STR, SPIDER_SQL_SQL_FAST_LEN);
+ }
+ if (check_opt->flags & T_MEDIUM)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_MEDIUM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_MEDIUM_STR, SPIDER_SQL_SQL_MEDIUM_LEN);
+ }
+ if (check_opt->flags & T_EXTEND)
+ {
+ if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_enable_keys_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_enable_keys_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_enable_keys(str, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_enable_keys(
+ spider_string *str,
+ int link_idx
+) {
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_oracle_handler::append_enable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
+ oracle_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ oracle_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_ENABLE_KEYS_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
+ SPIDER_SQL_SQL_ALTER_TABLE_LEN);
+ oracle_share->append_table_name(str, conn_link_idx);
+ str->q_append(SPIDER_SQL_SQL_ENABLE_KEYS_STR,
+ SPIDER_SQL_SQL_ENABLE_KEYS_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_disable_keys_part(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_disable_keys_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_disable_keys(str, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_disable_keys(
+ spider_string *str,
+ int link_idx
+) {
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_oracle_handler::append_disable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
+ oracle_share->db_names_str[conn_link_idx].length() +
+ SPIDER_SQL_DOT_LEN +
+ oracle_share->table_names_str[conn_link_idx].length() +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_DISABLE_KEYS_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
+ SPIDER_SQL_SQL_ALTER_TABLE_LEN);
+ oracle_share->append_table_name(str, conn_link_idx);
+ str->q_append(SPIDER_SQL_SQL_DISABLE_KEYS_STR,
+ SPIDER_SQL_SQL_DISABLE_KEYS_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_delete_all_rows_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_delete_all_rows_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ str = &update_sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_delete_all_rows(str, sql_type);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_delete_all_rows(
+ spider_string *str,
+ ulong sql_type
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_delete_all_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider->sql_command == SQLCOM_TRUNCATE)
+ {
+ if ((error_num = append_truncate(str, sql_type, first_link_idx)))
+ DBUG_RETURN(error_num);
+ } else {
+ if (
+ (error_num = append_delete(str)) ||
+ (error_num = append_from(str, sql_type, first_link_idx))
+ )
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_truncate(
+ spider_string *str,
+ ulong sql_type,
+ int link_idx
+) {
+ DBUG_ENTER("spider_oracle_handler::append_truncate");
+ if (str->reserve(SPIDER_SQL_TRUNCATE_TABLE_LEN +
+ oracle_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + oracle_share->table_nm_max_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_TRUNCATE_TABLE_STR, SPIDER_SQL_TRUNCATE_TABLE_LEN);
+ table_name_pos = str->length();
+ append_table_name_with_adjusting(str, link_idx, sql_type);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_explain_select_part(
+ key_range *start_key,
+ key_range *end_key,
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_explain_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_OTHER_SQL:
+ str = &spider->result_list.sqls[link_idx];
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num =
+ append_explain_select(str, start_key, end_key, sql_type, link_idx);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_explain_select(
+ spider_string *str,
+ key_range *start_key,
+ key_range *end_key,
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::append_explain_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_EXPLAIN_SELECT_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_EXPLAIN_SELECT_STR, SPIDER_SQL_EXPLAIN_SELECT_LEN);
+ if (
+ (error_num = append_from(str, sql_type, link_idx)) ||
+ (error_num = append_key_where(str, NULL, NULL, start_key, end_key,
+ sql_type, FALSE))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_oracle_handler::is_bulk_insert_exec_period(
+ bool bulk_end
+) {
+ DBUG_ENTER("spider_oracle_handler::is_bulk_insert_exec_period");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider insert_sql.length=%u", insert_sql.length()));
+ DBUG_PRINT("info",("spider insert_pos=%d", insert_pos));
+ DBUG_PRINT("info",("spider insert_sql=%s", insert_sql.c_ptr_safe()));
+ if (
+/*
+ (bulk_end || (int) insert_sql.length() >= spider->bulk_size) &&
+*/
+ (int) insert_sql.length() > insert_pos
+ ) {
+ DBUG_RETURN(TRUE);
+ }
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_oracle_handler::sql_is_filled_up(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::sql_is_filled_up");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(filled_up);
+}
+
+bool spider_oracle_handler::sql_is_empty(
+ ulong sql_type
+) {
+ bool is_empty;
+ DBUG_ENTER("spider_oracle_handler::sql_is_empty");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ is_empty = (sql.length() == 0);
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ is_empty = (insert_sql.length() == 0);
+ break;
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ is_empty = (update_sql.length() == 0);
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ is_empty = (tmp_sql.length() == 0);
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ is_empty = (ha_sql.length() == 0);
+ break;
+ default:
+ is_empty = TRUE;
+ break;
+ }
+ DBUG_RETURN(is_empty);
+}
+
+bool spider_oracle_handler::support_multi_split_read()
+{
+ DBUG_ENTER("spider_oracle_handler::support_multi_split_read");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_oracle_handler::support_bulk_update()
+{
+ DBUG_ENTER("spider_oracle_handler::support_bulk_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_oracle_handler::bulk_tmp_table_insert()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = store_sql_to_bulk_tmp_table(&update_sql, upd_tmp_tbl);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::bulk_tmp_table_insert(
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = store_sql_to_bulk_tmp_table(
+ &spider->result_list.update_sqls[link_idx],
+ spider->result_list.upd_tmp_tbls[link_idx]);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::bulk_tmp_table_end_bulk_insert()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_end_bulk_insert");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((error_num = upd_tmp_tbl->file->ha_end_bulk_insert()))
+ {
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::bulk_tmp_table_rnd_init()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_rnd_init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ upd_tmp_tbl->file->extra(HA_EXTRA_CACHE);
+ if ((error_num = upd_tmp_tbl->file->ha_rnd_init(TRUE)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ reading_from_bulk_tmp_table = TRUE;
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::bulk_tmp_table_rnd_next()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_rnd_next");
+ DBUG_PRINT("info",("spider this=%p", this));
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
+ error_num = upd_tmp_tbl->file->ha_rnd_next(upd_tmp_tbl->record[0]);
+#else
+ error_num = upd_tmp_tbl->file->rnd_next(upd_tmp_tbl->record[0]);
+#endif
+ if (!error_num)
+ {
+ error_num = restore_sql_from_bulk_tmp_table(&insert_sql, upd_tmp_tbl);
+ }
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::bulk_tmp_table_rnd_end()
+{
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_rnd_end");
+ DBUG_PRINT("info",("spider this=%p", this));
+ reading_from_bulk_tmp_table = FALSE;
+ if ((error_num = upd_tmp_tbl->file->ha_rnd_end()))
+ {
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+bool spider_oracle_handler::need_copy_for_update(
+ int link_idx
+) {
+ int all_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_oracle_handler::need_copy_for_update");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(!oracle_share->same_db_table_name ||
+ spider->share->link_statuses[all_link_idx] == SPIDER_LINK_STATUS_RECOVERY);
+}
+
+bool spider_oracle_handler::bulk_tmp_table_created()
+{
+ DBUG_ENTER("spider_oracle_handler::bulk_tmp_table_created");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(upd_tmp_tbl);
+}
+
+int spider_oracle_handler::mk_bulk_tmp_table_and_bulk_start()
+{
+ THD *thd = spider->trx->thd;
+ TABLE *table = spider->get_table();
+ DBUG_ENTER("spider_oracle_handler::mk_bulk_tmp_table_and_bulk_start");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!upd_tmp_tbl)
+ {
+ if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
+ thd, table, &upd_tmp_tbl_prm, "a", update_sql.charset())))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ upd_tmp_tbl->file->extra(HA_EXTRA_WRITE_CACHE);
+ upd_tmp_tbl->file->ha_start_bulk_insert((ha_rows) 0);
+ }
+ DBUG_RETURN(0);
+}
+
+void spider_oracle_handler::rm_bulk_tmp_table()
+{
+ DBUG_ENTER("spider_oracle_handler::rm_bulk_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (upd_tmp_tbl)
+ {
+ spider_rm_sys_tmp_table(spider->trx->thd, upd_tmp_tbl, &upd_tmp_tbl_prm);
+ upd_tmp_tbl = NULL;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_handler::store_sql_to_bulk_tmp_table(
+ spider_string *str,
+ TABLE *tmp_table
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::store_sql_to_bulk_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_table->field[0]->set_notnull();
+ tmp_table->field[0]->store(str->ptr(), str->length(), str->charset());
+ if ((error_num = tmp_table->file->ha_write_row(tmp_table->record[0])))
+ DBUG_RETURN(error_num);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::restore_sql_from_bulk_tmp_table(
+ spider_string *str,
+ TABLE *tmp_table
+) {
+ DBUG_ENTER("spider_oracle_handler::restore_sql_from_bulk_tmp_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_table->field[0]->val_str(str->get_str());
+ str->mem_calc();
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::insert_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash2 = &link_for_hash[link_idx];
+ DBUG_ENTER("spider_oracle_handler::insert_lock_tables_list");
+ DBUG_PRINT("info",("spider this=%p", this));
+ uint old_elements =
+ db_conn->lock_table_hash.array.max_element;
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ if (my_hash_insert_with_hash_value(
+ &db_conn->lock_table_hash,
+ tmp_link_for_hash2->db_table_str_hash_value,
+ (uchar*) tmp_link_for_hash2))
+#else
+ if (my_hash_insert(&db_conn->lock_table_hash,
+ (uchar*) tmp_link_for_hash2))
+#endif
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (db_conn->lock_table_hash.array.max_element > old_elements)
+ {
+ spider_alloc_calc_mem(spider_current_trx,
+ db_conn->lock_table_hash,
+ (db_conn->lock_table_hash.array.max_element - old_elements) *
+ db_conn->lock_table_hash.array.size_of_element);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx,
+ int *appended
+) {
+ int error_num;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash, *tmp_link_for_hash2;
+ int conn_link_idx = spider->conn_link_idx[link_idx];
+ spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
+ DBUG_ENTER("spider_oracle_handler::append_lock_tables_list");
+ DBUG_PRINT("info",("spider this=%p", this));
+ tmp_link_for_hash2 = &link_for_hash[link_idx];
+ tmp_link_for_hash2->db_table_str =
+ &oracle_share->db_table_str[conn_link_idx];
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ tmp_link_for_hash2->db_table_str_hash_value =
+ oracle_share->db_table_str_hash_value[conn_link_idx];
+ if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *)
+ my_hash_search_using_hash_value(
+ &db_conn->lock_table_hash,
+ tmp_link_for_hash2->db_table_str_hash_value,
+ (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
+ tmp_link_for_hash2->db_table_str->length())))
+#else
+ if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *) my_hash_search(
+ &db_conn->lock_table_hash,
+ (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
+ tmp_link_for_hash2->db_table_str->length())))
+#endif
+ {
+ if ((error_num = insert_lock_tables_list(conn, link_idx)))
+ DBUG_RETURN(error_num);
+ *appended = 1;
+ } else {
+ if (tmp_link_for_hash->spider->lock_type < spider->lock_type)
+ {
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ my_hash_delete_with_hash_value(
+ &db_conn->lock_table_hash,
+ tmp_link_for_hash->db_table_str_hash_value,
+ (uchar*) tmp_link_for_hash);
+#else
+ my_hash_delete(&db_conn->lock_table_hash,
+ (uchar*) tmp_link_for_hash);
+#endif
+ uint old_elements =
+ db_conn->lock_table_hash.array.max_element;
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ if (my_hash_insert_with_hash_value(
+ &db_conn->lock_table_hash,
+ tmp_link_for_hash2->db_table_str_hash_value,
+ (uchar*) tmp_link_for_hash2))
+#else
+ if (my_hash_insert(&db_conn->lock_table_hash,
+ (uchar*) tmp_link_for_hash2))
+#endif
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if (db_conn->lock_table_hash.array.max_element > old_elements)
+ {
+ spider_alloc_calc_mem(spider_current_trx,
+ db_conn->lock_table_hash,
+ (db_conn->lock_table_hash.array.max_element - old_elements) *
+ db_conn->lock_table_hash.array.size_of_element);
+ }
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_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_oracle_handler::realloc_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if ((int) sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ sql.free();
+ if (sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
+ }
+ if ((int) ha_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ ha_sql.free();
+ if (ha_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
+ }
+ if ((int) dup_update_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ dup_update_sql.free();
+ if (dup_update_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ if ((int) insert_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ insert_sql.free();
+ if (insert_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= SPIDER_SQL_TYPE_INSERT_SQL;
+ }
+ if ((int) update_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ update_sql.free();
+ if (update_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL);
+ }
+ update_sql.length(0);
+ if ((int) tmp_sql.alloced_length() > init_sql_alloc_size * 2)
+ {
+ tmp_sql.free();
+ if (tmp_sql.real_alloc(init_sql_alloc_size))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ *realloced |= SPIDER_SQL_TYPE_TMP_SQL;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::reset_sql(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::reset_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
+ {
+ table_lock_mode = 0;
+ select_rownum_appended = FALSE;
+ sql.length(0);
+ }
+ if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
+ {
+ insert_sql.length(0);
+ }
+ if (sql_type & (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL |
+ SPIDER_SQL_TYPE_BULK_UPDATE_SQL))
+ {
+ update_rownum_appended = FALSE;
+ update_set_pos = 0;
+ update_sql.length(0);
+ }
+ if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
+ {
+ tmp_sql.length(0);
+ }
+ if (sql_type & SPIDER_SQL_TYPE_HANDLER)
+ {
+ ha_sql.length(0);
+ }
+ DBUG_RETURN(0);
+}
+
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+int spider_oracle_handler::reset_keys(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::reset_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::reset_upds(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::reset_upds");
+ DBUG_PRINT("info",("spider this=%p", this));
+ hs_upds.clear();
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::reset_strs(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::reset_strs");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::reset_strs_pos(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::reset_strs_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::push_back_upds(
+ SPIDER_HS_STRING_REF &info
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_handler::push_back_upds");
+ DBUG_PRINT("info",("spider this=%p", this));
+ error_num = hs_upds.push_back(info);
+ DBUG_RETURN(error_num);
+}
+#endif
+
+bool spider_oracle_handler::need_lock_before_set_sql_for_exec(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::need_lock_before_set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+int spider_oracle_handler::set_sql_for_exec(
+ ulong sql_type,
+ int link_idx
+) {
+ int error_num;
+ uint tmp_pos;
+ SPIDER_SHARE *share = spider->share;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ int all_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_oracle_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & (SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL))
+ {
+ if (table_lock_mode)
+ {
+ spider_string *str = &result_list->insert_sqls[link_idx];
+ str->length(0);
+ if (str->reserve(SPIDER_SQL_LOCK_TABLE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
+ if ((error_num = oracle_share->append_table_name(str, all_link_idx)))
+ DBUG_RETURN(error_num);
+ if (table_lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
+ {
+ if (str->reserve(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR,
+ SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN);
+ } else if (table_lock_mode == SPIDER_LOCK_MODE_SHARED)
+ {
+ if (str->reserve(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR,
+ SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN);
+ }
+ exec_lock_sql = str;
+ }
+
+ if (oracle_share->same_db_table_name || link_idx == first_link_idx)
+ {
+ if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
+ exec_sql = &sql;
+ if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
+ exec_tmp_sql = &tmp_sql;
+ } else {
+ char tmp_table_name[MAX_FIELD_WIDTH * 2],
+ tgt_table_name[MAX_FIELD_WIDTH * 2];
+ int tmp_table_name_length;
+ spider_string tgt_table_name_str(tgt_table_name,
+ MAX_FIELD_WIDTH * 2,
+ oracle_share->db_names_str[link_idx].charset());
+ const char *table_names[2], *table_aliases[2];
+ uint table_name_lengths[2], table_alias_lengths[2];
+ tgt_table_name_str.init_calc_mem(212);
+ tgt_table_name_str.length(0);
+ if (result_list->tmp_table_join && spider->bka_mode != 2)
+ {
+ create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
+ link_idx);
+ append_table_name_with_adjusting(&tgt_table_name_str, link_idx,
+ SPIDER_SQL_TYPE_TMP_SQL);
+ table_names[0] = tmp_table_name;
+ table_names[1] = tgt_table_name_str.ptr();
+ table_name_lengths[0] = tmp_table_name_length;
+ table_name_lengths[1] = tgt_table_name_str.length();
+ table_aliases[0] = SPIDER_SQL_A_STR;
+ table_aliases[1] = SPIDER_SQL_B_STR;
+ table_alias_lengths[0] = SPIDER_SQL_A_LEN;
+ table_alias_lengths[1] = SPIDER_SQL_B_LEN;
+ }
+ if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
+ {
+ exec_sql = &result_list->sqls[link_idx];
+ if (exec_sql->copy(sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ else if (result_list->use_union)
+ {
+ if ((error_num = reset_union_table_name(exec_sql, link_idx,
+ SPIDER_SQL_TYPE_SELECT_SQL)))
+ DBUG_RETURN(error_num);
+ } else {
+ tmp_pos = exec_sql->length();
+ exec_sql->length(table_name_pos);
+ if (result_list->tmp_table_join && spider->bka_mode != 2)
+ {
+ if ((error_num = spider_db_oracle_utility.append_from_with_alias(
+ exec_sql, table_names, table_name_lengths,
+ table_aliases, table_alias_lengths, 2,
+ &table_name_pos, TRUE))
+ )
+ DBUG_RETURN(error_num);
+ exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ } else {
+ append_table_name_with_adjusting(exec_sql, link_idx,
+ SPIDER_SQL_TYPE_SELECT_SQL);
+ }
+ exec_sql->length(tmp_pos);
+ }
+ }
+ if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
+ {
+ exec_tmp_sql = &result_list->tmp_sqls[link_idx];
+ if (result_list->tmp_table_join && spider->bka_mode != 2)
+ {
+ if (exec_tmp_sql->copy(tmp_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ else {
+ tmp_pos = exec_tmp_sql->length();
+ exec_tmp_sql->length(tmp_sql_pos1);
+ exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
+ exec_tmp_sql->length(tmp_sql_pos2);
+ exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
+ exec_tmp_sql->length(tmp_sql_pos3);
+ exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
+ exec_tmp_sql->length(tmp_pos);
+ }
+ }
+ }
+ }
+ }
+ if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
+ {
+ if (oracle_share->same_db_table_name || link_idx == first_link_idx)
+ exec_insert_sql = &insert_sql;
+ else {
+ exec_insert_sql = &result_list->insert_sqls[link_idx];
+ if (exec_insert_sql->copy(insert_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_PRINT("info",("spider exec_insert_sql=%s",
+ exec_insert_sql->c_ptr_safe()));
+ tmp_pos = exec_insert_sql->length();
+ exec_insert_sql->length(insert_table_name_pos);
+ append_table_name_with_adjusting(exec_insert_sql, link_idx,
+ sql_type);
+ exec_insert_sql->length(tmp_pos);
+ DBUG_PRINT("info",("spider exec_insert_sql->length=%u",
+ exec_insert_sql->length()));
+ DBUG_PRINT("info",("spider exec_insert_sql=%s",
+ exec_insert_sql->c_ptr_safe()));
+ }
+ if (nextval_pos)
+ {
+ memcpy((uchar *) exec_insert_sql->ptr() + nextval_pos,
+ oracle_share->nextval_str[all_link_idx].ptr(),
+ oracle_share->nextval_max_length);
+ }
+ }
+ if (sql_type & SPIDER_SQL_TYPE_BULK_UPDATE_SQL)
+ {
+ if (reading_from_bulk_tmp_table)
+ {
+ if (
+ oracle_share->same_db_table_name &&
+ share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
+ ) {
+ exec_update_sql = &insert_sql;
+ } else if (!spider->result_list.upd_tmp_tbls[link_idx])
+ {
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ } else {
+ exec_update_sql = &spider->result_list.insert_sqls[link_idx];
+ if ((error_num = restore_sql_from_bulk_tmp_table(exec_update_sql,
+ spider->result_list.upd_tmp_tbls[link_idx])))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ } else {
+ if (
+ oracle_share->same_db_table_name &&
+ share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
+ ) {
+ exec_update_sql = &update_sql;
+ } else {
+ exec_update_sql = &spider->result_list.update_sqls[link_idx];
+ }
+ }
+ DBUG_PRINT("info",("spider exec_update_sql=%s",
+ exec_update_sql->c_ptr_safe()));
+ } else if (sql_type &
+ (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL))
+ {
+ if (oracle_share->same_db_table_name || link_idx == first_link_idx)
+ exec_update_sql = &update_sql;
+ else {
+ exec_update_sql = &spider->result_list.update_sqls[link_idx];
+ if (exec_update_sql->copy(update_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ tmp_pos = exec_update_sql->length();
+ exec_update_sql->length(table_name_pos);
+ append_table_name_with_adjusting(exec_update_sql, link_idx,
+ sql_type);
+ exec_update_sql->length(tmp_pos);
+ }
+ DBUG_PRINT("info",("spider exec_update_sql=%s",
+ exec_update_sql->c_ptr_safe()));
+ }
+ if (sql_type & SPIDER_SQL_TYPE_HANDLER)
+ {
+ if (spider->m_handler_id[link_idx] == ha_sql_handler_id)
+ exec_ha_sql = &ha_sql;
+ else {
+ exec_ha_sql = &result_list->sqls[link_idx];
+ if (exec_ha_sql->copy(ha_sql))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ else {
+ tmp_pos = exec_ha_sql->length();
+ exec_ha_sql->length(ha_table_name_pos);
+ append_table_name_with_adjusting(exec_ha_sql, link_idx,
+ SPIDER_SQL_TYPE_HANDLER);
+ exec_ha_sql->length(tmp_pos);
+ }
+ }
+ DBUG_PRINT("info",("spider exec_ha_sql=%s",
+ exec_ha_sql->c_ptr_safe()));
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::set_sql_for_exec(
+ spider_db_copy_table *tgt_ct,
+ ulong sql_type
+) {
+ spider_oracle_copy_table *oracle_ct = (spider_oracle_copy_table *) tgt_ct;
+ DBUG_ENTER("spider_oracle_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ exec_insert_sql = &oracle_ct->sql;
+ break;
+ default:
+ DBUG_ASSERT(0);
+ break;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::execute_sql(
+ ulong sql_type,
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+) {
+ spider_string *tgt_sql;
+ uint tgt_length;
+ DBUG_ENTER("spider_oracle_handler::execute_sql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
+ tgt_sql = exec_sql;
+ tgt_length = tgt_sql->length();
+ if (table_lock_mode)
+ {
+ DBUG_PRINT("info",("spider table_lock_mode=%d", table_lock_mode));
+ spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
+ db_conn->table_lock_mode = table_lock_mode;
+ db_conn->exec_lock_sql = exec_lock_sql;
+ table_lock_mode = 0;
+ }
+ break;
+ case SPIDER_SQL_TYPE_INSERT_SQL:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
+ tgt_sql = exec_insert_sql;
+ tgt_length = tgt_sql->length();
+ break;
+ case SPIDER_SQL_TYPE_UPDATE_SQL:
+ case SPIDER_SQL_TYPE_DELETE_SQL:
+ case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
+ DBUG_PRINT("info",("spider %s",
+ sql_type == SPIDER_SQL_TYPE_UPDATE_SQL ? "SPIDER_SQL_TYPE_UPDATE_SQL" :
+ sql_type == SPIDER_SQL_TYPE_DELETE_SQL ? "SPIDER_SQL_TYPE_DELETE_SQL" :
+ "SPIDER_SQL_TYPE_BULK_UPDATE_SQL"
+ ));
+ tgt_sql = exec_update_sql;
+ tgt_length = tgt_sql->length();
+ break;
+ case SPIDER_SQL_TYPE_TMP_SQL:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_TMP_SQL"));
+ tgt_sql = exec_tmp_sql;
+ tgt_length = tgt_sql->length();
+ break;
+ case SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL"));
+ tgt_sql = exec_tmp_sql;
+ tgt_length = tmp_sql_pos5;
+ break;
+ case SPIDER_SQL_TYPE_HANDLER:
+ DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_HANDLER"));
+ tgt_sql = exec_ha_sql;
+ tgt_length = tgt_sql->length();
+ break;
+ default:
+ /* nothing to do */
+ DBUG_PRINT("info",("spider default"));
+ DBUG_RETURN(0);
+ }
+ DBUG_RETURN(spider_db_query(
+ conn,
+ tgt_sql->ptr(),
+ tgt_length,
+ quick_mode,
+ need_mon
+ ));
+}
+
+int spider_oracle_handler::reset()
+{
+ DBUG_ENTER("spider_oracle_handler::reset");
+ DBUG_PRINT("info",("spider this=%p", this));
+ update_sql.length(0);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::sts_mode_exchange(
+ int sts_mode
+) {
+ DBUG_ENTER("spider_oracle_handler::sts_mode_exchange");
+ DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
+ DBUG_RETURN(1);
+}
+
+int spider_oracle_handler::show_table_status(
+ int link_idx,
+ int sts_mode,
+ uint flag
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_DB_RESULT *res;
+ SPIDER_SHARE *share = spider->share;
+ uint pos = (2 * spider->conn_link_idx[link_idx]);
+ DBUG_ENTER("spider_oracle_handler::show_table_status");
+ DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
+ if (
+ (flag & HA_STATUS_AUTO) &&
+ (error_num = show_autoinc(link_idx))
+ ) {
+ DBUG_RETURN(error_num);
+ }
+
+ if (sts_mode == 1)
+ {
+/*
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ oracle_share->show_table_status[0 + pos].ptr(),
+ oracle_share->show_table_status[0 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+*/
+ /* retry */
+/*
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ oracle_share->show_table_status[0 + pos].ptr(),
+ oracle_share->show_table_status[0 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ DBUG_RETURN(error_num);
+ else {
+ my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
+ ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
+ oracle_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
+ oracle_share->table_names_str[spider->conn_link_idx[
+ link_idx]].ptr());
+ DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
+ }
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ error_num = res->fetch_table_status(
+ sts_mode,
+ share->records,
+ share->mean_rec_length,
+ share->data_file_length,
+ share->max_data_file_length,
+ share->index_file_length,
+ share->auto_increment_value,
+ share->create_time,
+ share->update_time,
+ share->check_time
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ DBUG_RETURN(error_num);
+*/
+ if (!share->records)
+ share->records = 10000;
+ share->mean_rec_length = 65535;
+ share->data_file_length = 65535;
+ share->max_data_file_length = 65535;
+ share->index_file_length = 65535;
+/*
+ share->auto_increment_value = 0;
+*/
+ share->create_time = (time_t) 0;
+ share->update_time = (time_t) 0;
+ share->check_time = (time_t) 0;
+ } else {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ oracle_share->show_table_status[1 + pos].ptr(),
+ oracle_share->show_table_status[1 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ oracle_share->show_table_status[1 + pos].ptr(),
+ oracle_share->show_table_status[1 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ DBUG_RETURN(error_num);
+ else
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ error_num = res->fetch_table_status(
+ sts_mode,
+ share->records,
+ share->mean_rec_length,
+ share->data_file_length,
+ share->max_data_file_length,
+ share->index_file_length,
+ share->auto_increment_value,
+ share->create_time,
+ share->update_time,
+ share->check_time
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::crd_mode_exchange(
+ int crd_mode
+) {
+ DBUG_ENTER("spider_oracle_handler::crd_mode_exchange");
+ DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
+ DBUG_RETURN(1);
+}
+
+int spider_oracle_handler::show_index(
+ int link_idx,
+ int crd_mode
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_SHARE *share = spider->share;
+ TABLE *table = spider->get_table();
+ SPIDER_DB_RESULT *res;
+ int roop_count;
+ longlong *tmp_cardinality;
+ uint pos = (2 * spider->conn_link_idx[link_idx]);
+ DBUG_ENTER("spider_oracle_handler::show_index");
+ DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
+ if (crd_mode == 1)
+ {
+/*
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ oracle_share->show_index[0 + pos].ptr(),
+ oracle_share->show_index[0 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+*/
+ /* retry */
+/*
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ oracle_share->show_index[0 + pos].ptr(),
+ oracle_share->show_index[0 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+*/
+ /* no record is ok */
+/*
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ if (res)
+ {
+ error_num = res->fetch_table_cardinality(
+ crd_mode,
+ table,
+ share->cardinality,
+ share->cardinality_upd,
+ share->bitmap_size
+ );
+ }
+*/
+ for (roop_count = 0, tmp_cardinality = share->cardinality;
+ roop_count < (int) table->s->fields;
+ roop_count++, tmp_cardinality++)
+ {
+ if (!spider_bit_is_set(share->cardinality_upd, roop_count))
+ {
+ DBUG_PRINT("info",
+ ("spider init column cardinality id=%d", roop_count));
+ *tmp_cardinality = 1;
+ }
+ }
+/*
+ if (res)
+ {
+ res->free_result();
+ delete res;
+ }
+ if (error_num)
+ DBUG_RETURN(error_num);
+*/
+ } else {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ oracle_share->show_index[1 + pos].ptr(),
+ oracle_share->show_index[1 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ oracle_share->show_index[1 + pos].ptr(),
+ oracle_share->show_index[1 + pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ /* no record is ok */
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ if (res)
+ {
+ error_num = res->fetch_table_cardinality(
+ crd_mode,
+ table,
+ share->cardinality,
+ share->cardinality_upd,
+ share->bitmap_size
+ );
+ }
+ for (roop_count = 0, tmp_cardinality = share->cardinality;
+ roop_count < (int) table->s->fields;
+ roop_count++, tmp_cardinality++)
+ {
+ if (!spider_bit_is_set(share->cardinality_upd, roop_count))
+ {
+ DBUG_PRINT("info",
+ ("spider init column cardinality id=%d", roop_count));
+ *tmp_cardinality = 1;
+ }
+ }
+ if (res)
+ {
+ res->free_result();
+ delete res;
+ }
+ if (error_num)
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::show_records(
+ int link_idx
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_DB_RESULT *res;
+ SPIDER_SHARE *share = spider->share;
+ uint pos = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_oracle_handler::show_records");
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ oracle_share->show_records[pos].ptr(),
+ oracle_share->show_records[pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ oracle_share->show_records[pos].ptr(),
+ oracle_share->show_records[pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
+ DBUG_RETURN(error_num);
+ } else {
+ DBUG_PRINT("info", ("spider error_num=%d 6",
+ ER_QUERY_ON_FOREIGN_DATA_SOURCE));
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ error_num = res->fetch_table_records(
+ 1,
+ spider->table_rows
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider->trx->direct_aggregate_count++;
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::show_autoinc(
+ int link_idx
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_DB_RESULT *res;
+ SPIDER_SHARE *share = spider->share;
+ uint pos = spider->conn_link_idx[link_idx];
+ ulonglong auto_increment_value;
+ DBUG_ENTER("spider_oracle_handler::show_autoinc");
+ if (!oracle_share->show_autoinc)
+ DBUG_RETURN(0);
+
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ oracle_share->show_autoinc[pos].ptr(),
+ oracle_share->show_autoinc[pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ oracle_share->show_records[pos].ptr(),
+ oracle_share->show_records[pos].length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
+ DBUG_RETURN(error_num);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
+ DBUG_RETURN(error_num);
+ } else {
+ DBUG_PRINT("info", ("spider error_num=%d 6",
+ ER_QUERY_ON_FOREIGN_DATA_SOURCE));
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ error_num = res->fetch_table_records(
+ 1,
+ auto_increment_value
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if (auto_increment_value >= share->auto_increment_value)
+ {
+ share->auto_increment_value = auto_increment_value + 1;
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::show_last_insert_id(
+ int link_idx,
+ ulonglong &last_insert_id
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_DB_RESULT *res;
+ uint pos = spider->conn_link_idx[link_idx];
+ spider_db_oracle *db_oracle = (spider_db_oracle *) conn->db_conn;
+ DBUG_ENTER("spider_oracle_handler::show_last_insert_id");
+ if (!oracle_share->show_last_insert_id)
+ {
+ DBUG_ASSERT(0);
+ last_insert_id = 0;
+ db_oracle->stored_last_insert_id = 0;
+ DBUG_RETURN(0);
+ }
+
+ if (
+ spider_db_query(
+ conn,
+ oracle_share->show_last_insert_id[pos].ptr(),
+ oracle_share->show_last_insert_id[pos].length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ ) {
+ DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
+ DBUG_RETURN(error_num);
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
+ DBUG_RETURN(error_num);
+ } else {
+ DBUG_PRINT("info", ("spider error_num=%d 6",
+ ER_QUERY_ON_FOREIGN_DATA_SOURCE));
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ }
+ error_num = res->fetch_table_records(
+ 1,
+ last_insert_id
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
+ DBUG_RETURN(error_num);
+ }
+ db_oracle->stored_last_insert_id = last_insert_id;
+ DBUG_RETURN(0);
+}
+
+ha_rows spider_oracle_handler::explain_select(
+ key_range *start_key,
+ key_range *end_key,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ spider_string *str = &result_list->sqls[link_idx];
+ SPIDER_DB_RESULT *res;
+ ha_rows rows;
+ spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
+ DBUG_ENTER("spider_oracle_handler::explain_select");
+ if ((error_num = dbton_hdl->append_explain_select_part(
+ start_key, end_key, SPIDER_SQL_TYPE_OTHER_SQL, link_idx)))
+ {
+ my_errno = error_num;
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_queue_connect_rewrite(spider->share, conn, link_idx);
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ spider->share);
+ if (
+ (error_num = spider_db_set_names(spider, conn, link_idx)) ||
+ (
+ spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx]) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping(spider, conn, link_idx)))
+ {
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ spider->share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ error_num = spider_db_errorno(conn);
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ } else {
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ }
+ 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 = 1;
+ request_key.next = NULL;
+ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
+ {
+ if (error_num || (error_num = spider_db_errorno(conn)))
+ {
+ if (spider->check_error_mode(error_num))
+ my_errno = error_num;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ } else {
+ my_errno = ER_QUERY_ON_FOREIGN_DATA_SOURCE;
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ error_num = res->fetch_table_records(
+ 2,
+ rows
+ );
+ res->free_result();
+ delete res;
+ if (error_num)
+ {
+ my_errno = error_num;
+ DBUG_RETURN(HA_POS_ERROR);
+ }
+ DBUG_RETURN(rows);
+}
+
+int spider_oracle_handler::lock_tables(
+ int link_idx
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ spider_string *str = &sql;
+ DBUG_ENTER("spider_oracle_handler::lock_tables");
+ do {
+ str->length(0);
+ if ((error_num = conn->db_conn->append_lock_tables(str)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->length())
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ spider->share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ if (!conn->table_locked)
+ {
+ conn->table_locked = TRUE;
+ spider->trx->locked_connections++;
+ }
+ } while (str->length());
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::unlock_tables(
+ int link_idx
+) {
+ int error_num;
+ SPIDER_CONN *conn = spider->conns[link_idx];
+ DBUG_ENTER("spider_oracle_handler::unlock_tables");
+ if (conn->table_locked)
+ {
+ if ((error_num = conn->db_conn->commit(&spider->need_mons[link_idx])))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::disable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_oracle_handler::disable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_disable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::enable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_oracle_handler::enable_keys");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_enable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::check_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_oracle_handler::check_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_check_table_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx, check_opt)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::repair_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_oracle_handler::repair_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_repair_table_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx, check_opt)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::analyze_table(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_oracle_handler::analyze_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_analyze_table_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::optimize_table(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_oracle_handler::optimize_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_optimize_table_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = &spider->need_mons[link_idx];
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
+ {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::flush_tables(
+ SPIDER_CONN *conn,
+ int link_idx,
+ bool lock
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ spider_string *str = &spider->result_list.sqls[link_idx];
+ DBUG_ENTER("spider_oracle_handler::flush_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ str->length(0);
+ if ((error_num = append_flush_tables_part(SPIDER_SQL_TYPE_OTHER_HS,
+ link_idx, lock)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ str->ptr(),
+ str->length(),
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::flush_logs(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ int error_num;
+ SPIDER_SHARE *share = spider->share;
+ DBUG_ENTER("spider_oracle_handler::flush_logs");
+ DBUG_PRINT("info",("spider this=%p", this));
+ spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ SPIDER_SQL_FLUSH_LOGS_STR,
+ SPIDER_SQL_FLUSH_LOGS_LEN,
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ error_num = spider_db_errorno(conn);
+ DBUG_RETURN(error_num);
+ }
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::insert_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ spider_db_oracle *db_conn = (spider_db_oracle *) 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_oracle_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_oracle_handler::delete_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
+ uint roop_count, elements = db_conn->handler_open_array.elements;
+ SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
+ DBUG_ENTER("spider_oracle_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_oracle_handler::sync_from_clone_source(
+ spider_db_handler *dbton_hdl
+) {
+ DBUG_ENTER("spider_oracle_handler::sync_from_clone_source");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+bool spider_oracle_handler::support_use_handler(
+ int use_handler
+) {
+ DBUG_ENTER("spider_oracle_handler::support_use_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(FALSE);
+}
+
+void spider_oracle_handler::minimum_select_bitmap_create()
+{
+ TABLE *table = spider->get_table();
+ Field **field_p;
+ DBUG_ENTER("spider_oracle_handler::minimum_select_bitmap_create");
+ memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
+ if (
+ spider->has_clone_for_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_oracle_handler::minimum_select_bit_is_set(
+ uint field_index
+) {
+ DBUG_ENTER("spider_oracle_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_oracle_handler::copy_minimum_select_bitmap(
+ uchar *bitmap
+) {
+ int roop_count;
+ TABLE *table = spider->get_table();
+ DBUG_ENTER("spider_oracle_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_oracle_handler::init_union_table_name_pos()
+{
+ DBUG_ENTER("spider_oracle_handler::init_union_table_name_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!union_table_name_pos_first)
+ {
+ if (!spider_bulk_malloc(spider_current_trx, 238, MYF(MY_WME),
+ &union_table_name_pos_first, sizeof(SPIDER_INT_HLD),
+ NullS)
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ union_table_name_pos_first->next = NULL;
+ }
+ union_table_name_pos_current = union_table_name_pos_first;
+ union_table_name_pos_current->tgt_num = 0;
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::set_union_table_name_pos()
+{
+ DBUG_ENTER("spider_oracle_handler::set_union_table_name_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE)
+ {
+ if (!union_table_name_pos_current->next)
+ {
+ if (!spider_bulk_malloc(spider_current_trx, 239, MYF(MY_WME),
+ &union_table_name_pos_current->next, sizeof(SPIDER_INT_HLD),
+ NullS)
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ union_table_name_pos_current->next->next = NULL;
+ }
+ union_table_name_pos_current = union_table_name_pos_current->next;
+ union_table_name_pos_current->tgt_num = 0;
+ }
+ union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] =
+ table_name_pos;
+ ++union_table_name_pos_current->tgt_num;
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::reset_union_table_name(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_oracle_handler::reset_union_table_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!union_table_name_pos_current)
+ DBUG_RETURN(0);
+
+ SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
+ uint cur_num, pos_backup = str->length();
+ while(TRUE)
+ {
+ for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num)
+ {
+ str->length(tmp_pos->tgt[cur_num]);
+ append_table_name_with_adjusting(str, link_idx, sql_type);
+ }
+ if (tmp_pos == union_table_name_pos_current)
+ break;
+ tmp_pos = tmp_pos->next;
+ }
+ str->length(pos_backup);
+ DBUG_RETURN(0);
+}
+
+spider_oracle_copy_table::spider_oracle_copy_table(
+ spider_oracle_share *db_share
+) : spider_db_copy_table(
+ db_share
+),
+ oracle_share(db_share),
+ pos(0),
+ table_name_pos(0),
+ pos_diff(0),
+ table_lock_mode(0),
+ select_rownum_appended(FALSE),
+ first_str(NULL),
+ current_str(NULL)
+{
+ DBUG_ENTER("spider_oracle_copy_table::spider_oracle_copy_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_oracle_copy_table::~spider_oracle_copy_table()
+{
+ DBUG_ENTER("spider_oracle_copy_table::~spider_oracle_copy_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ while (first_str)
+ {
+ current_str = first_str;
+ first_str = first_str->next;
+ delete [] current_str;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_copy_table::init()
+{
+ DBUG_ENTER("spider_oracle_copy_table::init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.init_calc_mem(213);
+ sql_part.init_calc_mem(215);
+ DBUG_RETURN(0);
+}
+
+void spider_oracle_copy_table::set_sql_charset(
+ CHARSET_INFO *cs
+) {
+ DBUG_ENTER("spider_oracle_copy_table::set_sql_charset");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.set_charset(cs);
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_copy_table::append_select_str()
+{
+ DBUG_ENTER("spider_oracle_copy_table::append_select_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_SELECT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_insert_str(
+ int insert_flg
+) {
+ DBUG_ENTER("spider_oracle_copy_table::append_insert_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_INSERT_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_table_columns(
+ TABLE_SHARE *table_share
+) {
+ int error_num;
+ Field **field;
+ DBUG_ENTER("spider_oracle_copy_table::append_table_columns");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (field = table_share->field; *field; field++)
+ {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql,
+ (char *) (*field)->field_name, spider_dbton_oracle.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_from_str()
+{
+ DBUG_ENTER("spider_oracle_copy_table::append_from_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_table_name(
+ int link_idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_copy_table::append_table_name");
+ DBUG_PRINT("info",("spider this=%p", this));
+ table_name_pos = sql.length();
+ error_num = oracle_share->append_table_name(&sql, link_idx);
+ store_link_idx = link_idx;
+ DBUG_RETURN(error_num);
+}
+
+void spider_oracle_copy_table::set_sql_pos()
+{
+ DBUG_ENTER("spider_oracle_copy_table::set_sql_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ pos = sql.length();
+ DBUG_VOID_RETURN;
+}
+
+void spider_oracle_copy_table::set_sql_to_pos()
+{
+ DBUG_ENTER("spider_oracle_copy_table::set_sql_to_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ sql.length(pos);
+ DBUG_VOID_RETURN;
+}
+
+int spider_oracle_copy_table::append_copy_where(
+ spider_db_copy_table *source_ct,
+ KEY *key_info,
+ ulong *last_row_pos,
+ ulong *last_lengths
+) {
+ int error_num, roop_count, roop_count2;
+ DBUG_ENTER("spider_oracle_copy_table::append_copy_where");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ Field *field;
+ KEY_PART_INFO *key_part = key_info->key_part;
+ for (roop_count = spider_user_defined_key_parts(key_info) - 1;
+ roop_count >= 0; roop_count--)
+ {
+ for (roop_count2 = 0; roop_count2 < roop_count; roop_count2++)
+ {
+ field = key_part[roop_count2].field;
+ if ((error_num = copy_key_row(source_ct,
+ field, &last_row_pos[field->field_index],
+ &last_lengths[field->field_index],
+ SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ field = key_part[roop_count2].field;
+ if ((error_num = copy_key_row(source_ct,
+ field, &last_row_pos[field->field_index],
+ &last_lengths[field->field_index],
+ SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ sql.length(sql.length() - SPIDER_SQL_AND_LEN);
+ if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
+ SPIDER_SQL_OR_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+ sql.q_append(SPIDER_SQL_OR_STR, SPIDER_SQL_OR_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ sql.length(sql.length() - SPIDER_SQL_OR_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_key_order_str(
+ KEY *key_info,
+ int start_pos,
+ bool desc_flg
+) {
+ int length, error_num;
+ KEY_PART_INFO *key_part;
+ Field *field;
+ DBUG_ENTER("spider_oracle_copy_table::append_key_order_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (select_rownum_appended)
+ {
+ if (sql.reserve(SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+ DBUG_RETURN(0);
+ }
+ sql_part.length(0);
+ if (sql_part.reserve(sql.length() + SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN +
+ SPIDER_SQL_ROW_NUMBER_HEAD_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_HEAD_STR,
+ SPIDER_SQL_SELECT_WRAPPER_HEAD_LEN);
+ sql_part.q_append(sql.ptr(), table_name_pos - SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_HEAD_STR,
+ SPIDER_SQL_ROW_NUMBER_HEAD_LEN);
+ if ((int) spider_user_defined_key_parts(key_info) > start_pos)
+ {
+ if (desc_flg == TRUE)
+ {
+ for (
+ key_part = key_info->key_part + start_pos,
+ length = 0;
+ length + start_pos < (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql_part,
+ (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN +
+ SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ } else {
+ for (
+ key_part = key_info->key_part + start_pos,
+ length = 0;
+ length + start_pos < (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql_part,
+ (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN +
+ SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ sql_part.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (sql_part.reserve(SPIDER_SQL_NAME_QUOTE_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ sql_part.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ }
+ }
+ if (desc_flg == TRUE)
+ {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + sql.length() - table_name_pos +
+ SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_DESC_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_DESC_TAIL_LEN);
+ } else {
+ if (sql_part.reserve(SPIDER_SQL_ROW_NUMBER_TAIL_LEN +
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN + sql.length() - table_name_pos +
+ SPIDER_SQL_FROM_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_ROW_NUMBER_TAIL_STR,
+ SPIDER_SQL_ROW_NUMBER_TAIL_LEN);
+ }
+ pos_diff = sql_part.length() + SPIDER_SQL_FROM_LEN - table_name_pos;
+ sql_part.q_append(sql.ptr() + table_name_pos - SPIDER_SQL_FROM_LEN,
+ sql.length() - table_name_pos + SPIDER_SQL_FROM_LEN);
+ sql_part.q_append(SPIDER_SQL_SELECT_WRAPPER_TAIL_STR,
+ SPIDER_SQL_SELECT_WRAPPER_TAIL_LEN);
+
+ if ((int) spider_user_defined_key_parts(key_info) > start_pos)
+ {
+ if (sql.reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ if (desc_flg == TRUE)
+ {
+ for (
+ key_part = key_info->key_part + start_pos,
+ length = 0;
+ length + start_pos < (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql,
+ (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ } else {
+ for (
+ key_part = key_info->key_part + start_pos,
+ length = 0;
+ length + start_pos < (int) spider_user_defined_key_parts(key_info);
+ key_part++,
+ length++
+ ) {
+ field = key_part->field;
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql,
+ (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
+ SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ }
+ sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_limit(
+ longlong offset,
+ longlong limit
+) {
+ char buf[SPIDER_LONGLONG_LEN + 1];
+ uint32 length;
+ DBUG_ENTER("spider_oracle_copy_table::append_limit");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (offset || limit < 9223372036854775807LL)
+ {
+ if (!select_rownum_appended)
+ {
+ select_rownum_appended = TRUE;
+ table_name_pos = table_name_pos + pos_diff;
+ if (sql.copy(sql_part))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ pos = pos + pos_diff;
+ }
+ if (offset)
+ {
+ if (sql.reserve(SPIDER_SQL_BETWEEN_LEN + SPIDER_SQL_AND_LEN +
+ ((SPIDER_LONGLONG_LEN) * 2)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_BETWEEN_STR, SPIDER_SQL_BETWEEN_LEN);
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
+ sql.q_append(buf, length);
+ sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
+ sql.q_append(buf, length);
+ } else {
+ if (sql.reserve(SPIDER_SQL_HS_LTEQUAL_LEN +
+ (SPIDER_LONGLONG_LEN)))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_HS_LTEQUAL_STR, SPIDER_SQL_HS_LTEQUAL_LEN);
+ length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
+ &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
+ sql.q_append(buf, length);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_into_str()
+{
+ DBUG_ENTER("spider_oracle_copy_table::append_into_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_INTO_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_open_paren_str()
+{
+ DBUG_ENTER("spider_oracle_copy_table::append_open_paren_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_values_str()
+{
+ DBUG_ENTER("spider_oracle_copy_table::append_values_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
+ sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_select_lock_str(
+ int lock_mode
+) {
+ DBUG_ENTER("spider_oracle_copy_table::append_select_lock_str");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (select_rownum_appended)
+ {
+ int error_num;
+ table_lock_mode = lock_mode;
+ sql_part.length(0);
+ if (sql_part.reserve(SPIDER_SQL_LOCK_TABLE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
+ if ((error_num = oracle_share->append_table_name(&sql_part,
+ store_link_idx)))
+ DBUG_RETURN(error_num);
+ if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
+ {
+ if (sql_part.reserve(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR,
+ SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN);
+ } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
+ {
+ if (sql_part.reserve(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql_part.q_append(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR,
+ SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN);
+ }
+ } else {
+ if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
+ {
+ if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
+ } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
+ {
+ if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::exec_query(
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+) {
+ int error_num = 0;
+ DBUG_ENTER("spider_oracle_copy_table::exec_query");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (current_str)
+ {
+ spider_string *tmp_str = first_str;
+ while (tmp_str && tmp_str != current_str)
+ {
+ if (
+ (error_num = spider_db_query(conn, tmp_str->ptr(), tmp_str->length(),
+ quick_mode, need_mon)) &&
+ error_num != HA_ERR_FOUND_DUPP_KEY
+ ) {
+ break;
+ }
+ tmp_str = tmp_str->next;
+ }
+ if (tmp_str == current_str)
+ {
+ error_num = spider_db_query(conn, tmp_str->ptr(), tmp_str->length(),
+ quick_mode, need_mon);
+ }
+ if (error_num == HA_ERR_FOUND_DUPP_KEY)
+ error_num = 0;
+ current_str = NULL;
+ } else {
+ if (table_lock_mode)
+ {
+ DBUG_PRINT("info",("spider table_lock_mode=%d", table_lock_mode));
+ spider_db_oracle *db_conn = (spider_db_oracle *) conn->db_conn;
+ db_conn->table_lock_mode = table_lock_mode;
+ db_conn->exec_lock_sql = &sql_part;
+ table_lock_mode = 0;
+ }
+ error_num = spider_db_query(conn, sql.ptr(), sql.length(), quick_mode,
+ need_mon);
+ }
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_copy_table::copy_key_row(
+ spider_db_copy_table *source_ct,
+ Field *field,
+ ulong *row_pos,
+ ulong *length,
+ const char *joint_str,
+ const int joint_length
+) {
+ int error_num;
+ spider_string *source_str = &((spider_oracle_copy_table *) source_ct)->sql;
+ DBUG_ENTER("spider_oracle_copy_table::copy_key_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ if ((error_num = spider_db_append_name_with_quote_str(&sql,
+ (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length +
+ SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
+ sql.q_append(joint_str, joint_length);
+ sql.q_append(source_str->ptr() + *row_pos, *length);
+ sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::copy_row(
+ Field *field,
+ SPIDER_DB_ROW *row
+) {
+ int error_num;
+ DBUG_ENTER("spider_oracle_copy_table::copy_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (row->is_null())
+ {
+ DBUG_PRINT("info",("spider column is null"));
+ if (current_str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ current_str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
+ } else if (field->str_needs_quotes())
+ {
+ DBUG_PRINT("info",("spider str_needs_quotes"));
+ if (current_str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ current_str->q_append(SPIDER_SQL_VALUE_QUOTE_STR,
+ SPIDER_SQL_VALUE_QUOTE_LEN);
+ if ((error_num = row->append_escaped_to_str(current_str,
+ spider_dbton_oracle.dbton_id)))
+ DBUG_RETURN(error_num);
+ if (current_str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN +
+ SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ current_str->q_append(SPIDER_SQL_VALUE_QUOTE_STR,
+ SPIDER_SQL_VALUE_QUOTE_LEN);
+ } else {
+ DBUG_PRINT("info",("spider without_quotes"));
+ if ((error_num = row->append_to_str(current_str)))
+ DBUG_RETURN(error_num);
+ if (current_str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ current_str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::copy_rows(
+ TABLE *table,
+ SPIDER_DB_ROW *row,
+ ulong **last_row_pos,
+ ulong **last_lengths
+) {
+ int error_num;
+ Field **field;
+ ulong *lengths2, *row_pos2;
+ DBUG_ENTER("spider_oracle_copy_table::copy_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!current_str)
+ {
+ if (!first_str)
+ {
+ if (!(first_str = new spider_string[1]))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ first_str->init_calc_mem(216);
+ first_str->set_charset(sql.charset());
+ if (first_str->reserve(sql.length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ first_str->q_append(sql.ptr(), sql.length());
+ } else {
+ first_str->length(sql.length());
+ }
+ current_str = first_str;
+ } else {
+ if (!current_str->next)
+ {
+ if (!(current_str->next = new spider_string[1]))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ current_str->next->init_calc_mem(217);
+ current_str->next->set_charset(sql.charset());
+ if (current_str->next->reserve(sql.length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ current_str->next->q_append(sql.ptr(), sql.length());
+ } else {
+ current_str->next->length(sql.length());
+ }
+ current_str = current_str->next;
+ }
+ row_pos2 = *last_row_pos;
+ lengths2 = *last_lengths;
+
+ for (
+ field = table->field;
+ *field;
+ field++,
+ lengths2++
+ ) {
+ *row_pos2 = current_str->length();
+ if ((error_num =
+ copy_row(*field, row)))
+ DBUG_RETURN(error_num);
+ *lengths2 = current_str->length() - *row_pos2 - SPIDER_SQL_COMMA_LEN;
+ row->next();
+ row_pos2++;
+ }
+ current_str->length(current_str->length() - SPIDER_SQL_COMMA_LEN);
+ if (current_str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ current_str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ DBUG_PRINT("info",("spider current_str=%s", current_str->c_ptr_safe()));
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::copy_rows(
+ TABLE *table,
+ SPIDER_DB_ROW *row
+) {
+ int error_num;
+ Field **field;
+ DBUG_ENTER("spider_oracle_copy_table::copy_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!current_str)
+ {
+ if (!first_str)
+ {
+ if (!(first_str = new spider_string[1]))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ first_str->init_calc_mem(218);
+ first_str->set_charset(sql.charset());
+ if (first_str->reserve(sql.length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ first_str->q_append(sql.ptr(), sql.length());
+ } else {
+ first_str->length(sql.length());
+ }
+ current_str = first_str;
+ } else {
+ if (!current_str->next)
+ {
+ if (!(current_str->next = new spider_string[1]))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ current_str->next->init_calc_mem(219);
+ current_str->next->set_charset(sql.charset());
+ if (current_str->next->reserve(sql.length()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ current_str->next->q_append(sql.ptr(), sql.length());
+ } else {
+ current_str->next->length(sql.length());
+ }
+ current_str = current_str->next;
+ }
+
+ for (
+ field = table->field;
+ *field;
+ field++
+ ) {
+ if ((error_num =
+ copy_row(*field, row)))
+ DBUG_RETURN(error_num);
+ row->next();
+ }
+ current_str->length(current_str->length() - SPIDER_SQL_COMMA_LEN);
+ if (current_str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ current_str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
+ SPIDER_SQL_CLOSE_PAREN_LEN);
+ DBUG_PRINT("info",("spider current_str=%s", current_str->c_ptr_safe()));
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::append_insert_terminator()
+{
+ DBUG_ENTER("spider_oracle_copy_table::append_insert_terminator");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_copy_table::copy_insert_values(
+ spider_db_copy_table *source_ct
+) {
+ spider_oracle_copy_table *tmp_ct = (spider_oracle_copy_table *) source_ct;
+ spider_string *source_str = &tmp_ct->sql;
+ int values_length = source_str->length() - tmp_ct->pos;
+ const char *values_ptr = source_str->ptr() + tmp_ct->pos;
+ DBUG_ENTER("spider_oracle_copy_table::copy_insert_values");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql.reserve(values_length))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ sql.q_append(values_ptr, values_length);
+ DBUG_RETURN(0);
+}
+#endif
diff --git a/storage/spider/spd_db_oracle.h b/storage/spider/spd_db_oracle.h
index 7b43b9d5e0b..122effd4762 100644
--- a/storage/spider/spd_db_oracle.h
+++ b/storage/spider/spd_db_oracle.h
@@ -1,1468 +1,1477 @@
-/* Copyright (C) 2012-2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-class spider_db_oracle;
-class spider_db_oracle_result;
-
-class spider_db_oracle_util: public spider_db_util
-{
-public:
- spider_db_oracle_util();
- ~spider_db_oracle_util();
- int append_name(
- spider_string *str,
- const char *name,
- uint name_length
- );
- int append_name_with_charset(
- spider_string *str,
- const char *name,
- uint name_length,
- CHARSET_INFO *name_charset
- );
- bool is_name_quote(
- const char head_code
- );
- int append_escaped_name_quote(
- spider_string *str
- );
- int append_column_value(
- ha_spider *spider,
- spider_string *str,
- Field *field,
- const uchar *new_ptr,
- CHARSET_INFO *access_charset
- );
- int append_from_with_alias(
- spider_string *str,
- const char **table_names,
- uint *table_name_lengths,
- const char **table_aliases,
- uint *table_alias_lengths,
- uint table_count,
- int *table_name_pos,
- bool over_write
- );
- int append_trx_isolation(
- spider_string *str,
- int trx_isolation
- );
- int append_autocommit(
- spider_string *str,
- bool autocommit
- );
- int append_sql_log_off(
- spider_string *str,
- bool sql_log_off
- );
- int append_time_zone(
- spider_string *str,
- Time_zone *time_zone
- );
- int append_start_transaction(
- spider_string *str
- );
- int append_xa_start(
- spider_string *str,
- XID *xid
- );
- int append_lock_table_head(
- spider_string *str
- );
- int 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
- );
- int append_lock_table_tail(
- spider_string *str
- );
- int append_unlock_table(
- spider_string *str
- );
- int open_item_func(
- Item_func *item_func,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int open_item_sum_func(
- Item_sum *item_sum,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#endif
- size_t escape_string(
- char *to,
- const char *from,
- size_t from_length,
- CHARSET_INFO *access_charset
- );
- int append_escaped_util(
- spider_string *to,
- String *from
- );
-};
-
-class spider_db_oracle_row: public spider_db_row
-{
-public:
- spider_db_oracle *db_conn;
- spider_db_oracle_result *result;
- sb2 *ind;
- char **val;
- ub2 *rlen;
- sb2 *ind_first;
- char **val_first;
- ub2 *rlen_first;
- spider_string *val_str;
- spider_string *val_str_first;
- OCIDefine **defnp;
- OCILobLocator **lobhp;
- OCIParam **colhp;
- ub2 *coltp;
- ub2 *colsz;
- uint field_count;
- ulong *row_size;
- ulong *row_size_first;
- CHARSET_INFO *access_charset;
- bool cloned;
- spider_db_oracle_util util;
-
- spider_db_oracle_row();
- ~spider_db_oracle_row();
- int store_to_field(
- Field *field,
- CHARSET_INFO *access_charset
- );
- int append_to_str(
- spider_string *str
- );
- int append_escaped_to_str(
- spider_string *str,
- uint dbton_id
- );
- void first();
- void next();
- bool is_null();
- int val_int();
- double val_real();
- my_decimal *val_decimal(
- my_decimal *decimal_value,
- CHARSET_INFO *access_charset
- );
- SPIDER_DB_ROW *clone();
- int store_to_tmp_table(
- TABLE *tmp_table,
- spider_string *str
- );
- /* for oracle */
- int init();
- void deinit();
- int define();
- int fetch();
-};
-
-class spider_db_oracle_result: public spider_db_result
-{
-public:
- spider_db_oracle *db_conn;
- OCIStmt *stmtp;
- uint field_count;
- CHARSET_INFO *access_charset;
- bool fetched;
- spider_db_oracle_row row;
- int store_error_num;
-
- spider_db_oracle_result();
- ~spider_db_oracle_result();
- bool has_result();
- void free_result();
- SPIDER_DB_ROW *current_row();
- SPIDER_DB_ROW *fetch_row();
- SPIDER_DB_ROW *fetch_row_from_result_buffer(
- spider_db_result_buffer *spider_res_buf
- );
- SPIDER_DB_ROW *fetch_row_from_tmp_table(
- TABLE *tmp_table
- );
- int fetch_table_status(
- int mode,
- ha_rows &records,
- ulong &mean_rec_length,
- ulonglong &data_file_length,
- ulonglong &max_data_file_length,
- ulonglong &index_file_length,
- ulonglong &auto_increment_value,
- time_t &create_time,
- time_t &update_time,
- time_t &check_time
- );
- int fetch_table_records(
- int mode,
- ha_rows &records
- );
- int fetch_table_cardinality(
- int mode,
- TABLE *table,
- longlong *cardinality,
- uchar *cardinality_upd,
- int bitmap_size
- );
- int fetch_table_mon_status(
- int &status
- );
- longlong num_rows();
- uint num_fields();
- void move_to_pos(
- longlong pos
- );
- int get_errno();
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
- int fetch_columns_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
- );
- int fetch_index_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
- );
-#endif
- /* for oracle */
- int set_column_info();
-};
-
-class spider_db_oracle: public spider_db_conn
-{
-public:
- OCIEnv *envhp;
- OCIError *errhp;
- OCIServer *srvhp;
- OCISvcCtx *svchp;
- OCISession *usrhp;
- OCIStmt *stmtp;
- OCITrans *txnhp;
- spider_db_oracle_result *result;
- int stored_error_num;
- const char *stored_error;
- uint update_rows;
- int table_lock_mode;
- spider_string *exec_lock_sql;
- spider_db_oracle_util util;
- ulonglong stored_last_insert_id;
- HASH lock_table_hash;
- bool lock_table_hash_inited;
- uint lock_table_hash_id;
- const char *lock_table_hash_func_name;
- const char *lock_table_hash_file_name;
- ulong lock_table_hash_line_no;
- DYNAMIC_ARRAY handler_open_array;
- bool handler_open_array_inited;
- uint handler_open_array_id;
- const char *handler_open_array_func_name;
- const char *handler_open_array_file_name;
- ulong handler_open_array_line_no;
-
- /* for bg_connect */
- char stored_error_msg[MYSQL_ERRMSG_SIZE];
- 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;
-
- spider_db_oracle(
- SPIDER_CONN *conn
- );
- ~spider_db_oracle();
- int init();
- bool is_connected();
- void bg_connect();
- int 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
- );
- int ping();
- void bg_disconnect();
- void disconnect();
- int set_net_timeout();
- int exec_query(
- const char *query,
- uint length,
- int quick_mode
- );
- int get_errno();
- const char *get_error();
- bool is_server_gone_error(
- int error_num
- );
- bool is_dup_entry_error(
- int error_num
- );
- bool is_xa_nota_error(
- int error_num
- );
- spider_db_result *store_result(
- spider_db_result_buffer **spider_res_buf,
- st_spider_db_request_key *request_key,
- int *error_num
- );
- spider_db_result *use_result(
- st_spider_db_request_key *request_key,
- int *error_num
- );
- int next_result();
- uint affected_rows();
- ulonglong last_insert_id();
- int set_character_set(
- const char *csname
- );
- int select_db(
- const char *dbname
- );
- int consistent_snapshot(
- int *need_mon
- );
- bool trx_start_in_bulk_sql();
- int start_transaction(
- int *need_mon
- );
- int commit(
- int *need_mon
- );
- int rollback(
- int *need_mon
- );
- bool xa_start_in_bulk_sql();
- int xa_start(
- XID *xid,
- int *need_mon
- );
- int xa_end(
- XID *xid,
- int *need_mon
- );
- int xa_prepare(
- XID *xid,
- int *need_mon
- );
- int xa_commit(
- XID *xid,
- int *need_mon
- );
- int xa_rollback(
- XID *xid,
- int *need_mon
- );
- bool set_trx_isolation_in_bulk_sql();
- int set_trx_isolation(
- int trx_isolation,
- int *need_mon
- );
- bool set_autocommit_in_bulk_sql();
- int set_autocommit(
- bool autocommit,
- int *need_mon
- );
- bool set_sql_log_off_in_bulk_sql();
- int set_sql_log_off(
- bool sql_log_off,
- int *need_mon
- );
- bool set_time_zone_in_bulk_sql();
- int set_time_zone(
- Time_zone *time_zone,
- int *need_mon
- );
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
- );
- int 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 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 append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
- );
- int 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 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
- );
- void reset_request_queue();
-#endif
- size_t escape_string(
- char *to,
- const char *from,
- size_t from_length
- );
- bool have_lock_table_list();
- int append_lock_tables(
- spider_string *str
- );
- int append_unlock_tables(
- spider_string *str
- );
- uint get_lock_table_hash_count();
- void reset_lock_table_hash();
- uint get_opened_handler_count();
- void reset_opened_handler();
- void set_dup_key_idx(
- ha_spider *spider,
- int link_idx
- );
- bool cmp_request_key_to_snd(
- st_spider_db_request_key *request_key
- );
-private:
- int set_error(
- sword res,
- dvoid *hndlp,
- int error_num,
- const char *error1,
- const char *error2
- );
-};
-
-class spider_oracle_share: public spider_db_share
-{
-public:
- spider_string *table_select;
- int table_select_pos;
- spider_string *key_select;
- int *key_select_pos;
- spider_string *key_hint;
- spider_string *show_table_status;
- spider_string *show_records;
- spider_string *show_autoinc;
- spider_string *show_last_insert_id;
- spider_string *show_index;
- spider_string *table_names_str;
- spider_string *db_names_str;
- spider_string *db_table_str;
- spider_string *nextval_str;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- my_hash_value_type *db_table_str_hash_value;
-#endif
- uint table_nm_max_length;
- uint db_nm_max_length;
- uint nextval_max_length;
- spider_string *column_name_str;
- bool same_db_table_name;
- int first_all_link_idx;
-
- spider_oracle_share(
- st_spider_share *share
- );
- ~spider_oracle_share();
- int init();
- uint get_column_name_length(
- uint field_index
- );
- int append_column_name(
- spider_string *str,
- uint field_index
- );
- int append_column_name_with_alias(
- spider_string *str,
- uint field_index,
- const char *alias,
- uint alias_length
- );
- int append_table_name(
- spider_string *str,
- int all_link_idx
- );
- int append_table_name_with_adjusting(
- spider_string *str,
- int all_link_idx
- );
- int append_from_with_adjusted_table_name(
- spider_string *str,
- int *table_name_pos
- );
- bool need_change_db_table_name();
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
- int discover_table_structure(
- SPIDER_TRX *trx,
- SPIDER_SHARE *spider_share,
- spider_string *str
- );
-#endif
-private:
- int create_table_names_str();
- void free_table_names_str();
- int create_column_name_str();
- void free_column_name_str();
- int convert_key_hint_str();
- int append_show_table_status();
- void free_show_table_status();
- int append_show_records();
- void free_show_records();
- int append_show_autoinc();
- void free_show_autoinc();
- int append_show_last_insert_id();
- void free_show_last_insert_id();
- int append_show_index();
- void free_show_index();
- int append_table_select();
- int append_key_select(
- uint idx
- );
-};
-
-class spider_oracle_handler: public spider_db_handler
-{
- spider_string sql;
- spider_string sql_part;
- spider_string sql_part2;
- spider_string ha_sql;
- int where_pos;
- int order_pos;
- int limit_pos;
- int table_name_pos;
- int update_set_pos;
- int ha_read_pos;
- int ha_next_pos;
- int ha_where_pos;
- int ha_limit_pos;
- int ha_table_name_pos;
- uint ha_sql_handler_id;
- spider_string insert_sql;
- int insert_pos;
- int insert_table_name_pos;
- int nextval_pos;
- spider_string update_sql;
- TABLE *upd_tmp_tbl;
- TMP_TABLE_PARAM upd_tmp_tbl_prm;
- spider_string tmp_sql;
- int tmp_sql_pos1; /* drop db nm pos at tmp_table_join */
- int tmp_sql_pos2; /* create db nm pos at tmp_table_join */
- int tmp_sql_pos3; /* insert db nm pos at tmp_table_join */
- int tmp_sql_pos4; /* insert val pos at tmp_table_join */
- int tmp_sql_pos5; /* end of drop tbl at tmp_table_join */
- spider_string dup_update_sql;
- spider_string *exec_sql;
- spider_string *exec_insert_sql;
- spider_string *exec_update_sql;
- spider_string *exec_tmp_sql;
- spider_string *exec_ha_sql;
- spider_string *exec_lock_sql;
- int table_lock_mode;
- bool reading_from_bulk_tmp_table;
- bool filled_up;
- bool select_rownum_appended;
- bool update_rownum_appended;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
-#endif
- SPIDER_INT_HLD *union_table_name_pos_first;
- SPIDER_INT_HLD *union_table_name_pos_current;
-public:
- spider_oracle_share *oracle_share;
- SPIDER_LINK_FOR_HASH *link_for_hash;
- spider_oracle_handler(
- ha_spider *spider,
- spider_oracle_share *share
- );
- ~spider_oracle_handler();
- int init();
- int append_table_name_with_adjusting(
- spider_string *str,
- int link_idx,
- ulong sql_type
- );
- int append_key_column_types(
- const key_range *start_key,
- spider_string *str
- );
- int append_key_join_columns_for_bka(
- const key_range *start_key,
- spider_string *str,
- const char **table_aliases,
- uint *table_alias_lengths
- );
- int append_tmp_table_and_sql_for_bka(
- const key_range *start_key
- );
- int reuse_tmp_table_and_sql_for_bka();
- void create_tmp_bka_table_name(
- char *tmp_table_name,
- int *tmp_table_name_length,
- int link_idx
- );
- int append_create_tmp_bka_table(
- const key_range *start_key,
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos,
- CHARSET_INFO *table_charset
- );
- int append_drop_tmp_bka_table(
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos,
- int *drop_table_end_pos,
- bool with_semicolon
- );
- int append_insert_tmp_bka_table(
- const key_range *start_key,
- spider_string *str,
- char *tmp_table_name,
- int tmp_table_name_length,
- int *db_name_pos
- );
- int append_union_table_and_sql_for_bka(
- const key_range *start_key
- );
- int reuse_union_table_and_sql_for_bka();
- int append_insert_for_recovery(
- ulong sql_type,
- int link_idx
- );
- int append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
- );
- int append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
- );
- int append_insert_part();
- int append_insert(
- spider_string *str,
- int link_idx
- );
- int append_update_part();
- int append_update(
- spider_string *str,
- int link_idx
- );
- int append_delete_part();
- int append_delete(
- spider_string *str
- );
- #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_increment_update_set_part();
- int append_increment_update_set(
- spider_string *str
- );
- #endif
- #endif
- int append_update_set_part();
- int append_update_set(
- spider_string *str
- );
- #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_direct_update_set_part();
- int append_direct_update_set(
- spider_string *str
- );
- int append_dup_update_pushdown_part(
- const char *alias,
- uint alias_length
- );
- int append_update_columns_part(
- const char *alias,
- uint alias_length
- );
- int check_update_columns_part();
- int append_update_columns(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- #endif
- int append_select_part(
- ulong sql_type
- );
- int append_select(
- spider_string *str,
- ulong sql_type
- );
- int append_table_select_part(
- ulong sql_type
- );
- int append_table_select(
- spider_string *str
- );
- int append_key_select_part(
- ulong sql_type,
- uint idx
- );
- int append_key_select(
- spider_string *str,
- uint idx
- );
- int append_minimum_select_part(
- ulong sql_type
- );
- int append_minimum_select(
- spider_string *str,
- ulong sql_type
- );
- int append_table_select_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_key_select_with_alias(
- spider_string *str,
- const KEY *key_info,
- const char *alias,
- uint alias_length
- );
- int append_minimum_select_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_select_columns_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_hint_after_table_part(
- ulong sql_type
- );
- int append_hint_after_table(
- spider_string *str
- );
- void set_where_pos(
- ulong sql_type
- );
- void set_where_to_pos(
- ulong sql_type
- );
- int check_item_type(
- Item *item
- );
- int append_values_connector_part(
- ulong sql_type
- );
- int append_values_connector(
- spider_string *str
- );
- int append_values_terminator_part(
- ulong sql_type
- );
- int append_values_terminator(
- spider_string *str
- );
- int append_union_table_connector_part(
- ulong sql_type
- );
- int append_union_table_connector(
- spider_string *str
- );
- int append_union_table_terminator_part(
- ulong sql_type
- );
- int append_union_table_terminator(
- spider_string *str
- );
- int append_key_column_values_part(
- const key_range *start_key,
- ulong sql_type
- );
- int append_key_column_values(
- spider_string *str,
- const key_range *start_key
- );
- int append_key_column_values_with_name_part(
- const key_range *start_key,
- ulong sql_type
- );
- int append_key_column_values_with_name(
- spider_string *str,
- const key_range *start_key
- );
- int append_key_where_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type
- );
- int 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 append_is_null_part(
- ulong sql_type,
- KEY_PART_INFO *key_part,
- const key_range *key,
- const uchar **ptr,
- bool key_eq
- );
- int 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
- );
- int append_where_terminator_part(
- ulong sql_type,
- bool set_order,
- int key_count
- );
- int append_where_terminator(
- ulong sql_type,
- spider_string *str,
- spider_string *str_part,
- spider_string *str_part2,
- bool set_order,
- int key_count
- );
- int append_match_where_part(
- ulong sql_type
- );
- int append_match_where(
- spider_string *str
- );
- int append_update_where(
- spider_string *str,
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_condition_part(
- const char *alias,
- uint alias_length,
- ulong sql_type,
- bool test_flg
- );
- int append_condition(
- spider_string *str,
- const char *alias,
- uint alias_length,
- bool start_where,
- ulong sql_type
- );
- int append_match_against_part(
- ulong sql_type,
- st_spider_ft_info *ft_info,
- const char *alias,
- uint alias_length
- );
- int append_match_against(
- spider_string *str,
- st_spider_ft_info *ft_info,
- const char *alias,
- uint alias_length
- );
- int append_match_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
- );
- int append_match_select(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int append_sum_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
- );
- int append_sum_select(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#endif
- void set_order_pos(
- ulong sql_type
- );
- void set_order_to_pos(
- ulong sql_type
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int append_group_by(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
-#endif
- int append_key_order_for_merge_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_for_merge_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_key_order_for_direct_order_limit_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_for_direct_order_limit_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_key_order_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_for_handler(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_key_order_with_alias(
- spider_string *str,
- const char *alias,
- uint alias_length
- );
- int append_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
- );
- int reappend_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
- );
- int append_limit(
- spider_string *str,
- longlong offset,
- longlong limit
- );
- int append_select_lock_part(
- ulong sql_type
- );
- int append_select_lock(
- spider_string *str
- );
- int append_union_all_start_part(
- ulong sql_type
- );
- int append_union_all_start(
- spider_string *str
- );
- int append_union_all_part(
- ulong sql_type
- );
- int append_union_all(
- spider_string *str
- );
- int append_union_all_end_part(
- ulong sql_type
- );
- int append_union_all_end(
- spider_string *str
- );
- int append_multi_range_cnt_part(
- ulong sql_type,
- uint multi_range_cnt,
- bool with_comma
- );
- int append_multi_range_cnt(
- spider_string *str,
- uint multi_range_cnt,
- bool with_comma
- );
- int append_multi_range_cnt_with_name_part(
- ulong sql_type,
- uint multi_range_cnt
- );
- int append_multi_range_cnt_with_name(
- spider_string *str,
- uint multi_range_cnt
- );
- int append_open_handler_part(
- ulong sql_type,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_open_handler(
- spider_string *str,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_close_handler_part(
- ulong sql_type,
- int link_idx
- );
- int append_close_handler(
- spider_string *str,
- int link_idx
- );
- int append_insert_terminator_part(
- ulong sql_type
- );
- int append_insert_terminator(
- spider_string *str
- );
- int append_insert_values_part(
- ulong sql_type
- );
- int append_insert_values(
- spider_string *str
- );
- int append_into_part(
- ulong sql_type
- );
- int append_into(
- spider_string *str
- );
- void set_insert_to_pos(
- ulong sql_type
- );
- int append_from_part(
- ulong sql_type,
- int link_idx
- );
- int append_from(
- spider_string *str,
- ulong sql_type,
- int link_idx
- );
- int append_flush_tables_part(
- ulong sql_type,
- int link_idx,
- bool lock
- );
- int append_flush_tables(
- spider_string *str,
- int link_idx,
- bool lock
- );
- int append_optimize_table_part(
- ulong sql_type,
- int link_idx
- );
- int append_optimize_table(
- spider_string *str,
- int link_idx
- );
- int append_analyze_table_part(
- ulong sql_type,
- int link_idx
- );
- int append_analyze_table(
- spider_string *str,
- int link_idx
- );
- int append_repair_table_part(
- ulong sql_type,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int append_repair_table(
- spider_string *str,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int append_check_table_part(
- ulong sql_type,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int append_check_table(
- spider_string *str,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int append_enable_keys_part(
- ulong sql_type,
- int link_idx
- );
- int append_enable_keys(
- spider_string *str,
- int link_idx
- );
- int append_disable_keys_part(
- ulong sql_type,
- int link_idx
- );
- int append_disable_keys(
- spider_string *str,
- int link_idx
- );
- int append_delete_all_rows_part(
- ulong sql_type
- );
- int append_delete_all_rows(
- spider_string *str,
- ulong sql_type
- );
- int append_truncate(
- spider_string *str,
- ulong sql_type,
- int link_idx
- );
- int append_explain_select_part(
- key_range *start_key,
- key_range *end_key,
- ulong sql_type,
- int link_idx
- );
- int append_explain_select(
- spider_string *str,
- key_range *start_key,
- key_range *end_key,
- ulong sql_type,
- int link_idx
- );
- bool is_bulk_insert_exec_period(
- bool bulk_end
- );
- bool sql_is_filled_up(
- ulong sql_type
- );
- bool sql_is_empty(
- ulong sql_type
- );
- bool support_multi_split_read();
- bool support_bulk_update();
- int bulk_tmp_table_insert();
- int bulk_tmp_table_insert(
- int link_idx
- );
- int bulk_tmp_table_end_bulk_insert();
- int bulk_tmp_table_rnd_init();
- int bulk_tmp_table_rnd_next();
- int bulk_tmp_table_rnd_end();
- bool need_copy_for_update(
- int link_idx
- );
- bool bulk_tmp_table_created();
- int mk_bulk_tmp_table_and_bulk_start();
- void rm_bulk_tmp_table();
- int store_sql_to_bulk_tmp_table(
- spider_string *str,
- TABLE *tmp_table
- );
- int restore_sql_from_bulk_tmp_table(
- spider_string *str,
- TABLE *tmp_table
- );
- int insert_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx,
- int *appended
- );
- int realloc_sql(
- ulong *realloced
- );
- int reset_sql(
- ulong sql_type
- );
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int reset_keys(
- ulong sql_type
- );
- int reset_upds(
- ulong sql_type
- );
- int reset_strs(
- ulong sql_type
- );
- int reset_strs_pos(
- ulong sql_type
- );
- int push_back_upds(
- SPIDER_HS_STRING_REF &info
- );
-#endif
- bool need_lock_before_set_sql_for_exec(
- ulong sql_type
- );
- int set_sql_for_exec(
- ulong sql_type,
- int link_idx
- );
- int set_sql_for_exec(
- spider_db_copy_table *tgt_ct,
- ulong sql_type
- );
- int execute_sql(
- ulong sql_type,
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
- );
- int reset();
- int sts_mode_exchange(
- int sts_mode
- );
- int show_table_status(
- int link_idx,
- int sts_mode,
- uint flag
- );
- int crd_mode_exchange(
- int crd_mode
- );
- int show_index(
- int link_idx,
- int crd_mode
- );
- int show_records(
- int link_idx
- );
- int show_autoinc(
- int link_idx
- );
- int show_last_insert_id(
- int link_idx,
- ulonglong &last_insert_id
- );
- ha_rows explain_select(
- key_range *start_key,
- key_range *end_key,
- int link_idx
- );
- int lock_tables(
- int link_idx
- );
- int unlock_tables(
- int link_idx
- );
- int disable_keys(
- SPIDER_CONN *conn,
- int link_idx
- );
- int enable_keys(
- SPIDER_CONN *conn,
- int link_idx
- );
- int check_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int repair_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int analyze_table(
- SPIDER_CONN *conn,
- int link_idx
- );
- int optimize_table(
- SPIDER_CONN *conn,
- int link_idx
- );
- int flush_tables(
- SPIDER_CONN *conn,
- int link_idx,
- bool lock
- );
- int flush_logs(
- SPIDER_CONN *conn,
- int link_idx
- );
- int insert_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
- );
- int delete_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
- );
- int sync_from_clone_source(
- spider_db_handler *dbton_hdl
- );
- bool support_use_handler(
- int use_handler
- );
- bool minimum_select_bit_is_set(
- uint field_index
- );
- void copy_minimum_select_bitmap(
- uchar *bitmap
- );
- int init_union_table_name_pos();
- int set_union_table_name_pos();
- int reset_union_table_name(
- spider_string *str,
- int link_idx,
- ulong sql_type
- );
-};
-
-class spider_oracle_copy_table: public spider_db_copy_table
-{
-public:
- spider_oracle_share *oracle_share;
- spider_string sql;
- spider_string sql_part;
- uint pos;
- uint table_name_pos;
- uint pos_diff;
- int table_lock_mode;
- int store_link_idx;
- bool select_rownum_appended;
- spider_string *first_str;
- spider_string *current_str;
- spider_oracle_copy_table(
- spider_oracle_share *db_share
- );
- ~spider_oracle_copy_table();
- int init();
- void set_sql_charset(
- CHARSET_INFO *cs
- );
- int append_select_str();
- int append_insert_str(
- int insert_flg
- );
- int append_table_columns(
- TABLE_SHARE *table_share
- );
- int append_from_str();
- int append_table_name(
- int link_idx
- );
- void set_sql_pos();
- void set_sql_to_pos();
- int append_copy_where(
- spider_db_copy_table *source_ct,
- KEY *key_info,
- ulong *last_row_pos,
- ulong *last_lengths
- );
- int append_key_order_str(
- KEY *key_info,
- int start_pos,
- bool desc_flg
- );
- int append_limit(
- longlong offset,
- longlong limit
- );
- int append_into_str();
- int append_open_paren_str();
- int append_values_str();
- int append_select_lock_str(
- int lock_mode
- );
- int exec_query(
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
- );
- int copy_key_row(
- spider_db_copy_table *source_ct,
- Field *field,
- ulong *row_pos,
- ulong *length,
- const char *joint_str,
- const int joint_length
- );
- int copy_row(
- Field *field,
- SPIDER_DB_ROW *row
- );
- int copy_rows(
- TABLE *table,
- SPIDER_DB_ROW *row,
- ulong **last_row_pos,
- ulong **last_lengths
- );
- int copy_rows(
- TABLE *table,
- SPIDER_DB_ROW *row
- );
- int append_insert_terminator();
- int copy_insert_values(
- spider_db_copy_table *source_ct
- );
-};
+/* Copyright (C) 2012-2014 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+class spider_db_oracle;
+class spider_db_oracle_result;
+
+class spider_db_oracle_util: public spider_db_util
+{
+public:
+ spider_db_oracle_util();
+ ~spider_db_oracle_util();
+ int append_name(
+ spider_string *str,
+ const char *name,
+ uint name_length
+ );
+ int append_name_with_charset(
+ spider_string *str,
+ const char *name,
+ uint name_length,
+ CHARSET_INFO *name_charset
+ );
+ bool is_name_quote(
+ const char head_code
+ );
+ int append_escaped_name_quote(
+ spider_string *str
+ );
+ int append_column_value(
+ ha_spider *spider,
+ spider_string *str,
+ Field *field,
+ const uchar *new_ptr,
+ CHARSET_INFO *access_charset
+ );
+ int append_from_with_alias(
+ spider_string *str,
+ const char **table_names,
+ uint *table_name_lengths,
+ const char **table_aliases,
+ uint *table_alias_lengths,
+ uint table_count,
+ int *table_name_pos,
+ bool over_write
+ );
+ int append_trx_isolation(
+ spider_string *str,
+ int trx_isolation
+ );
+ int append_autocommit(
+ spider_string *str,
+ bool autocommit
+ );
+ int append_sql_log_off(
+ spider_string *str,
+ bool sql_log_off
+ );
+ int append_time_zone(
+ spider_string *str,
+ Time_zone *time_zone
+ );
+ int append_start_transaction(
+ spider_string *str
+ );
+ int append_xa_start(
+ spider_string *str,
+ XID *xid
+ );
+ int append_lock_table_head(
+ spider_string *str
+ );
+ int 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
+ );
+ int append_lock_table_tail(
+ spider_string *str
+ );
+ int append_unlock_table(
+ spider_string *str
+ );
+ int open_item_func(
+ Item_func *item_func,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int open_item_sum_func(
+ Item_sum *item_sum,
+ ha_spider *spider,
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
+ size_t escape_string(
+ char *to,
+ const char *from,
+ size_t from_length,
+ CHARSET_INFO *access_charset
+ );
+ int append_escaped_util(
+ spider_string *to,
+ String *from
+ );
+};
+
+class spider_db_oracle_row: public spider_db_row
+{
+public:
+ spider_db_oracle *db_conn;
+ spider_db_oracle_result *result;
+ sb2 *ind;
+ char **val;
+ ub2 *rlen;
+ sb2 *ind_first;
+ char **val_first;
+ ub2 *rlen_first;
+ spider_string *val_str;
+ spider_string *val_str_first;
+ OCIDefine **defnp;
+ OCILobLocator **lobhp;
+ OCIParam **colhp;
+ ub2 *coltp;
+ ub2 *colsz;
+ uint field_count;
+ ulong *row_size;
+ ulong *row_size_first;
+ CHARSET_INFO *access_charset;
+ bool cloned;
+ spider_db_oracle_util util;
+
+ spider_db_oracle_row();
+ ~spider_db_oracle_row();
+ int store_to_field(
+ Field *field,
+ CHARSET_INFO *access_charset
+ );
+ int append_to_str(
+ spider_string *str
+ );
+ int append_escaped_to_str(
+ spider_string *str,
+ uint dbton_id
+ );
+ void first();
+ void next();
+ bool is_null();
+ int val_int();
+ double val_real();
+ my_decimal *val_decimal(
+ my_decimal *decimal_value,
+ CHARSET_INFO *access_charset
+ );
+ SPIDER_DB_ROW *clone();
+ int store_to_tmp_table(
+ TABLE *tmp_table,
+ spider_string *str
+ );
+ /* for oracle */
+ int init();
+ void deinit();
+ int define();
+ int fetch();
+};
+
+class spider_db_oracle_result: public spider_db_result
+{
+public:
+ spider_db_oracle *db_conn;
+ OCIStmt *stmtp;
+ uint field_count;
+ CHARSET_INFO *access_charset;
+ bool fetched;
+ spider_db_oracle_row row;
+ int store_error_num;
+
+ spider_db_oracle_result();
+ ~spider_db_oracle_result();
+ bool has_result();
+ void free_result();
+ SPIDER_DB_ROW *current_row();
+ SPIDER_DB_ROW *fetch_row();
+ SPIDER_DB_ROW *fetch_row_from_result_buffer(
+ spider_db_result_buffer *spider_res_buf
+ );
+ SPIDER_DB_ROW *fetch_row_from_tmp_table(
+ TABLE *tmp_table
+ );
+ int fetch_table_status(
+ int mode,
+ ha_rows &records,
+ ulong &mean_rec_length,
+ ulonglong &data_file_length,
+ ulonglong &max_data_file_length,
+ ulonglong &index_file_length,
+ ulonglong &auto_increment_value,
+ time_t &create_time,
+ time_t &update_time,
+ time_t &check_time
+ );
+ int fetch_table_records(
+ int mode,
+ ha_rows &records
+ );
+ int fetch_table_cardinality(
+ int mode,
+ TABLE *table,
+ longlong *cardinality,
+ uchar *cardinality_upd,
+ int bitmap_size
+ );
+ int fetch_table_mon_status(
+ int &status
+ );
+ longlong num_rows();
+ uint num_fields();
+ void move_to_pos(
+ longlong pos
+ );
+ int get_errno();
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+ int fetch_columns_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+ );
+ int fetch_index_for_discover_table_structure(
+ spider_string *str,
+ CHARSET_INFO *access_charset
+ );
+#endif
+ /* for oracle */
+ int set_column_info();
+};
+
+class spider_db_oracle: public spider_db_conn
+{
+public:
+ OCIEnv *envhp;
+ OCIError *errhp;
+ OCIServer *srvhp;
+ OCISvcCtx *svchp;
+ OCISession *usrhp;
+ OCIStmt *stmtp;
+ OCITrans *txnhp;
+ spider_db_oracle_result *result;
+ int stored_error_num;
+ const char *stored_error;
+ uint update_rows;
+ int table_lock_mode;
+ spider_string *exec_lock_sql;
+ spider_db_oracle_util util;
+ ulonglong stored_last_insert_id;
+ HASH lock_table_hash;
+ bool lock_table_hash_inited;
+ uint lock_table_hash_id;
+ const char *lock_table_hash_func_name;
+ const char *lock_table_hash_file_name;
+ ulong lock_table_hash_line_no;
+ DYNAMIC_ARRAY handler_open_array;
+ bool handler_open_array_inited;
+ uint handler_open_array_id;
+ const char *handler_open_array_func_name;
+ const char *handler_open_array_file_name;
+ ulong handler_open_array_line_no;
+
+ /* for bg_connect */
+ char stored_error_msg[MYSQL_ERRMSG_SIZE];
+ 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;
+
+ spider_db_oracle(
+ SPIDER_CONN *conn
+ );
+ ~spider_db_oracle();
+ int init();
+ bool is_connected();
+ void bg_connect();
+ int 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
+ );
+ int ping();
+ void bg_disconnect();
+ void disconnect();
+ int set_net_timeout();
+ int exec_query(
+ const char *query,
+ uint length,
+ int quick_mode
+ );
+ int get_errno();
+ const char *get_error();
+ bool is_server_gone_error(
+ int error_num
+ );
+ bool is_dup_entry_error(
+ int error_num
+ );
+ bool is_xa_nota_error(
+ int error_num
+ );
+ spider_db_result *store_result(
+ spider_db_result_buffer **spider_res_buf,
+ st_spider_db_request_key *request_key,
+ int *error_num
+ );
+ spider_db_result *use_result(
+ st_spider_db_request_key *request_key,
+ int *error_num
+ );
+ int next_result();
+ uint affected_rows();
+ ulonglong last_insert_id();
+ int set_character_set(
+ const char *csname
+ );
+ int select_db(
+ const char *dbname
+ );
+ int consistent_snapshot(
+ int *need_mon
+ );
+ bool trx_start_in_bulk_sql();
+ int start_transaction(
+ int *need_mon
+ );
+ int commit(
+ int *need_mon
+ );
+ int rollback(
+ int *need_mon
+ );
+ bool xa_start_in_bulk_sql();
+ int xa_start(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_end(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_prepare(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_commit(
+ XID *xid,
+ int *need_mon
+ );
+ int xa_rollback(
+ XID *xid,
+ int *need_mon
+ );
+ bool set_trx_isolation_in_bulk_sql();
+ int set_trx_isolation(
+ int trx_isolation,
+ int *need_mon
+ );
+ bool set_autocommit_in_bulk_sql();
+ int set_autocommit(
+ bool autocommit,
+ int *need_mon
+ );
+ bool set_sql_log_off_in_bulk_sql();
+ int set_sql_log_off(
+ bool sql_log_off,
+ int *need_mon
+ );
+ bool set_time_zone_in_bulk_sql();
+ int set_time_zone(
+ Time_zone *time_zone,
+ int *need_mon
+ );
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ int append_sql(
+ char *sql,
+ ulong sql_length,
+ st_spider_db_request_key *request_key
+ );
+ int 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 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 append_insert(
+ uint handler_id,
+ SPIDER_DB_HS_STRING_REF_BUFFER *upds,
+ st_spider_db_request_key *request_key
+ );
+ int 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 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
+ );
+ void reset_request_queue();
+#endif
+ size_t escape_string(
+ char *to,
+ const char *from,
+ size_t from_length
+ );
+ bool have_lock_table_list();
+ int append_lock_tables(
+ spider_string *str
+ );
+ int append_unlock_tables(
+ spider_string *str
+ );
+ uint get_lock_table_hash_count();
+ void reset_lock_table_hash();
+ uint get_opened_handler_count();
+ void reset_opened_handler();
+ void set_dup_key_idx(
+ ha_spider *spider,
+ int link_idx
+ );
+ bool cmp_request_key_to_snd(
+ st_spider_db_request_key *request_key
+ );
+private:
+ int set_error(
+ sword res,
+ dvoid *hndlp,
+ int error_num,
+ const char *error1,
+ const char *error2
+ );
+};
+
+class spider_oracle_share: public spider_db_share
+{
+public:
+ spider_string *table_select;
+ int table_select_pos;
+ spider_string *key_select;
+ int *key_select_pos;
+ spider_string *key_hint;
+ spider_string *show_table_status;
+ spider_string *show_records;
+ spider_string *show_autoinc;
+ spider_string *show_last_insert_id;
+ spider_string *show_index;
+ spider_string *table_names_str;
+ spider_string *db_names_str;
+ spider_string *db_table_str;
+ spider_string *nextval_str;
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ my_hash_value_type *db_table_str_hash_value;
+#endif
+ uint table_nm_max_length;
+ uint db_nm_max_length;
+ uint nextval_max_length;
+ spider_string *column_name_str;
+ bool same_db_table_name;
+ int first_all_link_idx;
+
+ spider_oracle_share(
+ st_spider_share *share
+ );
+ ~spider_oracle_share();
+ int init();
+ uint get_column_name_length(
+ uint field_index
+ );
+ int append_column_name(
+ spider_string *str,
+ uint field_index
+ );
+ int append_column_name_with_alias(
+ spider_string *str,
+ uint field_index,
+ const char *alias,
+ uint alias_length
+ );
+ int append_table_name(
+ spider_string *str,
+ int all_link_idx
+ );
+ int append_table_name_with_adjusting(
+ spider_string *str,
+ int all_link_idx
+ );
+ int append_from_with_adjusted_table_name(
+ spider_string *str,
+ int *table_name_pos
+ );
+ bool need_change_db_table_name();
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
+ int discover_table_structure(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *spider_share,
+ spider_string *str
+ );
+#endif
+private:
+ int create_table_names_str();
+ void free_table_names_str();
+ int create_column_name_str();
+ void free_column_name_str();
+ int convert_key_hint_str();
+ int append_show_table_status();
+ void free_show_table_status();
+ int append_show_records();
+ void free_show_records();
+ int append_show_autoinc();
+ void free_show_autoinc();
+ int append_show_last_insert_id();
+ void free_show_last_insert_id();
+ int append_show_index();
+ void free_show_index();
+ int append_table_select();
+ int append_key_select(
+ uint idx
+ );
+};
+
+class spider_oracle_handler: public spider_db_handler
+{
+ spider_string sql;
+ spider_string sql_part;
+ spider_string sql_part2;
+ spider_string ha_sql;
+ int where_pos;
+ int order_pos;
+ int limit_pos;
+ int table_name_pos;
+ int update_set_pos;
+ int ha_read_pos;
+ int ha_next_pos;
+ int ha_where_pos;
+ int ha_limit_pos;
+ int ha_table_name_pos;
+ uint ha_sql_handler_id;
+ spider_string insert_sql;
+ int insert_pos;
+ int insert_table_name_pos;
+ int nextval_pos;
+ spider_string update_sql;
+ TABLE *upd_tmp_tbl;
+ TMP_TABLE_PARAM upd_tmp_tbl_prm;
+ spider_string tmp_sql;
+ int tmp_sql_pos1; /* drop db nm pos at tmp_table_join */
+ int tmp_sql_pos2; /* create db nm pos at tmp_table_join */
+ int tmp_sql_pos3; /* insert db nm pos at tmp_table_join */
+ int tmp_sql_pos4; /* insert val pos at tmp_table_join */
+ int tmp_sql_pos5; /* end of drop tbl at tmp_table_join */
+ spider_string dup_update_sql;
+ spider_string *exec_sql;
+ spider_string *exec_insert_sql;
+ spider_string *exec_update_sql;
+ spider_string *exec_tmp_sql;
+ spider_string *exec_ha_sql;
+ spider_string *exec_lock_sql;
+ int table_lock_mode;
+ bool reading_from_bulk_tmp_table;
+ bool filled_up;
+ bool select_rownum_appended;
+ bool update_rownum_appended;
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
+#endif
+ SPIDER_INT_HLD *union_table_name_pos_first;
+ SPIDER_INT_HLD *union_table_name_pos_current;
+public:
+ spider_oracle_share *oracle_share;
+ SPIDER_LINK_FOR_HASH *link_for_hash;
+ uchar *minimum_select_bitmap;
+ spider_oracle_handler(
+ ha_spider *spider,
+ spider_oracle_share *share
+ );
+ ~spider_oracle_handler();
+ int init();
+ int append_table_name_with_adjusting(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ );
+ int append_key_column_types(
+ const key_range *start_key,
+ spider_string *str
+ );
+ int append_key_join_columns_for_bka(
+ const key_range *start_key,
+ spider_string *str,
+ const char **table_aliases,
+ uint *table_alias_lengths
+ );
+ int append_tmp_table_and_sql_for_bka(
+ const key_range *start_key
+ );
+ int reuse_tmp_table_and_sql_for_bka();
+ void create_tmp_bka_table_name(
+ char *tmp_table_name,
+ int *tmp_table_name_length,
+ int link_idx
+ );
+ int append_create_tmp_bka_table(
+ const key_range *start_key,
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos,
+ CHARSET_INFO *table_charset
+ );
+ int append_drop_tmp_bka_table(
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos,
+ int *drop_table_end_pos,
+ bool with_semicolon
+ );
+ int append_insert_tmp_bka_table(
+ const key_range *start_key,
+ spider_string *str,
+ char *tmp_table_name,
+ int tmp_table_name_length,
+ int *db_name_pos
+ );
+ int append_union_table_and_sql_for_bka(
+ const key_range *start_key
+ );
+ int reuse_union_table_and_sql_for_bka();
+ int append_insert_for_recovery(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+ );
+ int append_update(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+ );
+ int append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+ );
+ int append_delete(
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff,
+ int link_idx
+ );
+ int append_insert_part();
+ int append_insert(
+ spider_string *str,
+ int link_idx
+ );
+ int append_update_part();
+ int append_update(
+ spider_string *str,
+ int link_idx
+ );
+ int append_delete_part();
+ int append_delete(
+ spider_string *str
+ );
+ #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ int append_increment_update_set_part();
+ int append_increment_update_set(
+ spider_string *str
+ );
+ #endif
+ #endif
+ int append_update_set_part();
+ int append_update_set(
+ spider_string *str
+ );
+ #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ int append_direct_update_set_part();
+ int append_direct_update_set(
+ spider_string *str
+ );
+ int append_dup_update_pushdown_part(
+ const char *alias,
+ uint alias_length
+ );
+ int append_update_columns_part(
+ const char *alias,
+ uint alias_length
+ );
+ int check_update_columns_part();
+ int append_update_columns(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ #endif
+ int append_select_part(
+ ulong sql_type
+ );
+ int append_select(
+ spider_string *str,
+ ulong sql_type
+ );
+ int append_table_select_part(
+ ulong sql_type
+ );
+ int append_table_select(
+ spider_string *str
+ );
+ int append_key_select_part(
+ ulong sql_type,
+ uint idx
+ );
+ int append_key_select(
+ spider_string *str,
+ uint idx
+ );
+ int append_minimum_select_part(
+ ulong sql_type
+ );
+ int append_minimum_select(
+ spider_string *str,
+ ulong sql_type
+ );
+ int append_table_select_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_key_select_with_alias(
+ spider_string *str,
+ const KEY *key_info,
+ const char *alias,
+ uint alias_length
+ );
+ int append_minimum_select_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_select_columns_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_hint_after_table_part(
+ ulong sql_type
+ );
+ int append_hint_after_table(
+ spider_string *str
+ );
+ void set_where_pos(
+ ulong sql_type
+ );
+ void set_where_to_pos(
+ ulong sql_type
+ );
+ int check_item_type(
+ Item *item
+ );
+ int append_values_connector_part(
+ ulong sql_type
+ );
+ int append_values_connector(
+ spider_string *str
+ );
+ int append_values_terminator_part(
+ ulong sql_type
+ );
+ int append_values_terminator(
+ spider_string *str
+ );
+ int append_union_table_connector_part(
+ ulong sql_type
+ );
+ int append_union_table_connector(
+ spider_string *str
+ );
+ int append_union_table_terminator_part(
+ ulong sql_type
+ );
+ int append_union_table_terminator(
+ spider_string *str
+ );
+ int append_key_column_values_part(
+ const key_range *start_key,
+ ulong sql_type
+ );
+ int append_key_column_values(
+ spider_string *str,
+ const key_range *start_key
+ );
+ int append_key_column_values_with_name_part(
+ const key_range *start_key,
+ ulong sql_type
+ );
+ int append_key_column_values_with_name(
+ spider_string *str,
+ const key_range *start_key
+ );
+ int append_key_where_part(
+ const key_range *start_key,
+ const key_range *end_key,
+ ulong sql_type
+ );
+ int 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 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 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
+ );
+ int append_where_terminator_part(
+ ulong sql_type,
+ bool set_order,
+ int key_count
+ );
+ int append_where_terminator(
+ ulong sql_type,
+ spider_string *str,
+ spider_string *str_part,
+ spider_string *str_part2,
+ bool set_order,
+ int key_count
+ );
+ int append_match_where_part(
+ ulong sql_type
+ );
+ int append_match_where(
+ spider_string *str
+ );
+ int append_update_where(
+ spider_string *str,
+ const TABLE *table,
+ my_ptrdiff_t ptr_diff
+ );
+ int append_condition_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type,
+ bool test_flg
+ );
+ int append_condition(
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool start_where,
+ ulong sql_type
+ );
+ int append_match_against_part(
+ ulong sql_type,
+ st_spider_ft_info *ft_info,
+ const char *alias,
+ uint alias_length
+ );
+ int append_match_against(
+ spider_string *str,
+ st_spider_ft_info *ft_info,
+ const char *alias,
+ uint alias_length
+ );
+ int append_match_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+ int append_match_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_sum_select_part(
+ ulong sql_type,
+ const char *alias,
+ uint alias_length
+ );
+ int append_sum_select(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
+ void set_order_pos(
+ ulong sql_type
+ );
+ void set_order_to_pos(
+ ulong sql_type
+ );
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ int append_group_by_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_group_by(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+#endif
+ int append_key_order_for_merge_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_key_order_for_merge_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_key_order_for_direct_order_limit_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_key_order_for_direct_order_limit_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_key_order_with_alias_part(
+ const char *alias,
+ uint alias_length,
+ ulong sql_type
+ );
+ int append_key_order_for_handler(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_key_order_with_alias(
+ spider_string *str,
+ const char *alias,
+ uint alias_length
+ );
+ int append_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+ );
+ int reappend_limit_part(
+ longlong offset,
+ longlong limit,
+ ulong sql_type
+ );
+ int append_limit(
+ spider_string *str,
+ longlong offset,
+ longlong limit
+ );
+ int append_select_lock_part(
+ ulong sql_type
+ );
+ int append_select_lock(
+ spider_string *str
+ );
+ int append_union_all_start_part(
+ ulong sql_type
+ );
+ int append_union_all_start(
+ spider_string *str
+ );
+ int append_union_all_part(
+ ulong sql_type
+ );
+ int append_union_all(
+ spider_string *str
+ );
+ int append_union_all_end_part(
+ ulong sql_type
+ );
+ int append_union_all_end(
+ spider_string *str
+ );
+ int append_multi_range_cnt_part(
+ ulong sql_type,
+ uint multi_range_cnt,
+ bool with_comma
+ );
+ int append_multi_range_cnt(
+ spider_string *str,
+ uint multi_range_cnt,
+ bool with_comma
+ );
+ int append_multi_range_cnt_with_name_part(
+ ulong sql_type,
+ uint multi_range_cnt
+ );
+ int append_multi_range_cnt_with_name(
+ spider_string *str,
+ uint multi_range_cnt
+ );
+ int append_open_handler_part(
+ ulong sql_type,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int append_open_handler(
+ spider_string *str,
+ uint handler_id,
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int append_close_handler_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_close_handler(
+ spider_string *str,
+ int link_idx
+ );
+ int append_insert_terminator_part(
+ ulong sql_type
+ );
+ int append_insert_terminator(
+ spider_string *str
+ );
+ int append_insert_values_part(
+ ulong sql_type
+ );
+ int append_insert_values(
+ spider_string *str
+ );
+ int append_into_part(
+ ulong sql_type
+ );
+ int append_into(
+ spider_string *str
+ );
+ void set_insert_to_pos(
+ ulong sql_type
+ );
+ int append_from_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_from(
+ spider_string *str,
+ ulong sql_type,
+ int link_idx
+ );
+ int append_flush_tables_part(
+ ulong sql_type,
+ int link_idx,
+ bool lock
+ );
+ int append_flush_tables(
+ spider_string *str,
+ int link_idx,
+ bool lock
+ );
+ int append_optimize_table_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_optimize_table(
+ spider_string *str,
+ int link_idx
+ );
+ int append_analyze_table_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_analyze_table(
+ spider_string *str,
+ int link_idx
+ );
+ int append_repair_table_part(
+ ulong sql_type,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int append_repair_table(
+ spider_string *str,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int append_check_table_part(
+ ulong sql_type,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int append_check_table(
+ spider_string *str,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int append_enable_keys_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_enable_keys(
+ spider_string *str,
+ int link_idx
+ );
+ int append_disable_keys_part(
+ ulong sql_type,
+ int link_idx
+ );
+ int append_disable_keys(
+ spider_string *str,
+ int link_idx
+ );
+ int append_delete_all_rows_part(
+ ulong sql_type
+ );
+ int append_delete_all_rows(
+ spider_string *str,
+ ulong sql_type
+ );
+ int append_truncate(
+ spider_string *str,
+ ulong sql_type,
+ int link_idx
+ );
+ int append_explain_select_part(
+ key_range *start_key,
+ key_range *end_key,
+ ulong sql_type,
+ int link_idx
+ );
+ int append_explain_select(
+ spider_string *str,
+ key_range *start_key,
+ key_range *end_key,
+ ulong sql_type,
+ int link_idx
+ );
+ bool is_bulk_insert_exec_period(
+ bool bulk_end
+ );
+ bool sql_is_filled_up(
+ ulong sql_type
+ );
+ bool sql_is_empty(
+ ulong sql_type
+ );
+ bool support_multi_split_read();
+ bool support_bulk_update();
+ int bulk_tmp_table_insert();
+ int bulk_tmp_table_insert(
+ int link_idx
+ );
+ int bulk_tmp_table_end_bulk_insert();
+ int bulk_tmp_table_rnd_init();
+ int bulk_tmp_table_rnd_next();
+ int bulk_tmp_table_rnd_end();
+ bool need_copy_for_update(
+ int link_idx
+ );
+ bool bulk_tmp_table_created();
+ int mk_bulk_tmp_table_and_bulk_start();
+ void rm_bulk_tmp_table();
+ int store_sql_to_bulk_tmp_table(
+ spider_string *str,
+ TABLE *tmp_table
+ );
+ int restore_sql_from_bulk_tmp_table(
+ spider_string *str,
+ TABLE *tmp_table
+ );
+ int insert_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int append_lock_tables_list(
+ SPIDER_CONN *conn,
+ int link_idx,
+ int *appended
+ );
+ int realloc_sql(
+ ulong *realloced
+ );
+ int reset_sql(
+ ulong sql_type
+ );
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ int reset_keys(
+ ulong sql_type
+ );
+ int reset_upds(
+ ulong sql_type
+ );
+ int reset_strs(
+ ulong sql_type
+ );
+ int reset_strs_pos(
+ ulong sql_type
+ );
+ int push_back_upds(
+ SPIDER_HS_STRING_REF &info
+ );
+#endif
+ bool need_lock_before_set_sql_for_exec(
+ ulong sql_type
+ );
+ int set_sql_for_exec(
+ ulong sql_type,
+ int link_idx
+ );
+ int set_sql_for_exec(
+ spider_db_copy_table *tgt_ct,
+ ulong sql_type
+ );
+ int execute_sql(
+ ulong sql_type,
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+ );
+ int reset();
+ int sts_mode_exchange(
+ int sts_mode
+ );
+ int show_table_status(
+ int link_idx,
+ int sts_mode,
+ uint flag
+ );
+ int crd_mode_exchange(
+ int crd_mode
+ );
+ int show_index(
+ int link_idx,
+ int crd_mode
+ );
+ int show_records(
+ int link_idx
+ );
+ int show_autoinc(
+ int link_idx
+ );
+ int show_last_insert_id(
+ int link_idx,
+ ulonglong &last_insert_id
+ );
+ ha_rows explain_select(
+ key_range *start_key,
+ key_range *end_key,
+ int link_idx
+ );
+ int lock_tables(
+ int link_idx
+ );
+ int unlock_tables(
+ int link_idx
+ );
+ int disable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int enable_keys(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int check_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int repair_table(
+ SPIDER_CONN *conn,
+ int link_idx,
+ HA_CHECK_OPT* check_opt
+ );
+ int analyze_table(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int optimize_table(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int flush_tables(
+ SPIDER_CONN *conn,
+ int link_idx,
+ bool lock
+ );
+ int flush_logs(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int insert_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int delete_opened_handler(
+ SPIDER_CONN *conn,
+ int link_idx
+ );
+ int sync_from_clone_source(
+ spider_db_handler *dbton_hdl
+ );
+ bool support_use_handler(
+ int use_handler
+ );
+ void minimum_select_bitmap_create();
+ bool minimum_select_bit_is_set(
+ uint field_index
+ );
+ void copy_minimum_select_bitmap(
+ uchar *bitmap
+ );
+ int init_union_table_name_pos();
+ int set_union_table_name_pos();
+ int reset_union_table_name(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ );
+};
+
+class spider_oracle_copy_table: public spider_db_copy_table
+{
+public:
+ spider_oracle_share *oracle_share;
+ spider_string sql;
+ spider_string sql_part;
+ uint pos;
+ uint table_name_pos;
+ uint pos_diff;
+ int table_lock_mode;
+ int store_link_idx;
+ bool select_rownum_appended;
+ spider_string *first_str;
+ spider_string *current_str;
+ spider_oracle_copy_table(
+ spider_oracle_share *db_share
+ );
+ ~spider_oracle_copy_table();
+ int init();
+ void set_sql_charset(
+ CHARSET_INFO *cs
+ );
+ int append_select_str();
+ int append_insert_str(
+ int insert_flg
+ );
+ int append_table_columns(
+ TABLE_SHARE *table_share
+ );
+ int append_from_str();
+ int append_table_name(
+ int link_idx
+ );
+ void set_sql_pos();
+ void set_sql_to_pos();
+ int append_copy_where(
+ spider_db_copy_table *source_ct,
+ KEY *key_info,
+ ulong *last_row_pos,
+ ulong *last_lengths
+ );
+ int append_key_order_str(
+ KEY *key_info,
+ int start_pos,
+ bool desc_flg
+ );
+ int append_limit(
+ longlong offset,
+ longlong limit
+ );
+ int append_into_str();
+ int append_open_paren_str();
+ int append_values_str();
+ int append_select_lock_str(
+ int lock_mode
+ );
+ int exec_query(
+ SPIDER_CONN *conn,
+ int quick_mode,
+ int *need_mon
+ );
+ int copy_key_row(
+ spider_db_copy_table *source_ct,
+ Field *field,
+ ulong *row_pos,
+ ulong *length,
+ const char *joint_str,
+ const int joint_length
+ );
+ int copy_row(
+ Field *field,
+ SPIDER_DB_ROW *row
+ );
+ int copy_rows(
+ TABLE *table,
+ SPIDER_DB_ROW *row,
+ ulong **last_row_pos,
+ ulong **last_lengths
+ );
+ int copy_rows(
+ TABLE *table,
+ SPIDER_DB_ROW *row
+ );
+ int append_insert_terminator();
+ int copy_insert_values(
+ spider_db_copy_table *source_ct
+ );
+};
diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc
index 2c844eb2da3..4f756aab784 100644
--- a/storage/spider/spd_direct_sql.cc
+++ b/storage/spider/spd_direct_sql.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2013 Kentoku Shiba
+/* Copyright (C) 2009-2014 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
@@ -40,6 +40,10 @@
#include "spd_udf.h"
#include "spd_malloc.h"
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100004
+#define SPIDER_NEED_INIT_ONE_TABLE_FOR_FIND_TEMPORARY_TABLE
+#endif
+
extern const char **spd_defaults_extra_file;
extern const char **spd_defaults_file;
@@ -1604,8 +1608,16 @@ long long spider_direct_sql_body(
#endif
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
{
+#ifdef SPIDER_NEED_INIT_ONE_TABLE_FOR_FIND_TEMPORARY_TABLE
+ table_list.init_one_table(direct_sql->db_names[roop_count],
+ strlen(direct_sql->db_names[roop_count]),
+ direct_sql->table_names[roop_count],
+ strlen(direct_sql->table_names[roop_count]),
+ direct_sql->table_names[roop_count], TL_WRITE);
+#else
table_list.db = direct_sql->db_names[roop_count];
table_list.table_name = direct_sql->table_names[roop_count];
+#endif
if (!(direct_sql->tables[roop_count] =
find_temporary_table(thd, &table_list)))
{
diff --git a/storage/spider/spd_direct_sql.h b/storage/spider/spd_direct_sql.h
index f20e9de6373..26e3043dd94 100644
--- a/storage/spider/spd_direct_sql.h
+++ b/storage/spider/spd_direct_sql.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2013 Kentoku Shiba
+/* Copyright (C) 2009-2014 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
diff --git a/storage/spider/spd_err.h b/storage/spider/spd_err.h
index c644d6ebca5..13605d16481 100644
--- a/storage/spider/spd_err.h
+++ b/storage/spider/spd_err.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -61,6 +61,8 @@
#define ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR "Can't use wrapper '%s' for NOSQL connection"
#define ER_SPIDER_REQUEST_KEY_NUM 12523
#define ER_SPIDER_REQUEST_KEY_STR "Request key not found"
+#define ER_SPIDER_CANT_OPEN_SYS_TABLE_NUM 12524
+#define ER_SPIDER_CANT_OPEN_SYS_TABLE_STR "Can't open system table %s.%s"
#define ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_NUM 12601
#define ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_STR "Can't use both spider_use_consistent_snapshot = 1 and spider_internal_xa = 1"
diff --git a/storage/spider/spd_i_s.cc b/storage/spider/spd_i_s.cc
index 156f7081770..49824693984 100644
--- a/storage/spider/spd_i_s.cc
+++ b/storage/spider/spd_i_s.cc
@@ -1,146 +1,167 @@
-/* Copyright (C) 2012-2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-#define MYSQL_SERVER 1
-#include "mysql_version.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_class.h"
-#include "sql_partition.h"
-#include "sql_show.h"
-#endif
-#include "spd_db_include.h"
-#include "spd_include.h"
-#include "spd_table.h"
-
-extern pthread_mutex_t spider_mem_calc_mutex;
-
-extern const char *spider_alloc_func_name[SPIDER_MEM_CALC_LIST_NUM];
-extern const char *spider_alloc_file_name[SPIDER_MEM_CALC_LIST_NUM];
-extern ulong spider_alloc_line_no[SPIDER_MEM_CALC_LIST_NUM];
-extern ulonglong spider_total_alloc_mem[SPIDER_MEM_CALC_LIST_NUM];
-extern longlong spider_current_alloc_mem[SPIDER_MEM_CALC_LIST_NUM];
-extern ulonglong spider_alloc_mem_count[SPIDER_MEM_CALC_LIST_NUM];
-extern ulonglong spider_free_mem_count[SPIDER_MEM_CALC_LIST_NUM];
-
-static struct st_mysql_storage_engine spider_i_s_info =
-{ MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION };
-
-static ST_FIELD_INFO spider_i_s_alloc_mem_fields_info[] =
-{
- {"ID", 10, MYSQL_TYPE_LONG, 0, MY_I_S_UNSIGNED, "id", SKIP_OPEN_TABLE},
- {"FUNC_NAME", 64, MYSQL_TYPE_STRING, 0,
- MY_I_S_MAYBE_NULL, "func_name", SKIP_OPEN_TABLE},
- {"FILE_NAME", 64, MYSQL_TYPE_STRING, 0,
- MY_I_S_MAYBE_NULL, "file_name", SKIP_OPEN_TABLE},
- {"LINE_NO", 10, MYSQL_TYPE_LONG, 0,
- MY_I_S_UNSIGNED | MY_I_S_MAYBE_NULL, "line_no", SKIP_OPEN_TABLE},
- {"TOTAL_ALLOC_MEM", 20, MYSQL_TYPE_LONGLONG, 0,
- MY_I_S_UNSIGNED | MY_I_S_MAYBE_NULL, "total_alloc_mem", SKIP_OPEN_TABLE},
- {"CURRENT_ALLOC_MEM", 20, MYSQL_TYPE_LONGLONG, 0,
- MY_I_S_MAYBE_NULL, "current_alloc_mem", SKIP_OPEN_TABLE},
- {"ALLOC_MEM_COUNT", 20, MYSQL_TYPE_LONGLONG, 0,
- MY_I_S_UNSIGNED | MY_I_S_MAYBE_NULL, "alloc_mem_count", SKIP_OPEN_TABLE},
- {"FREE_MEM_COUNT", 20, MYSQL_TYPE_LONGLONG, 0,
- MY_I_S_UNSIGNED | MY_I_S_MAYBE_NULL, "free_mem_count", SKIP_OPEN_TABLE},
- {NULL, 0, MYSQL_TYPE_STRING, 0, 0, NULL, 0}
-};
-
-static int spider_i_s_alloc_mem_fill_table(
- THD *thd,
- TABLE_LIST *tables,
- COND *cond
-) {
- uint roop_count;
- TABLE *table = tables->table;
- DBUG_ENTER("spider_i_s_alloc_mem_fill_table");
- for (roop_count = 0; roop_count < SPIDER_MEM_CALC_LIST_NUM; roop_count++)
- {
- table->field[0]->store(roop_count, TRUE);
- if (spider_alloc_func_name[roop_count])
- {
- table->field[1]->set_notnull();
- table->field[2]->set_notnull();
- table->field[3]->set_notnull();
- table->field[4]->set_notnull();
- table->field[5]->set_notnull();
- table->field[6]->set_notnull();
- table->field[7]->set_notnull();
- table->field[1]->store(spider_alloc_func_name[roop_count],
- strlen(spider_alloc_func_name[roop_count]), system_charset_info);
- table->field[2]->store(spider_alloc_file_name[roop_count],
- strlen(spider_alloc_file_name[roop_count]), system_charset_info);
- table->field[3]->store(spider_alloc_line_no[roop_count], TRUE);
- pthread_mutex_lock(&spider_mem_calc_mutex);
- table->field[4]->store(spider_total_alloc_mem[roop_count], TRUE);
- table->field[5]->store(spider_current_alloc_mem[roop_count], FALSE);
- table->field[6]->store(spider_alloc_mem_count[roop_count], TRUE);
- table->field[7]->store(spider_free_mem_count[roop_count], TRUE);
- pthread_mutex_unlock(&spider_mem_calc_mutex);
- } else {
- table->field[1]->set_null();
- table->field[2]->set_null();
- table->field[3]->set_null();
- table->field[4]->set_null();
- table->field[5]->set_null();
- table->field[6]->set_null();
- table->field[7]->set_null();
- }
- if (schema_table_store_record(thd, table))
- {
- DBUG_RETURN(1);
- }
- }
- DBUG_RETURN(0);
-}
-
-static int spider_i_s_alloc_mem_init(
- void *p
-) {
- ST_SCHEMA_TABLE *schema = (ST_SCHEMA_TABLE *) p;
- DBUG_ENTER("spider_i_s_alloc_mem_init");
- schema->fields_info = spider_i_s_alloc_mem_fields_info;
- schema->fill_table = spider_i_s_alloc_mem_fill_table;
- schema->idx_field1 = 0;
- DBUG_RETURN(0);
-}
-
-static int spider_i_s_alloc_mem_deinit(
- void *p
-) {
- DBUG_ENTER("spider_i_s_alloc_mem_deinit");
- DBUG_RETURN(0);
-}
-
-struct st_maria_plugin spider_i_s_alloc_mem =
-{
- MYSQL_INFORMATION_SCHEMA_PLUGIN,
- &spider_i_s_info,
- "SPIDER_ALLOC_MEM",
- "Kentoku Shiba",
- "Spider memory allocating viewer",
- PLUGIN_LICENSE_GPL,
- spider_i_s_alloc_mem_init,
- spider_i_s_alloc_mem_deinit,
- 0x0001,
- NULL,
- NULL,
- "0.1",
- MariaDB_PLUGIN_MATURITY_BETA
-};
+/* Copyright (C) 2012-2014 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#define MYSQL_SERVER 1
+#include "mysql_version.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_class.h"
+#include "sql_partition.h"
+#include "sql_show.h"
+#endif
+#include "spd_db_include.h"
+#include "spd_include.h"
+#include "spd_table.h"
+
+extern pthread_mutex_t spider_mem_calc_mutex;
+
+extern const char *spider_alloc_func_name[SPIDER_MEM_CALC_LIST_NUM];
+extern const char *spider_alloc_file_name[SPIDER_MEM_CALC_LIST_NUM];
+extern ulong spider_alloc_line_no[SPIDER_MEM_CALC_LIST_NUM];
+extern ulonglong spider_total_alloc_mem[SPIDER_MEM_CALC_LIST_NUM];
+extern longlong spider_current_alloc_mem[SPIDER_MEM_CALC_LIST_NUM];
+extern ulonglong spider_alloc_mem_count[SPIDER_MEM_CALC_LIST_NUM];
+extern ulonglong spider_free_mem_count[SPIDER_MEM_CALC_LIST_NUM];
+
+static struct st_mysql_storage_engine spider_i_s_info =
+{ MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION };
+
+static ST_FIELD_INFO spider_i_s_alloc_mem_fields_info[] =
+{
+ {"ID", 10, MYSQL_TYPE_LONG, 0, MY_I_S_UNSIGNED, "id", SKIP_OPEN_TABLE},
+ {"FUNC_NAME", 64, MYSQL_TYPE_STRING, 0,
+ MY_I_S_MAYBE_NULL, "func_name", SKIP_OPEN_TABLE},
+ {"FILE_NAME", 64, MYSQL_TYPE_STRING, 0,
+ MY_I_S_MAYBE_NULL, "file_name", SKIP_OPEN_TABLE},
+ {"LINE_NO", 10, MYSQL_TYPE_LONG, 0,
+ MY_I_S_UNSIGNED | MY_I_S_MAYBE_NULL, "line_no", SKIP_OPEN_TABLE},
+ {"TOTAL_ALLOC_MEM", 20, MYSQL_TYPE_LONGLONG, 0,
+ MY_I_S_UNSIGNED | MY_I_S_MAYBE_NULL, "total_alloc_mem", SKIP_OPEN_TABLE},
+ {"CURRENT_ALLOC_MEM", 20, MYSQL_TYPE_LONGLONG, 0,
+ MY_I_S_MAYBE_NULL, "current_alloc_mem", SKIP_OPEN_TABLE},
+ {"ALLOC_MEM_COUNT", 20, MYSQL_TYPE_LONGLONG, 0,
+ MY_I_S_UNSIGNED | MY_I_S_MAYBE_NULL, "alloc_mem_count", SKIP_OPEN_TABLE},
+ {"FREE_MEM_COUNT", 20, MYSQL_TYPE_LONGLONG, 0,
+ MY_I_S_UNSIGNED | MY_I_S_MAYBE_NULL, "free_mem_count", SKIP_OPEN_TABLE},
+ {NULL, 0, MYSQL_TYPE_STRING, 0, 0, NULL, 0}
+};
+
+static int spider_i_s_alloc_mem_fill_table(
+ THD *thd,
+ TABLE_LIST *tables,
+ COND *cond
+) {
+ uint roop_count;
+ TABLE *table = tables->table;
+ DBUG_ENTER("spider_i_s_alloc_mem_fill_table");
+ for (roop_count = 0; roop_count < SPIDER_MEM_CALC_LIST_NUM; roop_count++)
+ {
+ table->field[0]->store(roop_count, TRUE);
+ if (spider_alloc_func_name[roop_count])
+ {
+ table->field[1]->set_notnull();
+ table->field[2]->set_notnull();
+ table->field[3]->set_notnull();
+ table->field[4]->set_notnull();
+ table->field[5]->set_notnull();
+ table->field[6]->set_notnull();
+ table->field[7]->set_notnull();
+ table->field[1]->store(spider_alloc_func_name[roop_count],
+ strlen(spider_alloc_func_name[roop_count]), system_charset_info);
+ table->field[2]->store(spider_alloc_file_name[roop_count],
+ strlen(spider_alloc_file_name[roop_count]), system_charset_info);
+ table->field[3]->store(spider_alloc_line_no[roop_count], TRUE);
+ pthread_mutex_lock(&spider_mem_calc_mutex);
+ table->field[4]->store(spider_total_alloc_mem[roop_count], TRUE);
+ table->field[5]->store(spider_current_alloc_mem[roop_count], FALSE);
+ table->field[6]->store(spider_alloc_mem_count[roop_count], TRUE);
+ table->field[7]->store(spider_free_mem_count[roop_count], TRUE);
+ pthread_mutex_unlock(&spider_mem_calc_mutex);
+ } else {
+ table->field[1]->set_null();
+ table->field[2]->set_null();
+ table->field[3]->set_null();
+ table->field[4]->set_null();
+ table->field[5]->set_null();
+ table->field[6]->set_null();
+ table->field[7]->set_null();
+ }
+ if (schema_table_store_record(thd, table))
+ {
+ DBUG_RETURN(1);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+static int spider_i_s_alloc_mem_init(
+ void *p
+) {
+ ST_SCHEMA_TABLE *schema = (ST_SCHEMA_TABLE *) p;
+ DBUG_ENTER("spider_i_s_alloc_mem_init");
+ schema->fields_info = spider_i_s_alloc_mem_fields_info;
+ schema->fill_table = spider_i_s_alloc_mem_fill_table;
+ schema->idx_field1 = 0;
+ DBUG_RETURN(0);
+}
+
+static int spider_i_s_alloc_mem_deinit(
+ void *p
+) {
+ DBUG_ENTER("spider_i_s_alloc_mem_deinit");
+ DBUG_RETURN(0);
+}
+
+struct st_mysql_plugin spider_i_s_alloc_mem =
+{
+ MYSQL_INFORMATION_SCHEMA_PLUGIN,
+ &spider_i_s_info,
+ "SPIDER_ALLOC_MEM",
+ "Kentoku Shiba",
+ "Spider memory allocating viewer",
+ PLUGIN_LICENSE_GPL,
+ spider_i_s_alloc_mem_init,
+ spider_i_s_alloc_mem_deinit,
+ 0x0001,
+ NULL,
+ NULL,
+ NULL,
+#if MYSQL_VERSION_ID >= 50600
+ 0,
+#endif
+};
+
+#ifdef MARIADB_BASE_VERSION
+struct st_maria_plugin spider_i_s_alloc_mem_maria =
+{
+ MYSQL_INFORMATION_SCHEMA_PLUGIN,
+ &spider_i_s_info,
+ "SPIDER_ALLOC_MEM",
+ "Kentoku Shiba",
+ "Spider memory allocating viewer",
+ PLUGIN_LICENSE_GPL,
+ spider_i_s_alloc_mem_init,
+ spider_i_s_alloc_mem_deinit,
+ 0x0100,
+ NULL,
+ NULL,
+ "1.0",
+ MariaDB_PLUGIN_MATURITY_GAMMA,
+};
+#endif
diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h
index 6138debf1a3..700631f9ab0 100644
--- a/storage/spider/spd_include.h
+++ b/storage/spider/spd_include.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -13,6 +13,9 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+#define SPIDER_DETAIL_VERSION "3.2.0"
+#define SPIDER_HEX_VERSION 0x0302
+
#if MYSQL_VERSION_ID < 50500
#else
#define my_free(A,B) my_free(A)
@@ -77,8 +80,13 @@
#define spider_stmt_da_message(A) (A)->main_da.message()
#define spider_stmt_da_sql_errno(A) (A)->main_da.sql_errno()
#else
+#if MYSQL_VERSION_ID < 50600
#define spider_stmt_da_message(A) (A)->stmt_da->message()
#define spider_stmt_da_sql_errno(A) (A)->stmt_da->sql_errno()
+#else
+#define spider_stmt_da_message(A) (A)->get_stmt_da()->message()
+#define spider_stmt_da_sql_errno(A) (A)->get_stmt_da()->sql_errno()
+#endif
#endif
#define spider_user_defined_key_parts(A) (A)->key_parts
#define SPIDER_ALTER_ADD_PARTITION ALTER_ADD_PARTITION
@@ -91,6 +99,12 @@
#define SPIDER_WARN_LEVEL_NOTE MYSQL_ERROR::WARN_LEVEL_NOTE
#endif
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100009
+#define SPIDER_TEST(A) MY_TEST(A)
+#else
+#define SPIDER_TEST(A) test(A)
+#endif
+
#if MYSQL_VERSION_ID >= 50500
#define SPIDER_HAS_HASH_VALUE_TYPE
#endif
@@ -118,7 +132,7 @@
#define SPIDER_TMP_SHARE_LONG_COUNT 15
#define SPIDER_TMP_SHARE_LONGLONG_COUNT 3
-#define SPIDER_MEM_CALC_LIST_NUM 243
+#define SPIDER_MEM_CALC_LIST_NUM 244
#define SPIDER_BACKUP_DASTATUS \
bool da_status; if (thd) da_status = thd->is_error(); else da_status = FALSE;
@@ -134,7 +148,7 @@
#define SPIDER_SET_FILE_POS(A) \
{(A)->thd = current_thd; (A)->func_name = __func__; (A)->file_name = __FILE__; (A)->line_no = __LINE__;}
#define SPIDER_CLEAR_FILE_POS(A) \
- {(A)->thd = NULL; (A)->func_name = NULL; (A)->file_name = NULL; (A)->line_no = 0;}
+ {DBUG_PRINT("info", ("spider thd=%p func_name=%s file_name=%s line_no=%lu", (A)->thd, (A)->func_name ? (A)->func_name : "NULL", (A)->file_name ? (A)->file_name : "NULL", (A)->line_no)); (A)->thd = NULL; (A)->func_name = NULL; (A)->file_name = NULL; (A)->line_no = 0;}
class ha_spider;
typedef struct st_spider_share SPIDER_SHARE;
@@ -261,6 +275,9 @@ typedef struct st_spider_conn
uint opened_handlers;
ulonglong conn_id;
ulonglong connection_id;
+ query_id_t casual_read_query_id;
+ uint casual_read_current_id;
+ st_spider_conn *casual_read_base_conn;
pthread_mutex_t mta_conn_mutex;
volatile bool mta_conn_mutex_lock_already;
volatile bool mta_conn_mutex_unlock_later;
@@ -473,6 +490,7 @@ typedef struct st_spider_transaction
bool trx_start;
bool trx_xa;
bool trx_consistent_snapshot;
+ bool trx_xa_prepared;
bool use_consistent_snapshot;
bool internal_xa;
@@ -571,6 +589,18 @@ typedef struct st_spider_transaction
longlong current_alloc_mem_buffer[SPIDER_MEM_CALC_LIST_NUM];
ulonglong alloc_mem_count_buffer[SPIDER_MEM_CALC_LIST_NUM];
ulonglong free_mem_count_buffer[SPIDER_MEM_CALC_LIST_NUM];
+
+ MEM_ROOT mem_root;
+
+ /* for transaction level query */
+ SPIDER_SHARE *tmp_share;
+ char *tmp_connect_info[SPIDER_TMP_SHARE_CHAR_PTR_COUNT];
+ uint tmp_connect_info_length[SPIDER_TMP_SHARE_UINT_COUNT];
+ long tmp_long[SPIDER_TMP_SHARE_LONG_COUNT];
+ longlong tmp_longlong[SPIDER_TMP_SHARE_LONGLONG_COUNT];
+ ha_spider *tmp_spider;
+ int tmp_need_mon;
+ spider_db_handler *tmp_dbton_handler[SPIDER_DBTON_SIZE];
} SPIDER_TRX;
typedef struct st_spider_share
@@ -734,6 +764,8 @@ typedef struct st_spider_share
#ifdef HA_CAN_FORCE_BULK_DELETE
int force_bulk_delete;
#endif
+ int casual_read;
+ int delete_all_rows_type;
int bka_mode;
char *bka_engine;
diff --git a/storage/spider/spd_malloc.cc b/storage/spider/spd_malloc.cc
index 8cfa7e86357..e152bd8f152 100644
--- a/storage/spider/spd_malloc.cc
+++ b/storage/spider/spd_malloc.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2013 Kentoku Shiba
+/* Copyright (C) 2012-2014 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
diff --git a/storage/spider/spd_malloc.h b/storage/spider/spd_malloc.h
index e981eb3cae4..42e6abd407c 100644
--- a/storage/spider/spd_malloc.h
+++ b/storage/spider/spd_malloc.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2013 Kentoku Shiba
+/* Copyright (C) 2012-2014 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
diff --git a/storage/spider/spd_param.cc b/storage/spider/spd_param.cc
index c3ccd4076fc..2b1e87313d1 100644
--- a/storage/spider/spd_param.cc
+++ b/storage/spider/spd_param.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -32,7 +32,10 @@
#include "spd_table.h"
#include "spd_trx.h"
-extern struct st_maria_plugin spider_i_s_alloc_mem;
+extern struct st_mysql_plugin spider_i_s_alloc_mem;
+#ifdef MARIADB_BASE_VERSION
+extern struct st_maria_plugin spider_i_s_alloc_mem_maria;
+#endif
extern volatile ulonglong spider_mon_table_cache_version;
extern volatile ulonglong spider_mon_table_cache_version_req;
@@ -2827,6 +2830,136 @@ uint spider_param_log_result_errors()
DBUG_RETURN(spider_log_result_errors);
}
+static uint spider_log_result_error_with_sql;
+/*
+ 0: no log
+ 1: log spider sql at logging result errors
+ 2: log user sql at logging result errors
+ 3: log both sql at logging result errors
+ */
+static MYSQL_SYSVAR_UINT(
+ log_result_error_with_sql,
+ spider_log_result_error_with_sql,
+ PLUGIN_VAR_RQCMDARG,
+ "Log sql at logging result errors",
+ NULL,
+ NULL,
+ 0,
+ 0,
+ 3,
+ 0
+);
+
+uint spider_param_log_result_error_with_sql()
+{
+ DBUG_ENTER("spider_param_log_result_error_with_sql");
+ DBUG_RETURN(spider_log_result_error_with_sql);
+}
+
+static char *spider_version = (char *) SPIDER_DETAIL_VERSION;
+static MYSQL_SYSVAR_STR(
+ version,
+ spider_version,
+ PLUGIN_VAR_NOCMDOPT | PLUGIN_VAR_READONLY,
+ "The version of Spider",
+ NULL,
+ NULL,
+ SPIDER_DETAIL_VERSION
+);
+
+/*
+ 0: server_id + thread_id
+ 1: server_id + thread_id + query_id
+ */
+static MYSQL_THDVAR_UINT(
+ internal_xa_id_type, /* name */
+ PLUGIN_VAR_RQCMDARG, /* opt */
+ "The type of internal_xa id", /* comment */
+ NULL, /* check */
+ NULL, /* update */
+ 0, /* def */
+ 0, /* min */
+ 1, /* max */
+ 0 /* blk */
+);
+
+uint spider_param_internal_xa_id_type(
+ THD *thd
+) {
+ DBUG_ENTER("spider_param_internal_xa_id_type");
+ DBUG_RETURN(THDVAR(thd, internal_xa_id_type));
+}
+
+/*
+ -1 :use table parameter
+ 0 :OFF
+ 1 :automatic channel
+ 2-63 :use custom channel
+ */
+static MYSQL_THDVAR_INT(
+ casual_read, /* name */
+ PLUGIN_VAR_RQCMDARG, /* opt */
+ "Read casually if it is possible", /* comment */
+ NULL, /* check */
+ NULL, /* update */
+ -1, /* def */
+ -1, /* min */
+ 63, /* max */
+ 0 /* blk */
+);
+
+int spider_param_casual_read(
+ THD *thd,
+ int casual_read
+) {
+ DBUG_ENTER("spider_param_casual_read");
+ DBUG_RETURN(THDVAR(thd, casual_read) == -1 ?
+ casual_read : THDVAR(thd, casual_read));
+}
+
+static my_bool spider_dry_access;
+static MYSQL_SYSVAR_BOOL(
+ dry_access,
+ spider_dry_access,
+ PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY,
+ "dry access",
+ NULL,
+ NULL,
+ FALSE
+);
+
+my_bool spider_param_dry_access()
+{
+ DBUG_ENTER("spider_param_dry_access");
+ DBUG_RETURN(spider_dry_access);
+}
+
+/*
+ -1 :use table parameter
+ 0 :fast
+ 1 :correct delete row number
+ */
+static MYSQL_THDVAR_INT(
+ delete_all_rows_type, /* name */
+ PLUGIN_VAR_RQCMDARG, /* opt */
+ "The type of delete_all_rows", /* comment */
+ NULL, /* check */
+ NULL, /* update */
+ -1, /* def */
+ -1, /* min */
+ 1, /* max */
+ 0 /* blk */
+);
+
+int spider_param_delete_all_rows_type(
+ THD *thd,
+ int delete_all_rows_type
+) {
+ DBUG_ENTER("spider_param_delete_all_rows_type");
+ DBUG_RETURN(THDVAR(thd, delete_all_rows_type) == -1 ?
+ delete_all_rows_type : THDVAR(thd, delete_all_rows_type));
+}
+
static struct st_mysql_storage_engine spider_storage_engine =
{ MYSQL_HANDLERTON_INTERFACE_VERSION };
@@ -2954,10 +3087,16 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
#endif
MYSQL_SYSVAR(general_log),
MYSQL_SYSVAR(log_result_errors),
+ MYSQL_SYSVAR(log_result_error_with_sql),
+ MYSQL_SYSVAR(version),
+ MYSQL_SYSVAR(internal_xa_id_type),
+ MYSQL_SYSVAR(casual_read),
+ MYSQL_SYSVAR(dry_access),
+ MYSQL_SYSVAR(delete_all_rows_type),
NULL
};
-maria_declare_plugin(spider)
+mysql_declare_plugin(spider)
{
MYSQL_STORAGE_ENGINE_PLUGIN,
&spider_storage_engine,
@@ -2967,11 +3106,34 @@ maria_declare_plugin(spider)
PLUGIN_LICENSE_GPL,
spider_db_init,
spider_db_done,
- 0x0300,
+ SPIDER_HEX_VERSION,
spider_status_variables,
spider_system_variables,
- "3.0",
- MariaDB_PLUGIN_MATURITY_BETA
+ NULL,
+#if MYSQL_VERSION_ID >= 50600
+ 0,
+#endif
},
spider_i_s_alloc_mem
+mysql_declare_plugin_end;
+
+#ifdef MARIADB_BASE_VERSION
+maria_declare_plugin(spider)
+{
+ MYSQL_STORAGE_ENGINE_PLUGIN,
+ &spider_storage_engine,
+ "SPIDER",
+ "Kentoku Shiba",
+ "Spider storage engine",
+ PLUGIN_LICENSE_GPL,
+ spider_db_init,
+ spider_db_done,
+ SPIDER_HEX_VERSION,
+ spider_status_variables,
+ spider_system_variables,
+ SPIDER_DETAIL_VERSION,
+ MariaDB_PLUGIN_MATURITY_GAMMA
+},
+spider_i_s_alloc_mem_maria
maria_declare_plugin_end;
+#endif
diff --git a/storage/spider/spd_param.h b/storage/spider/spd_param.h
index 2274743ba41..e68143aa774 100644
--- a/storage/spider/spd_param.h
+++ b/storage/spider/spd_param.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -370,3 +370,16 @@ int spider_param_udf_ds_use_real_table(
#endif
my_bool spider_param_general_log();
uint spider_param_log_result_errors();
+uint spider_param_log_result_error_with_sql();
+uint spider_param_internal_xa_id_type(
+ THD *thd
+);
+int spider_param_casual_read(
+ THD *thd,
+ int casual_read
+);
+my_bool spider_param_dry_access();
+int spider_param_delete_all_rows_type(
+ THD *thd,
+ int delete_all_rows_type
+);
diff --git a/storage/spider/spd_ping_table.cc b/storage/spider/spd_ping_table.cc
index 1ab5e51293b..193b60271c2 100644
--- a/storage/spider/spd_ping_table.cc
+++ b/storage/spider/spd_ping_table.cc
@@ -1,1456 +1,1456 @@
-/* Copyright (C) 2009-2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-#define MYSQL_SERVER 1
-#include "mysql_version.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_class.h"
-#include "sql_partition.h"
-#include "sql_acl.h"
-#endif
-#include "spd_err.h"
-#include "spd_param.h"
-#include "spd_db_include.h"
-#include "spd_include.h"
-#include "ha_spider.h"
-#include "spd_db_conn.h"
-#include "spd_trx.h"
-#include "spd_conn.h"
-#include "spd_sys_table.h"
-#include "spd_table.h"
-#include "spd_ping_table.h"
-#include "spd_direct_sql.h"
-#include "spd_udf.h"
-#include "spd_malloc.h"
-
-extern handlerton *spider_hton_ptr;
-
-#ifdef HAVE_PSI_INTERFACE
-extern PSI_mutex_key spd_key_mutex_mon_list_caller;
-extern PSI_mutex_key spd_key_mutex_mon_list_receptor;
-extern PSI_mutex_key spd_key_mutex_mon_list_monitor;
-extern PSI_mutex_key spd_key_mutex_mon_list_update_status;
-extern PSI_mutex_key spd_key_mutex_mon_table_cache;
-#endif
-
-#ifndef WITHOUT_SPIDER_BG_SEARCH
-extern pthread_mutex_t spider_global_trx_mutex;
-extern SPIDER_TRX *spider_global_trx;
-#endif
-
-HASH *spider_udf_table_mon_list_hash;
-uint spider_udf_table_mon_list_hash_id;
-const char *spider_udf_table_mon_list_hash_func_name;
-const char *spider_udf_table_mon_list_hash_file_name;
-ulong spider_udf_table_mon_list_hash_line_no;
-pthread_mutex_t *spider_udf_table_mon_mutexes;
-pthread_cond_t *spider_udf_table_mon_conds;
-
-pthread_mutex_t spider_mon_table_cache_mutex;
-DYNAMIC_ARRAY spider_mon_table_cache;
-uint spider_mon_table_cache_id;
-const char *spider_mon_table_cache_func_name;
-const char *spider_mon_table_cache_file_name;
-ulong spider_mon_table_cache_line_no;
-volatile ulonglong spider_mon_table_cache_version = 0;
-volatile ulonglong spider_mon_table_cache_version_req = 1;
-
-SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list(
- SPIDER_TRX *trx,
- THD *thd,
- spider_string *str,
- uint conv_name_length,
- int link_idx,
- uint32 server_id,
- bool need_lock,
- int *error_num
-) {
- uint mutex_hash;
- SPIDER_TABLE_MON_LIST *table_mon_list;
- MEM_ROOT mem_root;
- ulonglong mon_table_cache_version;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- my_hash_value_type hash_value;
-#endif
- DBUG_ENTER("spider_get_ping_table_mon_list");
- if (spider_mon_table_cache_version != spider_mon_table_cache_version_req)
- {
- SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
- if ((*error_num = spider_init_ping_table_mon_cache(thd, &mem_root,
- need_lock)))
- {
- free_root(&mem_root, MYF(0));
- goto error;
- }
- free_root(&mem_root, MYF(0));
- }
-
- mutex_hash = spider_udf_calc_hash(str->c_ptr(),
- spider_param_udf_table_mon_mutex_count());
- DBUG_PRINT("info",("spider hash key=%s", str->c_ptr()));
- DBUG_PRINT("info",("spider hash key length=%u", str->length()));
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- hash_value = my_calc_hash(
- &spider_udf_table_mon_list_hash[mutex_hash],
- (uchar*) str->c_ptr(), str->length());
-#endif
- pthread_mutex_lock(&spider_udf_table_mon_mutexes[mutex_hash]);
- mon_table_cache_version = (ulonglong) spider_mon_table_cache_version;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- if (!(table_mon_list = (SPIDER_TABLE_MON_LIST *)
- my_hash_search_using_hash_value(
- &spider_udf_table_mon_list_hash[mutex_hash], hash_value,
- (uchar*) str->c_ptr(), str->length())) ||
- table_mon_list->mon_table_cache_version != mon_table_cache_version
- )
-#else
- if (!(table_mon_list = (SPIDER_TABLE_MON_LIST *) my_hash_search(
- &spider_udf_table_mon_list_hash[mutex_hash],
- (uchar*) str->c_ptr(), str->length())) ||
- table_mon_list->mon_table_cache_version != mon_table_cache_version
- )
-#endif
- {
- DBUG_ASSERT(trx != spider_global_trx);
- if (
- table_mon_list &&
- table_mon_list->mon_table_cache_version != mon_table_cache_version
- )
- spider_release_ping_table_mon_list_loop(mutex_hash, table_mon_list);
-
- if (!(table_mon_list = spider_get_ping_table_tgt(thd, str->c_ptr(),
- conv_name_length, link_idx, server_id, str, need_lock, error_num)))
- {
- pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
- goto error;
- }
- table_mon_list->mutex_hash = mutex_hash;
- table_mon_list->mon_table_cache_version = mon_table_cache_version;
- uint old_elements =
- spider_udf_table_mon_list_hash[mutex_hash].array.max_element;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- table_mon_list->key_hash_value = hash_value;
-#endif
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(
- &spider_udf_table_mon_list_hash[mutex_hash],
- hash_value, (uchar*) table_mon_list))
-#else
- if (my_hash_insert(&spider_udf_table_mon_list_hash[mutex_hash],
- (uchar*) table_mon_list))
-#endif
- {
- spider_ping_table_free_mon_list(table_mon_list);
- *error_num = HA_ERR_OUT_OF_MEM;
- my_error(HA_ERR_OUT_OF_MEM, MYF(0));
- pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
- goto error;
- }
- if (spider_udf_table_mon_list_hash[mutex_hash].array.max_element >
- old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- spider_udf_table_mon_list_hash,
- (spider_udf_table_mon_list_hash[mutex_hash].array.max_element -
- old_elements) *
- spider_udf_table_mon_list_hash[mutex_hash].array.size_of_element);
- }
- }
- table_mon_list->use_count++;
- DBUG_PRINT("info",("spider table_mon_list->use_count=%d",
- table_mon_list->use_count));
- pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
- DBUG_RETURN(table_mon_list);
-
-error:
- DBUG_RETURN(NULL);
-}
-
-void spider_free_ping_table_mon_list(
- SPIDER_TABLE_MON_LIST *table_mon_list
-) {
- DBUG_ENTER("spider_free_ping_table_mon_list");
- pthread_mutex_lock(&spider_udf_table_mon_mutexes[
- table_mon_list->mutex_hash]);
- table_mon_list->use_count--;
- DBUG_PRINT("info",("spider table_mon_list->use_count=%d", table_mon_list->use_count));
- if (!table_mon_list->use_count)
- pthread_cond_broadcast(&spider_udf_table_mon_conds[
- table_mon_list->mutex_hash]);
- pthread_mutex_unlock(&spider_udf_table_mon_mutexes[
- table_mon_list->mutex_hash]);
- DBUG_VOID_RETURN;
-}
-
-void spider_release_ping_table_mon_list_loop(
- uint mutex_hash,
- SPIDER_TABLE_MON_LIST *table_mon_list
-) {
- DBUG_ENTER("spider_release_ping_table_mon_list_loop");
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&spider_udf_table_mon_list_hash[mutex_hash],
- table_mon_list->key_hash_value, (uchar*) table_mon_list);
-#else
- my_hash_delete(&spider_udf_table_mon_list_hash[mutex_hash],
- (uchar*) table_mon_list);
-#endif
- while (TRUE)
- {
- if (table_mon_list->use_count)
- pthread_cond_wait(&spider_udf_table_mon_conds[mutex_hash],
- &spider_udf_table_mon_mutexes[mutex_hash]);
- else {
- spider_ping_table_free_mon_list(table_mon_list);
- break;
- }
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_release_ping_table_mon_list(
- const char *conv_name,
- uint conv_name_length,
- int link_idx
-) {
- uint mutex_hash;
- SPIDER_TABLE_MON_LIST *table_mon_list;
- char link_idx_str[SPIDER_SQL_INT_LEN];
- int link_idx_str_length;
- DBUG_ENTER("spider_release_ping_table_mon_list");
- DBUG_PRINT("info", ("spider conv_name=%s", conv_name));
- DBUG_PRINT("info", ("spider conv_name_length=%u", conv_name_length));
- DBUG_PRINT("info", ("spider link_idx=%d", link_idx));
- link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
- link_idx));
-#ifdef _MSC_VER
- spider_string conv_name_str(conv_name_length + link_idx_str_length + 1);
- conv_name_str.set_charset(system_charset_info);
-#else
- char buf[conv_name_length + link_idx_str_length + 1];
- spider_string conv_name_str(buf, conv_name_length + link_idx_str_length + 1,
- system_charset_info);
-#endif
- conv_name_str.init_calc_mem(134);
- conv_name_str.length(0);
- conv_name_str.q_append(conv_name, conv_name_length);
- conv_name_str.q_append(link_idx_str, link_idx_str_length);
-
- mutex_hash = spider_udf_calc_hash(conv_name_str.c_ptr_safe(),
- spider_param_udf_table_mon_mutex_count());
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- my_hash_value_type hash_value = my_calc_hash(
- &spider_udf_table_mon_list_hash[mutex_hash],
- (uchar*) conv_name_str.c_ptr(), conv_name_str.length());
-#endif
- pthread_mutex_lock(&spider_udf_table_mon_mutexes[mutex_hash]);
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- if ((table_mon_list = (SPIDER_TABLE_MON_LIST *)
- my_hash_search_using_hash_value(
- &spider_udf_table_mon_list_hash[mutex_hash], hash_value,
- (uchar*) conv_name_str.c_ptr(), conv_name_str.length())))
-#else
- if ((table_mon_list = (SPIDER_TABLE_MON_LIST *) my_hash_search(
- &spider_udf_table_mon_list_hash[mutex_hash],
- (uchar*) conv_name_str.c_ptr(), conv_name_str.length())))
-#endif
- spider_release_ping_table_mon_list_loop(mutex_hash, table_mon_list);
- pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
- DBUG_VOID_RETURN;
-}
-
-int spider_get_ping_table_mon(
- THD *thd,
- SPIDER_TABLE_MON_LIST *table_mon_list,
- char *name,
- uint name_length,
- int link_idx,
- uint32 server_id,
- MEM_ROOT *mem_root,
- bool need_lock
-) {
- int error_num;
- TABLE *table_link_mon = NULL;
-#if MYSQL_VERSION_ID < 50500
- Open_tables_state open_tables_backup;
-#else
- Open_tables_backup open_tables_backup;
-#endif
- char table_key[MAX_KEY_LENGTH];
- SPIDER_TABLE_MON *table_mon, *table_mon_prev = NULL;
- SPIDER_SHARE *tmp_share;
- char **tmp_connect_info, *tmp_ptr;
- uint *tmp_connect_info_length;
- long *tmp_long;
- longlong *tmp_longlong;
- int list_size = 0;
- DBUG_ENTER("spider_get_ping_table_mon");
-
- if (
- !(table_link_mon = spider_open_sys_table(
- thd, SPIDER_SYS_LINK_MON_TABLE_NAME_STR,
- SPIDER_SYS_LINK_MON_TABLE_NAME_LEN, FALSE, &open_tables_backup,
- need_lock, &error_num))
- ) {
- my_error(error_num, MYF(0));
- goto error;
- }
- spider_store_tables_name(table_link_mon, name, name_length);
- spider_store_tables_link_idx(table_link_mon, link_idx);
- if (!(error_num = spider_ping_table_cache_compare(table_link_mon, mem_root)))
- goto create_table_mon;
- if (error_num == HA_ERR_OUT_OF_MEM)
- goto error;
- if ((tmp_ptr = strstr(name, "#P#")))
- {
- *tmp_ptr = '\0';
- spider_store_tables_name(table_link_mon, name, strlen(name));
- *tmp_ptr = '#';
- if (!(error_num = spider_ping_table_cache_compare(table_link_mon,
- mem_root)))
- goto create_table_mon;
- if (error_num == HA_ERR_OUT_OF_MEM)
- goto error;
- }
- error_num = HA_ERR_KEY_NOT_FOUND;
- table_link_mon->file->print_error(error_num, MYF(0));
- goto error;
-
-create_table_mon:
- if ((error_num = spider_get_sys_table_by_idx(table_link_mon, table_key,
- table_link_mon->s->primary_key, 3)))
- {
- table_link_mon->file->print_error(error_num, MYF(0));
- goto error;
- }
-
- do {
- if (!(table_mon = (SPIDER_TABLE_MON *)
- spider_bulk_malloc(spider_current_trx, 35, MYF(MY_WME | MY_ZEROFILL),
- &table_mon, sizeof(SPIDER_TABLE_MON),
- &tmp_share, sizeof(SPIDER_SHARE),
- &tmp_connect_info, sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT,
- &tmp_connect_info_length, sizeof(uint) * SPIDER_TMP_SHARE_UINT_COUNT,
- &tmp_long, sizeof(long) * SPIDER_TMP_SHARE_LONG_COUNT,
- &tmp_longlong, sizeof(longlong) * SPIDER_TMP_SHARE_LONGLONG_COUNT,
- NullS))
- ) {
- spider_sys_index_end(table_link_mon);
- error_num = HA_ERR_OUT_OF_MEM;
- my_error(HA_ERR_OUT_OF_MEM, MYF(0));
- goto error;
- }
- spider_set_tmp_share_pointer(tmp_share, tmp_connect_info,
- tmp_connect_info_length, tmp_long, tmp_longlong);
- tmp_share->link_statuses[0] = -1;
- table_mon->share = tmp_share;
- if (table_mon_prev)
- table_mon_prev->next = table_mon;
- else
- table_mon_list->first = table_mon;
- table_mon_prev = table_mon;
- if (
- (error_num = spider_get_sys_link_mon_server_id(
- table_link_mon, &table_mon->server_id, mem_root)) ||
- (error_num = spider_get_sys_link_mon_connect_info(
- table_link_mon, tmp_share, 0, mem_root))
- ) {
- table_link_mon->file->print_error(error_num, MYF(0));
- spider_sys_index_end(table_link_mon);
- goto error;
- }
- if (
- (error_num = spider_set_connect_info_default(
- tmp_share,
-#ifdef WITH_PARTITION_STORAGE_ENGINE
- NULL,
- NULL,
-#endif
- NULL
- )) ||
- (error_num = spider_set_connect_info_default_dbtable(
- tmp_share, name, name_length
- )) ||
- (error_num = spider_create_conn_keys(tmp_share))
- ) {
- spider_sys_index_end(table_link_mon);
- goto error;
- }
- DBUG_PRINT("info",("spider table_mon->server_id=%u",
- table_mon->server_id));
- DBUG_PRINT("info",("spider server_id=%u", server_id));
- if (table_mon->server_id == server_id)
- table_mon_list->current = table_mon;
- list_size++;
- error_num = spider_sys_index_next_same(table_link_mon, table_key);
- } while (error_num == 0);
- spider_sys_index_end(table_link_mon);
- spider_close_sys_table(thd, table_link_mon,
- &open_tables_backup, need_lock);
- table_link_mon = NULL;
- table_mon_list->list_size = list_size;
-
- if (!table_mon_list->current)
- {
- error_num = ER_SPIDER_UDF_PING_TABLE_NO_SERVER_ID_NUM;
- my_printf_error(ER_SPIDER_UDF_PING_TABLE_NO_SERVER_ID_NUM,
- ER_SPIDER_UDF_PING_TABLE_NO_SERVER_ID_STR, MYF(0));
- goto error;
- }
-
- DBUG_RETURN(0);
-
-error:
- if (table_link_mon)
- spider_close_sys_table(thd, table_link_mon,
- &open_tables_backup, need_lock);
- table_mon = table_mon_list->first;
- table_mon_list->first = NULL;
- table_mon_list->current = NULL;
- while (table_mon)
- {
- spider_free_tmp_share_alloc(table_mon->share);
- table_mon_prev = table_mon->next;
- spider_free(spider_current_trx, table_mon, MYF(0));
- table_mon = table_mon_prev;
- }
- DBUG_RETURN(error_num);
-}
-
-SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt(
- THD *thd,
- char *name,
- uint name_length,
- int link_idx,
- uint32 server_id,
- spider_string *str,
- bool need_lock,
- int *error_num
-) {
- TABLE *table_tables = NULL;
-#if MYSQL_VERSION_ID < 50500
- Open_tables_state open_tables_backup;
-#else
- Open_tables_backup open_tables_backup;
-#endif
- char table_key[MAX_KEY_LENGTH];
-
- SPIDER_TABLE_MON_LIST *table_mon_list = NULL;
- SPIDER_SHARE *tmp_share;
- char **tmp_connect_info;
- uint *tmp_connect_info_length;
- long *tmp_long;
- longlong *tmp_longlong;
- char *key_str;
- MEM_ROOT mem_root;
- DBUG_ENTER("spider_get_ping_table_tgt");
-
- SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
- if (!(table_mon_list = (SPIDER_TABLE_MON_LIST *)
- spider_bulk_malloc(spider_current_trx, 36, MYF(MY_WME | MY_ZEROFILL),
- &table_mon_list, sizeof(SPIDER_TABLE_MON_LIST),
- &tmp_share, sizeof(SPIDER_SHARE),
- &tmp_connect_info, sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT,
- &tmp_connect_info_length, sizeof(uint) * SPIDER_TMP_SHARE_UINT_COUNT,
- &tmp_long, sizeof(long) * SPIDER_TMP_SHARE_LONG_COUNT,
- &tmp_longlong, sizeof(longlong) * SPIDER_TMP_SHARE_LONGLONG_COUNT,
- &key_str, str->length() + 1,
- NullS))
- ) {
- my_error(HA_ERR_OUT_OF_MEM, MYF(0));
- goto error;
- }
- spider_set_tmp_share_pointer(tmp_share, tmp_connect_info,
- tmp_connect_info_length, tmp_long, tmp_longlong);
- table_mon_list->share = tmp_share;
- table_mon_list->key = key_str;
- table_mon_list->key_length = str->length();
- memcpy(key_str, str->ptr(), table_mon_list->key_length);
- tmp_share->access_charset = thd->variables.character_set_client;
-
- if (
- !(table_tables = spider_open_sys_table(
- thd, SPIDER_SYS_TABLES_TABLE_NAME_STR,
- SPIDER_SYS_TABLES_TABLE_NAME_LEN, FALSE, &open_tables_backup, need_lock,
- error_num))
- ) {
- my_error(*error_num, MYF(0));
- goto error;
- }
- spider_store_tables_name(table_tables, name, name_length);
- spider_store_tables_link_idx(table_tables, link_idx);
- if (
- (*error_num = spider_check_sys_table(table_tables, table_key)) ||
- (*error_num = spider_get_sys_tables_connect_info(
- table_tables, tmp_share, 0, &mem_root)) ||
- (*error_num = spider_get_sys_tables_link_status(
- table_tables, tmp_share, 0, &mem_root))
- ) {
- table_tables->file->print_error(*error_num, MYF(0));
- goto error;
- }
- spider_close_sys_table(thd, table_tables,
- &open_tables_backup, need_lock);
- table_tables = NULL;
-
- if (
- (*error_num = spider_set_connect_info_default(
- tmp_share,
-#ifdef WITH_PARTITION_STORAGE_ENGINE
- NULL,
- NULL,
-#endif
- NULL
- )) ||
- (*error_num = spider_set_connect_info_default_dbtable(
- tmp_share, name, name_length
- )) ||
- (*error_num = spider_create_conn_keys(tmp_share)) ||
-/*
- (*error_num = spider_db_create_table_names_str(tmp_share)) ||
-*/
- (*error_num = spider_get_ping_table_mon(
- thd, table_mon_list, name, name_length, link_idx, server_id, &mem_root,
- need_lock))
- )
- goto error;
-
- if (tmp_share->link_statuses[0] == SPIDER_LINK_STATUS_NG)
- table_mon_list->mon_status = SPIDER_LINK_MON_NG;
-
-#if MYSQL_VERSION_ID < 50500
- if (pthread_mutex_init(&table_mon_list->caller_mutex, MY_MUTEX_INIT_FAST))
-#else
- if (mysql_mutex_init(spd_key_mutex_mon_list_caller,
- &table_mon_list->caller_mutex, MY_MUTEX_INIT_FAST))
-#endif
- {
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error_caller_mutex_init;
- }
-#if MYSQL_VERSION_ID < 50500
- if (pthread_mutex_init(&table_mon_list->receptor_mutex, MY_MUTEX_INIT_FAST))
-#else
- if (mysql_mutex_init(spd_key_mutex_mon_list_receptor,
- &table_mon_list->receptor_mutex, MY_MUTEX_INIT_FAST))
-#endif
- {
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error_receptor_mutex_init;
- }
-#if MYSQL_VERSION_ID < 50500
- if (pthread_mutex_init(&table_mon_list->monitor_mutex, MY_MUTEX_INIT_FAST))
-#else
- if (mysql_mutex_init(spd_key_mutex_mon_list_monitor,
- &table_mon_list->monitor_mutex, MY_MUTEX_INIT_FAST))
-#endif
- {
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error_monitor_mutex_init;
- }
-#if MYSQL_VERSION_ID < 50500
- if (pthread_mutex_init(&table_mon_list->update_status_mutex,
- MY_MUTEX_INIT_FAST))
-#else
- if (mysql_mutex_init(spd_key_mutex_mon_list_update_status,
- &table_mon_list->update_status_mutex, MY_MUTEX_INIT_FAST))
-#endif
- {
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error_update_status_mutex_init;
- }
-
- free_root(&mem_root, MYF(0));
- DBUG_RETURN(table_mon_list);
-
-error_update_status_mutex_init:
- pthread_mutex_destroy(&table_mon_list->monitor_mutex);
-error_monitor_mutex_init:
- pthread_mutex_destroy(&table_mon_list->receptor_mutex);
-error_receptor_mutex_init:
- pthread_mutex_destroy(&table_mon_list->caller_mutex);
-error_caller_mutex_init:
-error:
- if (table_tables)
- spider_close_sys_table(thd, table_tables,
- &open_tables_backup, need_lock);
- free_root(&mem_root, MYF(0));
- if (table_mon_list)
- {
- spider_free_tmp_share_alloc(table_mon_list->share);
- spider_free(spider_current_trx, table_mon_list, MYF(0));
- }
- DBUG_RETURN(NULL);
-}
-
-SPIDER_CONN *spider_get_ping_table_tgt_conn(
- SPIDER_TRX *trx,
- SPIDER_SHARE *share,
- int *error_num
-) {
- SPIDER_CONN *conn;
- DBUG_ENTER("spider_get_ping_table_tgt_conn");
-#ifndef WITHOUT_SPIDER_BG_SEARCH
- if (trx == spider_global_trx)
- pthread_mutex_lock(&spider_global_trx_mutex);
-#endif
- if (
- !(conn = spider_get_conn(
- share, 0, share->conn_keys[0], trx, NULL, FALSE, FALSE,
- SPIDER_CONN_KIND_MYSQL, error_num))
- ) {
-#ifndef WITHOUT_SPIDER_BG_SEARCH
- if (trx == spider_global_trx)
- pthread_mutex_unlock(&spider_global_trx_mutex);
-#endif
- my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
- share->server_names[0]);
- *error_num = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
- goto error;
- }
- conn->error_mode = 0;
-#ifndef WITHOUT_SPIDER_BG_SEARCH
- if (trx == spider_global_trx)
- pthread_mutex_unlock(&spider_global_trx_mutex);
-#endif
- DBUG_RETURN(conn);
-
-error:
- DBUG_RETURN(NULL);
-}
-
-int spider_init_ping_table_mon_cache(
- THD *thd,
- MEM_ROOT *mem_root,
- bool need_lock
-) {
- int error_num, same;
- TABLE *table_link_mon = NULL;
-#if MYSQL_VERSION_ID < 50500
- Open_tables_state open_tables_backup;
-#else
- Open_tables_backup open_tables_backup;
-#endif
- SPIDER_MON_KEY mon_key;
- DBUG_ENTER("spider_init_ping_table_mon_cache");
-
- if (
- !(table_link_mon = spider_open_sys_table(
- thd, SPIDER_SYS_LINK_MON_TABLE_NAME_STR,
- SPIDER_SYS_LINK_MON_TABLE_NAME_LEN, FALSE, &open_tables_backup,
- need_lock, &error_num))
- ) {
- my_error(error_num, MYF(0));
- goto error_open_sys_table;
- }
-
- pthread_mutex_lock(&spider_mon_table_cache_mutex);
- if (spider_mon_table_cache_version != spider_mon_table_cache_version_req)
- {
- /* reset */
- spider_mon_table_cache.elements = 0;
-
- if ((error_num = spider_sys_index_first(table_link_mon,
- table_link_mon->s->primary_key)))
- {
- if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
- {
- table_link_mon->file->print_error(error_num, MYF(0));
- goto error_sys_index_first;
- }
- }
-
- if (!error_num)
- {
- mon_key.db_name_length = SPIDER_SYS_LINK_MON_TABLE_DB_NAME_SIZE + 1;
- mon_key.table_name_length = SPIDER_SYS_LINK_MON_TABLE_TABLE_NAME_SIZE + 1;
- mon_key.link_id_length = SPIDER_SYS_LINK_MON_TABLE_LINK_ID_SIZE + 1;
- do {
- if ((error_num = spider_get_sys_link_mon_key(table_link_mon, &mon_key,
- mem_root, &same)))
- goto error_get_sys_link_mon_key;
-
- if (!same)
- {
- mon_key.sort = spider_calc_for_sort(3, mon_key.db_name,
- mon_key.table_name, mon_key.link_id);
- if (push_dynamic(&spider_mon_table_cache, (uchar *) &mon_key))
- {
- error_num = HA_ERR_OUT_OF_MEM;
- goto error_push_dynamic;
- }
- }
-
- if ((error_num = spider_sys_index_next(table_link_mon)))
- {
- if (
- error_num != HA_ERR_KEY_NOT_FOUND &&
- error_num != HA_ERR_END_OF_FILE
- ) {
- table_link_mon->file->print_error(error_num, MYF(0));
- goto error_sys_index_next;
- }
- }
- } while (!error_num);
- spider_sys_index_end(table_link_mon);
- }
- my_qsort(
- (uchar *) dynamic_element(&spider_mon_table_cache, 0, SPIDER_MON_KEY *),
- spider_mon_table_cache.elements, sizeof(SPIDER_MON_KEY),
- (qsort_cmp) spider_compare_for_sort);
- uint old_elements = spider_mon_table_cache.max_element;
- freeze_size(&spider_mon_table_cache);
- if (spider_mon_table_cache.max_element < old_elements)
- {
- spider_free_mem_calc(spider_current_trx,
- spider_mon_table_cache_id,
- spider_mon_table_cache.max_element *
- spider_mon_table_cache.size_of_element);
- }
- spider_mon_table_cache_version = spider_mon_table_cache_version_req;
- }
- pthread_mutex_unlock(&spider_mon_table_cache_mutex);
- spider_close_sys_table(thd, table_link_mon, &open_tables_backup, need_lock);
- DBUG_RETURN(0);
-
-error_push_dynamic:
-error_get_sys_link_mon_key:
-error_sys_index_next:
- spider_sys_index_end(table_link_mon);
-error_sys_index_first:
- pthread_mutex_unlock(&spider_mon_table_cache_mutex);
- spider_close_sys_table(thd, table_link_mon, &open_tables_backup, need_lock);
-error_open_sys_table:
- DBUG_RETURN(error_num);
-}
-
-int spider_ping_table_cache_compare(
- TABLE *table,
- MEM_ROOT *mem_root
-) {
- uint32 roop_count;
- SPIDER_MON_KEY *mon_key;
- char *db_name, *table_name, *link_id;
- DBUG_ENTER("spider_ping_table_cache_compare");
-
- if (
- !(db_name = get_field(mem_root, table->field[0])) ||
- !(table_name = get_field(mem_root, table->field[1])) ||
- !(link_id = get_field(mem_root, table->field[2]))
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- DBUG_PRINT("info", ("spider db_name=%s", db_name));
- DBUG_PRINT("info", ("spider table_name=%s", table_name));
- DBUG_PRINT("info", ("spider link_id=%s", link_id));
-
- pthread_mutex_lock(&spider_mon_table_cache_mutex);
- for (roop_count = 0; roop_count < spider_mon_table_cache.elements;
- roop_count++)
- {
- mon_key = dynamic_element(&spider_mon_table_cache, roop_count,
- SPIDER_MON_KEY *);
- DBUG_PRINT("info", ("spider roop_count=%d", roop_count));
- DBUG_PRINT("info", ("spider mon_key.db_name=%s", mon_key->db_name));
- DBUG_PRINT("info", ("spider mon_key.table_name=%s", mon_key->table_name));
- DBUG_PRINT("info", ("spider mon_key.link_id=%s", mon_key->link_id));
- if (
- !wild_case_compare(system_charset_info, db_name, mon_key->db_name) &&
- !wild_case_compare(system_charset_info, table_name,
- mon_key->table_name) &&
- !wild_case_compare(system_charset_info, link_id, mon_key->link_id)
- ) {
- spider_store_db_and_table_name(
- table,
- mon_key->db_name,
- mon_key->db_name_length,
- mon_key->table_name,
- mon_key->table_name_length
- );
- spider_store_tables_link_idx_str(
- table,
- mon_key->link_id,
- mon_key->link_id_length
- );
- pthread_mutex_unlock(&spider_mon_table_cache_mutex);
- DBUG_PRINT("info", ("spider found"));
- DBUG_RETURN(0);
- }
- }
- pthread_mutex_unlock(&spider_mon_table_cache_mutex);
- DBUG_PRINT("info", ("spider not found"));
- DBUG_RETURN(1);
-}
-
-long long spider_ping_table_body(
- UDF_INIT *initid,
- UDF_ARGS *args,
- char *is_null,
- char *error
-) {
- int error_num = 0, link_idx, flags, full_mon_count, current_mon_count,
- success_count, fault_count, tmp_error_num = 0;
- uint32 first_sid;
- longlong limit, tmp_sid = -1;
- SPIDER_MON_TABLE_RESULT *mon_table_result =
- (SPIDER_MON_TABLE_RESULT *) initid->ptr;
- SPIDER_TRX *trx = mon_table_result->trx;
- THD *thd = trx->thd;
- SPIDER_CONN *ping_conn = NULL, *mon_conn;
- char *where_clause;
- SPIDER_TABLE_MON_LIST *table_mon_list;
- SPIDER_TABLE_MON *table_mon;
-
- char buf[MAX_FIELD_WIDTH];
- spider_string conv_name(buf, sizeof(buf), system_charset_info);
- int conv_name_length;
- char link_idx_str[SPIDER_SQL_INT_LEN];
- int link_idx_str_length;
- bool get_lock = FALSE;
- DBUG_ENTER("spider_ping_table_body");
- conv_name.init_calc_mem(135);
- conv_name.length(0);
- if (
- thd->open_tables != 0 ||
- thd->handler_tables_hash.records != 0 ||
- thd->derived_tables != 0 ||
- thd->lock != 0 ||
-#if MYSQL_VERSION_ID < 50500
- thd->locked_tables != 0 ||
- thd->prelocked_mode != NON_PRELOCKED
-#else
- thd->locked_tables_list.locked_tables() ||
- thd->locked_tables_mode != LTM_NONE
-#endif
- ) {
- if (thd->open_tables != 0)
- {
- my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
- ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
- "thd->open_tables", thd->open_tables);
- } else if (thd->handler_tables_hash.records != 0)
- {
- my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
- ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_NUM, MYF(0),
- "thd->handler_tables_hash.records",
- (longlong) thd->handler_tables_hash.records);
- } else if (thd->derived_tables != 0)
- {
- my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
- ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
- "thd->derived_tables", thd->derived_tables);
- } else if (thd->lock != 0)
- {
- my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
- ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
- "thd->lock", thd->lock);
-#if MYSQL_VERSION_ID < 50500
- } else if (thd->locked_tables != 0)
- {
- my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
- ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
- "thd->locked_tables", thd->locked_tables);
- } else if (thd->prelocked_mode != NON_PRELOCKED)
- {
- my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
- ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_NUM, MYF(0),
- "thd->prelocked_mode", (longlong) thd->prelocked_mode);
-#else
- } else if (thd->locked_tables_list.locked_tables())
- {
- my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
- ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
- "thd->locked_tables_list.locked_tables()",
- thd->locked_tables_list.locked_tables());
- } else if (thd->locked_tables_mode != LTM_NONE)
- {
- my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
- ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_NUM, MYF(0),
- "thd->locked_tables_mode", (longlong) thd->locked_tables_mode);
-#endif
- }
- goto error;
- }
-
- if (
- args->lengths[0] > SPIDER_CONNECT_INFO_MAX_LEN
- ) {
- my_printf_error(ER_SPIDER_UDF_PING_TABLE_PARAM_TOO_LONG_NUM,
- ER_SPIDER_UDF_PING_TABLE_PARAM_TOO_LONG_STR, MYF(0));
- goto error;
- }
- if (
- args->lengths[0] == 0
- ) {
- my_printf_error(ER_SPIDER_UDF_PING_TABLE_PARAM_REQIRED_NUM,
- ER_SPIDER_UDF_PING_TABLE_PARAM_REQIRED_STR, MYF(0));
- goto error;
- }
-
- link_idx = (int) (args->args[1] ? *((longlong *) args->args[1]) : 0);
- flags = (int) (args->args[2] ? *((longlong *) args->args[2]) : 0);
- limit = args->args[3] ? *((longlong *) args->args[3]) : 0;
- where_clause = args->args[4] ? args->args[4] : (char *) "";
-
- link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
- link_idx));
-
- if (conv_name.append(args->args[0], args->lengths[0],
- trx->thd->variables.character_set_client))
- {
- my_error(HA_ERR_OUT_OF_MEM, MYF(0));
- goto error;
- }
- conv_name_length = conv_name.length();
- if (conv_name.reserve(link_idx_str_length + 1))
- {
- my_error(HA_ERR_OUT_OF_MEM, MYF(0));
- goto error;
- }
- conv_name.q_append(link_idx_str, link_idx_str_length + 1);
- conv_name.length(conv_name.length() - 1);
-
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
- if (!(table_mon_list = spider_get_ping_table_mon_list(trx, trx->thd,
- &conv_name, conv_name_length, link_idx, global_system_variables.server_id,
- TRUE, &error_num)))
-#else
- if (!(table_mon_list = spider_get_ping_table_mon_list(trx, trx->thd,
- &conv_name, conv_name_length, link_idx, thd->server_id, TRUE, &error_num)))
-#endif
- goto error;
-
- if (table_mon_list->mon_status == SPIDER_LINK_MON_NG)
- {
- mon_table_result->result_status = SPIDER_LINK_MON_NG;
- DBUG_PRINT("info",
- ("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 1"));
- goto end;
- }
-
- if (args->args[5])
- tmp_sid = *((longlong *) args->args[5]);
-
- if (tmp_sid >= 0)
- {
- first_sid = (uint32) tmp_sid;
- full_mon_count = (int) (args->args[6] ? *((longlong *) args->args[6]) : 0);
- current_mon_count =
- (int) (args->args[7] ? *((longlong *) args->args[7]) + 1 : 1);
- if (full_mon_count != table_mon_list->list_size)
- {
- my_printf_error(ER_SPIDER_UDF_PING_TABLE_DIFFERENT_MON_NUM,
- ER_SPIDER_UDF_PING_TABLE_DIFFERENT_MON_STR, MYF(0));
- goto error_with_free_table_mon_list;
- }
- } else {
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
- first_sid = global_system_variables.server_id;
-#else
- first_sid = thd->server_id;
-#endif
- full_mon_count = table_mon_list->list_size;
- current_mon_count = 1;
- }
-
- success_count = (int) (args->args[8] ? *((longlong *) args->args[8]) : 0);
- fault_count = (int) (args->args[9] ? *((longlong *) args->args[9]) : 0);
- if (
- table_mon_list->mon_status != SPIDER_LINK_MON_NG &&
- !(ping_conn = spider_get_ping_table_tgt_conn(trx,
- table_mon_list->share, &error_num))
- ) {
- if (error_num == HA_ERR_OUT_OF_MEM)
- goto error_with_free_table_mon_list;
- else
- thd->clear_error();
- }
- if (
- table_mon_list->mon_status == SPIDER_LINK_MON_NG ||
- error_num ||
- (tmp_error_num = spider_db_udf_ping_table(table_mon_list, table_mon_list->share, trx,
- ping_conn, where_clause, args->lengths[4],
- (flags & SPIDER_UDF_PING_TABLE_PING_ONLY),
- (flags & SPIDER_UDF_PING_TABLE_USE_WHERE),
- limit
- ))
- ) {
- if (tmp_error_num == HA_ERR_OUT_OF_MEM)
- goto error_with_free_table_mon_list;
- else if(tmp_error_num)
- thd->clear_error();
- fault_count++;
- error_num = 0;
- if (fault_count > full_mon_count / 2)
- {
- mon_table_result->result_status = SPIDER_LINK_MON_NG;
- DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 2"));
- if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
- {
- pthread_mutex_lock(&table_mon_list->update_status_mutex);
- if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
- {
- table_mon_list->mon_status = SPIDER_LINK_MON_NG;
- table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG;
- spider_sys_update_tables_link_status(trx->thd,
- conv_name.c_ptr(), conv_name_length, link_idx,
- SPIDER_LINK_STATUS_NG, TRUE);
- spider_sys_log_tables_link_failed(trx->thd,
- conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
- }
- pthread_mutex_unlock(&table_mon_list->update_status_mutex);
- }
- goto end;
- }
- } else {
- success_count++;
- if (success_count > full_mon_count / 2)
- {
- mon_table_result->result_status = SPIDER_LINK_MON_OK;
- DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_OK 1"));
- goto end;
- }
- }
-
- if (tmp_sid < 0)
- {
- if (!pthread_mutex_trylock(&table_mon_list->receptor_mutex))
- get_lock = TRUE;
- }
-
- if (
- tmp_sid >= 0 ||
- get_lock
- ) {
- table_mon = table_mon_list->current->next;
- while (TRUE)
- {
- if (!table_mon)
- table_mon = table_mon_list->first;
- if (
- table_mon->server_id == first_sid ||
- current_mon_count > full_mon_count
- ) {
- if (success_count + fault_count > full_mon_count / 2)
- {
- mon_table_result->result_status = SPIDER_LINK_MON_DRAW;
- DBUG_PRINT("info",(
- "spider mon_table_result->result_status=SPIDER_LINK_MON_DRAW 1"));
- } else {
- mon_table_result->result_status = SPIDER_LINK_MON_DRAW_FEW_MON;
- DBUG_PRINT("info",(
- "spider mon_table_result->result_status=SPIDER_LINK_MON_DRAW_FEW_MON 1"));
- }
- table_mon_list->last_receptor_result = mon_table_result->result_status;
- break;
- }
- if ((mon_conn = spider_get_ping_table_tgt_conn(trx,
- table_mon->share, &error_num))
- ) {
- if (!spider_db_udf_ping_table_mon_next(
- thd, table_mon, mon_conn, mon_table_result, args->args[0],
- args->lengths[0], link_idx,
- where_clause, args->lengths[4], first_sid, full_mon_count,
- current_mon_count, success_count, fault_count, flags, limit))
- {
- if (
- mon_table_result->result_status == SPIDER_LINK_MON_NG &&
- table_mon_list->mon_status != SPIDER_LINK_MON_NG
- ) {
- pthread_mutex_lock(&table_mon_list->update_status_mutex);
- if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
- {
- table_mon_list->mon_status = SPIDER_LINK_MON_NG;
- table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG;
- spider_sys_update_tables_link_status(trx->thd,
- conv_name.c_ptr(), conv_name_length, link_idx,
- SPIDER_LINK_STATUS_NG, TRUE);
- spider_sys_log_tables_link_failed(trx->thd,
- conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
- }
- pthread_mutex_unlock(&table_mon_list->update_status_mutex);
- }
- table_mon_list->last_receptor_result =
- mon_table_result->result_status;
- break;
- }
- }
- thd->clear_error();
- table_mon = table_mon->next;
- current_mon_count++;
- }
- if (get_lock)
- pthread_mutex_unlock(&table_mon_list->receptor_mutex);
- } else {
- pthread_mutex_lock(&table_mon_list->receptor_mutex);
- mon_table_result->result_status = table_mon_list->last_receptor_result;
- DBUG_PRINT("info",("spider mon_table_result->result_status=%d 1",
- table_mon_list->last_receptor_result));
- pthread_mutex_unlock(&table_mon_list->receptor_mutex);
- }
-
-end:
- spider_free_ping_table_mon_list(table_mon_list);
- DBUG_RETURN(mon_table_result->result_status);
-
-error_with_free_table_mon_list:
- spider_free_ping_table_mon_list(table_mon_list);
-error:
- *error = 1;
- DBUG_RETURN(0);
-}
-
-my_bool spider_ping_table_init_body(
- UDF_INIT *initid,
- UDF_ARGS *args,
- char *message
-) {
- int error_num;
- THD *thd = current_thd;
- SPIDER_TRX *trx;
- SPIDER_MON_TABLE_RESULT *mon_table_result = NULL;
- DBUG_ENTER("spider_ping_table_init_body");
- if (args->arg_count != 10)
- {
- strcpy(message, "spider_ping_table() requires 10 arguments");
- goto error;
- }
- if (
- args->arg_type[0] != STRING_RESULT ||
- args->arg_type[4] != STRING_RESULT
- ) {
- strcpy(message, "spider_ping_table() requires string 1st "
- "and 5th arguments");
- goto error;
- }
- if (
- args->arg_type[1] != INT_RESULT ||
- args->arg_type[2] != INT_RESULT ||
- args->arg_type[3] != INT_RESULT ||
- args->arg_type[5] != INT_RESULT ||
- args->arg_type[6] != INT_RESULT ||
- args->arg_type[7] != INT_RESULT ||
- args->arg_type[8] != INT_RESULT ||
- args->arg_type[9] != INT_RESULT
- ) {
- strcpy(message, "spider_ping_table() requires integer 2nd, 3rd, 4,6,7,8,"
- "9th and 10th argument");
- goto error;
- }
-
- if (!(trx = spider_get_trx(thd, TRUE, &error_num)))
- {
- my_error(error_num, MYF(0));
- strcpy(message, spider_stmt_da_message(thd));
- goto error;
- }
-
- if (!(mon_table_result = (SPIDER_MON_TABLE_RESULT *)
- spider_malloc(spider_current_trx, 11, sizeof(SPIDER_MON_TABLE_RESULT),
- MYF(MY_WME | MY_ZEROFILL)))
- ) {
- strcpy(message, "spider_ping_table() out of memory");
- goto error;
- }
- mon_table_result->trx = trx;
- initid->ptr = (char *) mon_table_result;
- DBUG_RETURN(FALSE);
-
-error:
- if (mon_table_result)
- {
- spider_free(spider_current_trx, mon_table_result, MYF(0));
- }
- DBUG_RETURN(TRUE);
-}
-
-void spider_ping_table_deinit_body(
- UDF_INIT *initid
-) {
- SPIDER_MON_TABLE_RESULT *mon_table_result =
- (SPIDER_MON_TABLE_RESULT *) initid->ptr;
- DBUG_ENTER("spider_ping_table_deinit_body");
- if (mon_table_result)
- {
- spider_free(spider_current_trx, mon_table_result, MYF(0));
- }
- DBUG_VOID_RETURN;
-}
-
-long long spider_flush_table_mon_cache_body()
-{
- DBUG_ENTER("spider_flush_table_mon_cache_body");
- spider_mon_table_cache_version_req++;
- DBUG_RETURN(1);
-}
-
-void spider_ping_table_free_mon_list(
- SPIDER_TABLE_MON_LIST *table_mon_list
-) {
- DBUG_ENTER("spider_ping_table_free_mon_list");
- if (table_mon_list)
- {
- spider_ping_table_free_mon(table_mon_list->first);
- spider_free_tmp_share_alloc(table_mon_list->share);
- pthread_mutex_destroy(&table_mon_list->update_status_mutex);
- pthread_mutex_destroy(&table_mon_list->monitor_mutex);
- pthread_mutex_destroy(&table_mon_list->receptor_mutex);
- pthread_mutex_destroy(&table_mon_list->caller_mutex);
- spider_free(spider_current_trx, table_mon_list, MYF(0));
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_ping_table_free_mon(
- SPIDER_TABLE_MON *table_mon
-) {
- SPIDER_TABLE_MON *table_mon_next;
- DBUG_ENTER("spider_ping_table_free_mon");
- while (table_mon)
- {
- spider_free_tmp_share_alloc(table_mon->share);
- table_mon_next = table_mon->next;
- spider_free(spider_current_trx, table_mon, MYF(0));
- table_mon = table_mon_next;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_ping_table_mon_from_table(
- SPIDER_TRX *trx,
- THD *thd,
- SPIDER_SHARE *share,
- uint32 server_id,
- char *conv_name,
- uint conv_name_length,
- int link_idx,
- char *where_clause,
- uint where_clause_length,
- long monitoring_kind,
- longlong monitoring_limit,
- bool need_lock
-) {
- int error_num = 0, current_mon_count, flags;
- uint32 first_sid;
-/*
- THD *thd = trx->thd;
-*/
- SPIDER_TABLE_MON_LIST *table_mon_list;
- SPIDER_TABLE_MON *table_mon;
- SPIDER_MON_TABLE_RESULT mon_table_result;
- SPIDER_CONN *mon_conn;
- TABLE_SHARE *table_share = share->table_share;
- char link_idx_str[SPIDER_SQL_INT_LEN];
- int link_idx_str_length;
- uint sql_command = thd_sql_command(thd);
- DBUG_ENTER("spider_ping_table_mon_from_table");
- if (table_share->tmp_table != NO_TMP_TABLE)
- {
- my_printf_error(ER_SPIDER_TMP_TABLE_MON_NUM,
- ER_SPIDER_TMP_TABLE_MON_STR, MYF(0));
- DBUG_RETURN(ER_SPIDER_TMP_TABLE_MON_NUM);
- }
- if (
- sql_command == SQLCOM_DROP_TABLE ||
- sql_command == SQLCOM_ALTER_TABLE
- ) {
- my_printf_error(ER_SPIDER_MON_AT_ALTER_TABLE_NUM,
- ER_SPIDER_MON_AT_ALTER_TABLE_STR, MYF(0));
- DBUG_RETURN(ER_SPIDER_MON_AT_ALTER_TABLE_NUM);
- }
-
- link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
- link_idx));
-#ifdef _MSC_VER
- spider_string conv_name_str(conv_name_length + link_idx_str_length + 1);
- conv_name_str.set_charset(system_charset_info);
- *((char *)(conv_name_str.ptr() + conv_name_length + link_idx_str_length)) =
- '\0';
-#else
- char buf[conv_name_length + link_idx_str_length + 1];
- buf[conv_name_length + link_idx_str_length] = '\0';
- spider_string conv_name_str(buf, conv_name_length + link_idx_str_length + 1,
- system_charset_info);
-#endif
- conv_name_str.init_calc_mem(136);
- conv_name_str.length(0);
- conv_name_str.q_append(conv_name, conv_name_length);
- conv_name_str.q_append(link_idx_str, link_idx_str_length + 1);
- conv_name_str.length(conv_name_str.length() - 1);
-
- if (monitoring_kind == 1)
- flags = SPIDER_UDF_PING_TABLE_PING_ONLY;
- else if (monitoring_kind == 3)
- flags = SPIDER_UDF_PING_TABLE_USE_WHERE;
- else
- flags = 0;
-
- if (!(table_mon_list = spider_get_ping_table_mon_list(trx, thd,
- &conv_name_str, conv_name_length, link_idx, server_id, need_lock,
- &error_num)))
- goto end;
-
- if (table_mon_list->mon_status == SPIDER_LINK_MON_NG)
- {
- DBUG_PRINT("info",
- ("spider share->link_statuses[%d]=SPIDER_LINK_STATUS_NG", link_idx));
- share->link_statuses[link_idx] = SPIDER_LINK_STATUS_NG;
- error_num = ER_SPIDER_LINK_MON_NG_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_NG_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- goto end_with_free_table_mon_list;
- }
-
- if (!pthread_mutex_trylock(&table_mon_list->caller_mutex))
- {
- table_mon = table_mon_list->current;
- first_sid = table_mon->server_id;
- current_mon_count = 1;
- while (TRUE)
- {
- if (!table_mon)
- table_mon = table_mon_list->first;
- if (
- current_mon_count > table_mon_list->list_size ||
- (current_mon_count > 1 && table_mon->server_id == first_sid)
- ) {
- table_mon_list->last_caller_result = SPIDER_LINK_MON_DRAW_FEW_MON;
- mon_table_result.result_status = SPIDER_LINK_MON_DRAW_FEW_MON;
- DBUG_PRINT("info",(
- "spider mon_table_result->result_status=SPIDER_LINK_MON_DRAW_FEW_MON 1"));
- error_num = ER_SPIDER_LINK_MON_DRAW_FEW_MON_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_DRAW_FEW_MON_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- break;
- }
- thd->clear_error();
- if ((mon_conn = spider_get_ping_table_tgt_conn(trx,
- table_mon->share, &error_num))
- ) {
- if (!spider_db_udf_ping_table_mon_next(
- thd, table_mon, mon_conn, &mon_table_result, conv_name,
- conv_name_length, link_idx,
- where_clause, where_clause_length, -1, table_mon_list->list_size,
- 0, 0, 0, flags, monitoring_limit))
- {
- if (
- mon_table_result.result_status == SPIDER_LINK_MON_NG &&
- table_mon_list->mon_status != SPIDER_LINK_MON_NG
- ) {
- pthread_mutex_lock(&table_mon_list->update_status_mutex);
- if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
- {
- table_mon_list->mon_status = SPIDER_LINK_MON_NG;
- table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG;
- DBUG_PRINT("info", (
- "spider share->link_statuses[%d]=SPIDER_LINK_STATUS_NG",
- link_idx));
- share->link_statuses[link_idx] = SPIDER_LINK_STATUS_NG;
- spider_sys_update_tables_link_status(thd, conv_name,
- conv_name_length, link_idx, SPIDER_LINK_STATUS_NG, need_lock);
- spider_sys_log_tables_link_failed(thd, conv_name,
- conv_name_length, link_idx, need_lock);
- }
- pthread_mutex_unlock(&table_mon_list->update_status_mutex);
- }
- table_mon_list->last_caller_result = mon_table_result.result_status;
- if (mon_table_result.result_status == SPIDER_LINK_MON_OK)
- {
- error_num = ER_SPIDER_LINK_MON_OK_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_OK_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- break;
- }
- if (mon_table_result.result_status == SPIDER_LINK_MON_NG)
- {
- error_num = ER_SPIDER_LINK_MON_NG_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_NG_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- break;
- }
- if (mon_table_result.result_status ==
- SPIDER_LINK_MON_DRAW_FEW_MON)
- {
- error_num = ER_SPIDER_LINK_MON_DRAW_FEW_MON_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_DRAW_FEW_MON_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- break;
- }
- error_num = ER_SPIDER_LINK_MON_DRAW_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_DRAW_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- break;
- }
- }
- table_mon = table_mon->next;
- current_mon_count++;
- }
- pthread_mutex_unlock(&table_mon_list->caller_mutex);
- } else {
- pthread_mutex_lock(&table_mon_list->caller_mutex);
- switch (table_mon_list->last_caller_result)
- {
- case SPIDER_LINK_MON_OK:
- error_num = ER_SPIDER_LINK_MON_OK_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_OK_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- break;
- case SPIDER_LINK_MON_NG:
- error_num = ER_SPIDER_LINK_MON_NG_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_NG_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- break;
- case SPIDER_LINK_MON_DRAW_FEW_MON:
- error_num = ER_SPIDER_LINK_MON_DRAW_FEW_MON_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_DRAW_FEW_MON_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- break;
- default:
- error_num = ER_SPIDER_LINK_MON_DRAW_NUM;
- my_printf_error(error_num,
- ER_SPIDER_LINK_MON_DRAW_STR, MYF(0),
- table_mon_list->share->tgt_dbs[0],
- table_mon_list->share->tgt_table_names[0]);
- break;
- }
- pthread_mutex_unlock(&table_mon_list->caller_mutex);
- }
-
-end_with_free_table_mon_list:
- spider_free_ping_table_mon_list(table_mon_list);
-end:
- DBUG_RETURN(error_num);
-}
+/* Copyright (C) 2009-2014 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#define MYSQL_SERVER 1
+#include "mysql_version.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_class.h"
+#include "sql_partition.h"
+#include "sql_acl.h"
+#endif
+#include "spd_err.h"
+#include "spd_param.h"
+#include "spd_db_include.h"
+#include "spd_include.h"
+#include "ha_spider.h"
+#include "spd_db_conn.h"
+#include "spd_trx.h"
+#include "spd_conn.h"
+#include "spd_sys_table.h"
+#include "spd_table.h"
+#include "spd_ping_table.h"
+#include "spd_direct_sql.h"
+#include "spd_udf.h"
+#include "spd_malloc.h"
+
+extern handlerton *spider_hton_ptr;
+
+#ifdef HAVE_PSI_INTERFACE
+extern PSI_mutex_key spd_key_mutex_mon_list_caller;
+extern PSI_mutex_key spd_key_mutex_mon_list_receptor;
+extern PSI_mutex_key spd_key_mutex_mon_list_monitor;
+extern PSI_mutex_key spd_key_mutex_mon_list_update_status;
+extern PSI_mutex_key spd_key_mutex_mon_table_cache;
+#endif
+
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+extern pthread_mutex_t spider_global_trx_mutex;
+extern SPIDER_TRX *spider_global_trx;
+#endif
+
+HASH *spider_udf_table_mon_list_hash;
+uint spider_udf_table_mon_list_hash_id;
+const char *spider_udf_table_mon_list_hash_func_name;
+const char *spider_udf_table_mon_list_hash_file_name;
+ulong spider_udf_table_mon_list_hash_line_no;
+pthread_mutex_t *spider_udf_table_mon_mutexes;
+pthread_cond_t *spider_udf_table_mon_conds;
+
+pthread_mutex_t spider_mon_table_cache_mutex;
+DYNAMIC_ARRAY spider_mon_table_cache;
+uint spider_mon_table_cache_id;
+const char *spider_mon_table_cache_func_name;
+const char *spider_mon_table_cache_file_name;
+ulong spider_mon_table_cache_line_no;
+volatile ulonglong spider_mon_table_cache_version = 0;
+volatile ulonglong spider_mon_table_cache_version_req = 1;
+
+SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list(
+ SPIDER_TRX *trx,
+ THD *thd,
+ spider_string *str,
+ uint conv_name_length,
+ int link_idx,
+ uint32 server_id,
+ bool need_lock,
+ int *error_num
+) {
+ uint mutex_hash;
+ SPIDER_TABLE_MON_LIST *table_mon_list;
+ MEM_ROOT mem_root;
+ ulonglong mon_table_cache_version;
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ my_hash_value_type hash_value;
+#endif
+ DBUG_ENTER("spider_get_ping_table_mon_list");
+ if (spider_mon_table_cache_version != spider_mon_table_cache_version_req)
+ {
+ SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
+ if ((*error_num = spider_init_ping_table_mon_cache(thd, &mem_root,
+ need_lock)))
+ {
+ free_root(&mem_root, MYF(0));
+ goto error;
+ }
+ free_root(&mem_root, MYF(0));
+ }
+
+ mutex_hash = spider_udf_calc_hash(str->c_ptr(),
+ spider_param_udf_table_mon_mutex_count());
+ DBUG_PRINT("info",("spider hash key=%s", str->c_ptr()));
+ DBUG_PRINT("info",("spider hash key length=%u", str->length()));
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ hash_value = my_calc_hash(
+ &spider_udf_table_mon_list_hash[mutex_hash],
+ (uchar*) str->c_ptr(), str->length());
+#endif
+ pthread_mutex_lock(&spider_udf_table_mon_mutexes[mutex_hash]);
+ mon_table_cache_version = (ulonglong) spider_mon_table_cache_version;
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ if (!(table_mon_list = (SPIDER_TABLE_MON_LIST *)
+ my_hash_search_using_hash_value(
+ &spider_udf_table_mon_list_hash[mutex_hash], hash_value,
+ (uchar*) str->c_ptr(), str->length())) ||
+ table_mon_list->mon_table_cache_version != mon_table_cache_version
+ )
+#else
+ if (!(table_mon_list = (SPIDER_TABLE_MON_LIST *) my_hash_search(
+ &spider_udf_table_mon_list_hash[mutex_hash],
+ (uchar*) str->c_ptr(), str->length())) ||
+ table_mon_list->mon_table_cache_version != mon_table_cache_version
+ )
+#endif
+ {
+ DBUG_ASSERT(trx != spider_global_trx);
+ if (
+ table_mon_list &&
+ table_mon_list->mon_table_cache_version != mon_table_cache_version
+ )
+ spider_release_ping_table_mon_list_loop(mutex_hash, table_mon_list);
+
+ if (!(table_mon_list = spider_get_ping_table_tgt(thd, str->c_ptr(),
+ conv_name_length, link_idx, server_id, str, need_lock, error_num)))
+ {
+ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
+ goto error;
+ }
+ table_mon_list->mutex_hash = mutex_hash;
+ table_mon_list->mon_table_cache_version = mon_table_cache_version;
+ uint old_elements =
+ spider_udf_table_mon_list_hash[mutex_hash].array.max_element;
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ table_mon_list->key_hash_value = hash_value;
+#endif
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ if (my_hash_insert_with_hash_value(
+ &spider_udf_table_mon_list_hash[mutex_hash],
+ hash_value, (uchar*) table_mon_list))
+#else
+ if (my_hash_insert(&spider_udf_table_mon_list_hash[mutex_hash],
+ (uchar*) table_mon_list))
+#endif
+ {
+ spider_ping_table_free_mon_list(table_mon_list);
+ *error_num = HA_ERR_OUT_OF_MEM;
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
+ goto error;
+ }
+ if (spider_udf_table_mon_list_hash[mutex_hash].array.max_element >
+ old_elements)
+ {
+ spider_alloc_calc_mem(spider_current_trx,
+ spider_udf_table_mon_list_hash,
+ (spider_udf_table_mon_list_hash[mutex_hash].array.max_element -
+ old_elements) *
+ spider_udf_table_mon_list_hash[mutex_hash].array.size_of_element);
+ }
+ }
+ table_mon_list->use_count++;
+ DBUG_PRINT("info",("spider table_mon_list->use_count=%d",
+ table_mon_list->use_count));
+ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
+ DBUG_RETURN(table_mon_list);
+
+error:
+ DBUG_RETURN(NULL);
+}
+
+void spider_free_ping_table_mon_list(
+ SPIDER_TABLE_MON_LIST *table_mon_list
+) {
+ DBUG_ENTER("spider_free_ping_table_mon_list");
+ pthread_mutex_lock(&spider_udf_table_mon_mutexes[
+ table_mon_list->mutex_hash]);
+ table_mon_list->use_count--;
+ DBUG_PRINT("info",("spider table_mon_list->use_count=%d", table_mon_list->use_count));
+ if (!table_mon_list->use_count)
+ pthread_cond_broadcast(&spider_udf_table_mon_conds[
+ table_mon_list->mutex_hash]);
+ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[
+ table_mon_list->mutex_hash]);
+ DBUG_VOID_RETURN;
+}
+
+void spider_release_ping_table_mon_list_loop(
+ uint mutex_hash,
+ SPIDER_TABLE_MON_LIST *table_mon_list
+) {
+ DBUG_ENTER("spider_release_ping_table_mon_list_loop");
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ my_hash_delete_with_hash_value(&spider_udf_table_mon_list_hash[mutex_hash],
+ table_mon_list->key_hash_value, (uchar*) table_mon_list);
+#else
+ my_hash_delete(&spider_udf_table_mon_list_hash[mutex_hash],
+ (uchar*) table_mon_list);
+#endif
+ while (TRUE)
+ {
+ if (table_mon_list->use_count)
+ pthread_cond_wait(&spider_udf_table_mon_conds[mutex_hash],
+ &spider_udf_table_mon_mutexes[mutex_hash]);
+ else {
+ spider_ping_table_free_mon_list(table_mon_list);
+ break;
+ }
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_release_ping_table_mon_list(
+ const char *conv_name,
+ uint conv_name_length,
+ int link_idx
+) {
+ uint mutex_hash;
+ SPIDER_TABLE_MON_LIST *table_mon_list;
+ char link_idx_str[SPIDER_SQL_INT_LEN];
+ int link_idx_str_length;
+ DBUG_ENTER("spider_release_ping_table_mon_list");
+ DBUG_PRINT("info", ("spider conv_name=%s", conv_name));
+ DBUG_PRINT("info", ("spider conv_name_length=%u", conv_name_length));
+ DBUG_PRINT("info", ("spider link_idx=%d", link_idx));
+ link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
+ link_idx));
+#ifdef _MSC_VER
+ spider_string conv_name_str(conv_name_length + link_idx_str_length + 1);
+ conv_name_str.set_charset(system_charset_info);
+#else
+ char buf[conv_name_length + link_idx_str_length + 1];
+ spider_string conv_name_str(buf, conv_name_length + link_idx_str_length + 1,
+ system_charset_info);
+#endif
+ conv_name_str.init_calc_mem(134);
+ conv_name_str.length(0);
+ conv_name_str.q_append(conv_name, conv_name_length);
+ conv_name_str.q_append(link_idx_str, link_idx_str_length);
+
+ mutex_hash = spider_udf_calc_hash(conv_name_str.c_ptr_safe(),
+ spider_param_udf_table_mon_mutex_count());
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ my_hash_value_type hash_value = my_calc_hash(
+ &spider_udf_table_mon_list_hash[mutex_hash],
+ (uchar*) conv_name_str.c_ptr(), conv_name_str.length());
+#endif
+ pthread_mutex_lock(&spider_udf_table_mon_mutexes[mutex_hash]);
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ if ((table_mon_list = (SPIDER_TABLE_MON_LIST *)
+ my_hash_search_using_hash_value(
+ &spider_udf_table_mon_list_hash[mutex_hash], hash_value,
+ (uchar*) conv_name_str.c_ptr(), conv_name_str.length())))
+#else
+ if ((table_mon_list = (SPIDER_TABLE_MON_LIST *) my_hash_search(
+ &spider_udf_table_mon_list_hash[mutex_hash],
+ (uchar*) conv_name_str.c_ptr(), conv_name_str.length())))
+#endif
+ spider_release_ping_table_mon_list_loop(mutex_hash, table_mon_list);
+ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
+ DBUG_VOID_RETURN;
+}
+
+int spider_get_ping_table_mon(
+ THD *thd,
+ SPIDER_TABLE_MON_LIST *table_mon_list,
+ char *name,
+ uint name_length,
+ int link_idx,
+ uint32 server_id,
+ MEM_ROOT *mem_root,
+ bool need_lock
+) {
+ int error_num;
+ TABLE *table_link_mon = NULL;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup;
+#else
+ Open_tables_backup open_tables_backup;
+#endif
+ char table_key[MAX_KEY_LENGTH];
+ SPIDER_TABLE_MON *table_mon, *table_mon_prev = NULL;
+ SPIDER_SHARE *tmp_share;
+ char **tmp_connect_info, *tmp_ptr;
+ uint *tmp_connect_info_length;
+ long *tmp_long;
+ longlong *tmp_longlong;
+ int list_size = 0;
+ DBUG_ENTER("spider_get_ping_table_mon");
+
+ if (
+ !(table_link_mon = spider_open_sys_table(
+ thd, SPIDER_SYS_LINK_MON_TABLE_NAME_STR,
+ SPIDER_SYS_LINK_MON_TABLE_NAME_LEN, FALSE, &open_tables_backup,
+ need_lock, &error_num))
+ ) {
+ my_error(error_num, MYF(0));
+ goto error;
+ }
+ spider_store_tables_name(table_link_mon, name, name_length);
+ spider_store_tables_link_idx(table_link_mon, link_idx);
+ if (!(error_num = spider_ping_table_cache_compare(table_link_mon, mem_root)))
+ goto create_table_mon;
+ if (error_num == HA_ERR_OUT_OF_MEM)
+ goto error;
+ if ((tmp_ptr = strstr(name, "#P#")))
+ {
+ *tmp_ptr = '\0';
+ spider_store_tables_name(table_link_mon, name, strlen(name));
+ *tmp_ptr = '#';
+ if (!(error_num = spider_ping_table_cache_compare(table_link_mon,
+ mem_root)))
+ goto create_table_mon;
+ if (error_num == HA_ERR_OUT_OF_MEM)
+ goto error;
+ }
+ error_num = HA_ERR_KEY_NOT_FOUND;
+ table_link_mon->file->print_error(error_num, MYF(0));
+ goto error;
+
+create_table_mon:
+ if ((error_num = spider_get_sys_table_by_idx(table_link_mon, table_key,
+ table_link_mon->s->primary_key, 3)))
+ {
+ table_link_mon->file->print_error(error_num, MYF(0));
+ goto error;
+ }
+
+ do {
+ if (!(table_mon = (SPIDER_TABLE_MON *)
+ spider_bulk_malloc(spider_current_trx, 35, MYF(MY_WME | MY_ZEROFILL),
+ &table_mon, sizeof(SPIDER_TABLE_MON),
+ &tmp_share, sizeof(SPIDER_SHARE),
+ &tmp_connect_info, sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT,
+ &tmp_connect_info_length, sizeof(uint) * SPIDER_TMP_SHARE_UINT_COUNT,
+ &tmp_long, sizeof(long) * SPIDER_TMP_SHARE_LONG_COUNT,
+ &tmp_longlong, sizeof(longlong) * SPIDER_TMP_SHARE_LONGLONG_COUNT,
+ NullS))
+ ) {
+ spider_sys_index_end(table_link_mon);
+ error_num = HA_ERR_OUT_OF_MEM;
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ goto error;
+ }
+ spider_set_tmp_share_pointer(tmp_share, tmp_connect_info,
+ tmp_connect_info_length, tmp_long, tmp_longlong);
+ tmp_share->link_statuses[0] = -1;
+ table_mon->share = tmp_share;
+ if (table_mon_prev)
+ table_mon_prev->next = table_mon;
+ else
+ table_mon_list->first = table_mon;
+ table_mon_prev = table_mon;
+ if (
+ (error_num = spider_get_sys_link_mon_server_id(
+ table_link_mon, &table_mon->server_id, mem_root)) ||
+ (error_num = spider_get_sys_link_mon_connect_info(
+ table_link_mon, tmp_share, 0, mem_root))
+ ) {
+ table_link_mon->file->print_error(error_num, MYF(0));
+ spider_sys_index_end(table_link_mon);
+ goto error;
+ }
+ if (
+ (error_num = spider_set_connect_info_default(
+ tmp_share,
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ NULL,
+ NULL,
+#endif
+ NULL
+ )) ||
+ (error_num = spider_set_connect_info_default_dbtable(
+ tmp_share, name, name_length
+ )) ||
+ (error_num = spider_create_conn_keys(tmp_share))
+ ) {
+ spider_sys_index_end(table_link_mon);
+ goto error;
+ }
+ DBUG_PRINT("info",("spider table_mon->server_id=%u",
+ table_mon->server_id));
+ DBUG_PRINT("info",("spider server_id=%u", server_id));
+ if (table_mon->server_id == server_id)
+ table_mon_list->current = table_mon;
+ list_size++;
+ error_num = spider_sys_index_next_same(table_link_mon, table_key);
+ } while (error_num == 0);
+ spider_sys_index_end(table_link_mon);
+ spider_close_sys_table(thd, table_link_mon,
+ &open_tables_backup, need_lock);
+ table_link_mon = NULL;
+ table_mon_list->list_size = list_size;
+
+ if (!table_mon_list->current)
+ {
+ error_num = ER_SPIDER_UDF_PING_TABLE_NO_SERVER_ID_NUM;
+ my_printf_error(ER_SPIDER_UDF_PING_TABLE_NO_SERVER_ID_NUM,
+ ER_SPIDER_UDF_PING_TABLE_NO_SERVER_ID_STR, MYF(0));
+ goto error;
+ }
+
+ DBUG_RETURN(0);
+
+error:
+ if (table_link_mon)
+ spider_close_sys_table(thd, table_link_mon,
+ &open_tables_backup, need_lock);
+ table_mon = table_mon_list->first;
+ table_mon_list->first = NULL;
+ table_mon_list->current = NULL;
+ while (table_mon)
+ {
+ spider_free_tmp_share_alloc(table_mon->share);
+ table_mon_prev = table_mon->next;
+ spider_free(spider_current_trx, table_mon, MYF(0));
+ table_mon = table_mon_prev;
+ }
+ DBUG_RETURN(error_num);
+}
+
+SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt(
+ THD *thd,
+ char *name,
+ uint name_length,
+ int link_idx,
+ uint32 server_id,
+ spider_string *str,
+ bool need_lock,
+ int *error_num
+) {
+ TABLE *table_tables = NULL;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup;
+#else
+ Open_tables_backup open_tables_backup;
+#endif
+ char table_key[MAX_KEY_LENGTH];
+
+ SPIDER_TABLE_MON_LIST *table_mon_list = NULL;
+ SPIDER_SHARE *tmp_share;
+ char **tmp_connect_info;
+ uint *tmp_connect_info_length;
+ long *tmp_long;
+ longlong *tmp_longlong;
+ char *key_str;
+ MEM_ROOT mem_root;
+ DBUG_ENTER("spider_get_ping_table_tgt");
+
+ SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
+ if (!(table_mon_list = (SPIDER_TABLE_MON_LIST *)
+ spider_bulk_malloc(spider_current_trx, 36, MYF(MY_WME | MY_ZEROFILL),
+ &table_mon_list, sizeof(SPIDER_TABLE_MON_LIST),
+ &tmp_share, sizeof(SPIDER_SHARE),
+ &tmp_connect_info, sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT,
+ &tmp_connect_info_length, sizeof(uint) * SPIDER_TMP_SHARE_UINT_COUNT,
+ &tmp_long, sizeof(long) * SPIDER_TMP_SHARE_LONG_COUNT,
+ &tmp_longlong, sizeof(longlong) * SPIDER_TMP_SHARE_LONGLONG_COUNT,
+ &key_str, str->length() + 1,
+ NullS))
+ ) {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ goto error;
+ }
+ spider_set_tmp_share_pointer(tmp_share, tmp_connect_info,
+ tmp_connect_info_length, tmp_long, tmp_longlong);
+ table_mon_list->share = tmp_share;
+ table_mon_list->key = key_str;
+ table_mon_list->key_length = str->length();
+ memcpy(key_str, str->ptr(), table_mon_list->key_length);
+ tmp_share->access_charset = thd->variables.character_set_client;
+
+ if (
+ !(table_tables = spider_open_sys_table(
+ thd, SPIDER_SYS_TABLES_TABLE_NAME_STR,
+ SPIDER_SYS_TABLES_TABLE_NAME_LEN, FALSE, &open_tables_backup, need_lock,
+ error_num))
+ ) {
+ my_error(*error_num, MYF(0));
+ goto error;
+ }
+ spider_store_tables_name(table_tables, name, name_length);
+ spider_store_tables_link_idx(table_tables, link_idx);
+ if (
+ (*error_num = spider_check_sys_table(table_tables, table_key)) ||
+ (*error_num = spider_get_sys_tables_connect_info(
+ table_tables, tmp_share, 0, &mem_root)) ||
+ (*error_num = spider_get_sys_tables_link_status(
+ table_tables, tmp_share, 0, &mem_root))
+ ) {
+ table_tables->file->print_error(*error_num, MYF(0));
+ goto error;
+ }
+ spider_close_sys_table(thd, table_tables,
+ &open_tables_backup, need_lock);
+ table_tables = NULL;
+
+ if (
+ (*error_num = spider_set_connect_info_default(
+ tmp_share,
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ NULL,
+ NULL,
+#endif
+ NULL
+ )) ||
+ (*error_num = spider_set_connect_info_default_dbtable(
+ tmp_share, name, name_length
+ )) ||
+ (*error_num = spider_create_conn_keys(tmp_share)) ||
+/*
+ (*error_num = spider_db_create_table_names_str(tmp_share)) ||
+*/
+ (*error_num = spider_get_ping_table_mon(
+ thd, table_mon_list, name, name_length, link_idx, server_id, &mem_root,
+ need_lock))
+ )
+ goto error;
+
+ if (tmp_share->link_statuses[0] == SPIDER_LINK_STATUS_NG)
+ table_mon_list->mon_status = SPIDER_LINK_MON_NG;
+
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_mutex_init(&table_mon_list->caller_mutex, MY_MUTEX_INIT_FAST))
+#else
+ if (mysql_mutex_init(spd_key_mutex_mon_list_caller,
+ &table_mon_list->caller_mutex, MY_MUTEX_INIT_FAST))
+#endif
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ goto error_caller_mutex_init;
+ }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_mutex_init(&table_mon_list->receptor_mutex, MY_MUTEX_INIT_FAST))
+#else
+ if (mysql_mutex_init(spd_key_mutex_mon_list_receptor,
+ &table_mon_list->receptor_mutex, MY_MUTEX_INIT_FAST))
+#endif
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ goto error_receptor_mutex_init;
+ }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_mutex_init(&table_mon_list->monitor_mutex, MY_MUTEX_INIT_FAST))
+#else
+ if (mysql_mutex_init(spd_key_mutex_mon_list_monitor,
+ &table_mon_list->monitor_mutex, MY_MUTEX_INIT_FAST))
+#endif
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ goto error_monitor_mutex_init;
+ }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_mutex_init(&table_mon_list->update_status_mutex,
+ MY_MUTEX_INIT_FAST))
+#else
+ if (mysql_mutex_init(spd_key_mutex_mon_list_update_status,
+ &table_mon_list->update_status_mutex, MY_MUTEX_INIT_FAST))
+#endif
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ goto error_update_status_mutex_init;
+ }
+
+ free_root(&mem_root, MYF(0));
+ DBUG_RETURN(table_mon_list);
+
+error_update_status_mutex_init:
+ pthread_mutex_destroy(&table_mon_list->monitor_mutex);
+error_monitor_mutex_init:
+ pthread_mutex_destroy(&table_mon_list->receptor_mutex);
+error_receptor_mutex_init:
+ pthread_mutex_destroy(&table_mon_list->caller_mutex);
+error_caller_mutex_init:
+error:
+ if (table_tables)
+ spider_close_sys_table(thd, table_tables,
+ &open_tables_backup, need_lock);
+ free_root(&mem_root, MYF(0));
+ if (table_mon_list)
+ {
+ spider_free_tmp_share_alloc(table_mon_list->share);
+ spider_free(spider_current_trx, table_mon_list, MYF(0));
+ }
+ DBUG_RETURN(NULL);
+}
+
+SPIDER_CONN *spider_get_ping_table_tgt_conn(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int *error_num
+) {
+ SPIDER_CONN *conn;
+ DBUG_ENTER("spider_get_ping_table_tgt_conn");
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ if (trx == spider_global_trx)
+ pthread_mutex_lock(&spider_global_trx_mutex);
+#endif
+ if (
+ !(conn = spider_get_conn(
+ share, 0, share->conn_keys[0], trx, NULL, FALSE, FALSE,
+ SPIDER_CONN_KIND_MYSQL, error_num))
+ ) {
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ if (trx == spider_global_trx)
+ pthread_mutex_unlock(&spider_global_trx_mutex);
+#endif
+ my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
+ share->server_names[0]);
+ *error_num = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
+ goto error;
+ }
+ conn->error_mode = 0;
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ if (trx == spider_global_trx)
+ pthread_mutex_unlock(&spider_global_trx_mutex);
+#endif
+ DBUG_RETURN(conn);
+
+error:
+ DBUG_RETURN(NULL);
+}
+
+int spider_init_ping_table_mon_cache(
+ THD *thd,
+ MEM_ROOT *mem_root,
+ bool need_lock
+) {
+ int error_num, same;
+ TABLE *table_link_mon = NULL;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup;
+#else
+ Open_tables_backup open_tables_backup;
+#endif
+ SPIDER_MON_KEY mon_key;
+ DBUG_ENTER("spider_init_ping_table_mon_cache");
+
+ if (
+ !(table_link_mon = spider_open_sys_table(
+ thd, SPIDER_SYS_LINK_MON_TABLE_NAME_STR,
+ SPIDER_SYS_LINK_MON_TABLE_NAME_LEN, FALSE, &open_tables_backup,
+ need_lock, &error_num))
+ ) {
+ my_error(error_num, MYF(0));
+ goto error_open_sys_table;
+ }
+
+ pthread_mutex_lock(&spider_mon_table_cache_mutex);
+ if (spider_mon_table_cache_version != spider_mon_table_cache_version_req)
+ {
+ /* reset */
+ spider_mon_table_cache.elements = 0;
+
+ if ((error_num = spider_sys_index_first(table_link_mon,
+ table_link_mon->s->primary_key)))
+ {
+ if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
+ {
+ table_link_mon->file->print_error(error_num, MYF(0));
+ goto error_sys_index_first;
+ }
+ }
+
+ if (!error_num)
+ {
+ mon_key.db_name_length = SPIDER_SYS_LINK_MON_TABLE_DB_NAME_SIZE + 1;
+ mon_key.table_name_length = SPIDER_SYS_LINK_MON_TABLE_TABLE_NAME_SIZE + 1;
+ mon_key.link_id_length = SPIDER_SYS_LINK_MON_TABLE_LINK_ID_SIZE + 1;
+ do {
+ if ((error_num = spider_get_sys_link_mon_key(table_link_mon, &mon_key,
+ mem_root, &same)))
+ goto error_get_sys_link_mon_key;
+
+ if (!same)
+ {
+ mon_key.sort = spider_calc_for_sort(3, mon_key.db_name,
+ mon_key.table_name, mon_key.link_id);
+ if (push_dynamic(&spider_mon_table_cache, (uchar *) &mon_key))
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_push_dynamic;
+ }
+ }
+
+ if ((error_num = spider_sys_index_next(table_link_mon)))
+ {
+ if (
+ error_num != HA_ERR_KEY_NOT_FOUND &&
+ error_num != HA_ERR_END_OF_FILE
+ ) {
+ table_link_mon->file->print_error(error_num, MYF(0));
+ goto error_sys_index_next;
+ }
+ }
+ } while (!error_num);
+ spider_sys_index_end(table_link_mon);
+ }
+ my_qsort(
+ (uchar *) dynamic_element(&spider_mon_table_cache, 0, SPIDER_MON_KEY *),
+ spider_mon_table_cache.elements, sizeof(SPIDER_MON_KEY),
+ (qsort_cmp) spider_compare_for_sort);
+ uint old_elements = spider_mon_table_cache.max_element;
+ freeze_size(&spider_mon_table_cache);
+ if (spider_mon_table_cache.max_element < old_elements)
+ {
+ spider_free_mem_calc(spider_current_trx,
+ spider_mon_table_cache_id,
+ spider_mon_table_cache.max_element *
+ spider_mon_table_cache.size_of_element);
+ }
+ spider_mon_table_cache_version = spider_mon_table_cache_version_req;
+ }
+ pthread_mutex_unlock(&spider_mon_table_cache_mutex);
+ spider_close_sys_table(thd, table_link_mon, &open_tables_backup, need_lock);
+ DBUG_RETURN(0);
+
+error_push_dynamic:
+error_get_sys_link_mon_key:
+error_sys_index_next:
+ spider_sys_index_end(table_link_mon);
+error_sys_index_first:
+ pthread_mutex_unlock(&spider_mon_table_cache_mutex);
+ spider_close_sys_table(thd, table_link_mon, &open_tables_backup, need_lock);
+error_open_sys_table:
+ DBUG_RETURN(error_num);
+}
+
+int spider_ping_table_cache_compare(
+ TABLE *table,
+ MEM_ROOT *mem_root
+) {
+ uint32 roop_count;
+ SPIDER_MON_KEY *mon_key;
+ char *db_name, *table_name, *link_id;
+ DBUG_ENTER("spider_ping_table_cache_compare");
+
+ if (
+ !(db_name = get_field(mem_root, table->field[0])) ||
+ !(table_name = get_field(mem_root, table->field[1])) ||
+ !(link_id = get_field(mem_root, table->field[2]))
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_PRINT("info", ("spider db_name=%s", db_name));
+ DBUG_PRINT("info", ("spider table_name=%s", table_name));
+ DBUG_PRINT("info", ("spider link_id=%s", link_id));
+
+ pthread_mutex_lock(&spider_mon_table_cache_mutex);
+ for (roop_count = 0; roop_count < spider_mon_table_cache.elements;
+ roop_count++)
+ {
+ mon_key = dynamic_element(&spider_mon_table_cache, roop_count,
+ SPIDER_MON_KEY *);
+ DBUG_PRINT("info", ("spider roop_count=%d", roop_count));
+ DBUG_PRINT("info", ("spider mon_key.db_name=%s", mon_key->db_name));
+ DBUG_PRINT("info", ("spider mon_key.table_name=%s", mon_key->table_name));
+ DBUG_PRINT("info", ("spider mon_key.link_id=%s", mon_key->link_id));
+ if (
+ !wild_case_compare(system_charset_info, db_name, mon_key->db_name) &&
+ !wild_case_compare(system_charset_info, table_name,
+ mon_key->table_name) &&
+ !wild_case_compare(system_charset_info, link_id, mon_key->link_id)
+ ) {
+ spider_store_db_and_table_name(
+ table,
+ mon_key->db_name,
+ mon_key->db_name_length,
+ mon_key->table_name,
+ mon_key->table_name_length
+ );
+ spider_store_tables_link_idx_str(
+ table,
+ mon_key->link_id,
+ mon_key->link_id_length
+ );
+ pthread_mutex_unlock(&spider_mon_table_cache_mutex);
+ DBUG_PRINT("info", ("spider found"));
+ DBUG_RETURN(0);
+ }
+ }
+ pthread_mutex_unlock(&spider_mon_table_cache_mutex);
+ DBUG_PRINT("info", ("spider not found"));
+ DBUG_RETURN(1);
+}
+
+long long spider_ping_table_body(
+ UDF_INIT *initid,
+ UDF_ARGS *args,
+ char *is_null,
+ char *error
+) {
+ int error_num = 0, link_idx, flags, full_mon_count, current_mon_count,
+ success_count, fault_count, tmp_error_num = 0;
+ uint32 first_sid;
+ longlong limit, tmp_sid = -1;
+ SPIDER_MON_TABLE_RESULT *mon_table_result =
+ (SPIDER_MON_TABLE_RESULT *) initid->ptr;
+ SPIDER_TRX *trx = mon_table_result->trx;
+ THD *thd = trx->thd;
+ SPIDER_CONN *ping_conn = NULL, *mon_conn;
+ char *where_clause;
+ SPIDER_TABLE_MON_LIST *table_mon_list;
+ SPIDER_TABLE_MON *table_mon;
+
+ char buf[MAX_FIELD_WIDTH];
+ spider_string conv_name(buf, sizeof(buf), system_charset_info);
+ int conv_name_length;
+ char link_idx_str[SPIDER_SQL_INT_LEN];
+ int link_idx_str_length;
+ bool get_lock = FALSE;
+ DBUG_ENTER("spider_ping_table_body");
+ conv_name.init_calc_mem(135);
+ conv_name.length(0);
+ if (
+ thd->open_tables != 0 ||
+ thd->handler_tables_hash.records != 0 ||
+ thd->derived_tables != 0 ||
+ thd->lock != 0 ||
+#if MYSQL_VERSION_ID < 50500
+ thd->locked_tables != 0 ||
+ thd->prelocked_mode != NON_PRELOCKED
+#else
+ thd->locked_tables_list.locked_tables() ||
+ thd->locked_tables_mode != LTM_NONE
+#endif
+ ) {
+ if (thd->open_tables != 0)
+ {
+ my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
+ ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
+ "thd->open_tables", thd->open_tables);
+ } else if (thd->handler_tables_hash.records != 0)
+ {
+ my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
+ ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_NUM, MYF(0),
+ "thd->handler_tables_hash.records",
+ (longlong) thd->handler_tables_hash.records);
+ } else if (thd->derived_tables != 0)
+ {
+ my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
+ ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
+ "thd->derived_tables", thd->derived_tables);
+ } else if (thd->lock != 0)
+ {
+ my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
+ ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
+ "thd->lock", thd->lock);
+#if MYSQL_VERSION_ID < 50500
+ } else if (thd->locked_tables != 0)
+ {
+ my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
+ ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
+ "thd->locked_tables", thd->locked_tables);
+ } else if (thd->prelocked_mode != NON_PRELOCKED)
+ {
+ my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
+ ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_NUM, MYF(0),
+ "thd->prelocked_mode", (longlong) thd->prelocked_mode);
+#else
+ } else if (thd->locked_tables_list.locked_tables())
+ {
+ my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
+ ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_PTR, MYF(0),
+ "thd->locked_tables_list.locked_tables()",
+ thd->locked_tables_list.locked_tables());
+ } else if (thd->locked_tables_mode != LTM_NONE)
+ {
+ my_printf_error(ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM,
+ ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_NUM, MYF(0),
+ "thd->locked_tables_mode", (longlong) thd->locked_tables_mode);
+#endif
+ }
+ goto error;
+ }
+
+ if (
+ args->lengths[0] > SPIDER_CONNECT_INFO_MAX_LEN
+ ) {
+ my_printf_error(ER_SPIDER_UDF_PING_TABLE_PARAM_TOO_LONG_NUM,
+ ER_SPIDER_UDF_PING_TABLE_PARAM_TOO_LONG_STR, MYF(0));
+ goto error;
+ }
+ if (
+ args->lengths[0] == 0
+ ) {
+ my_printf_error(ER_SPIDER_UDF_PING_TABLE_PARAM_REQIRED_NUM,
+ ER_SPIDER_UDF_PING_TABLE_PARAM_REQIRED_STR, MYF(0));
+ goto error;
+ }
+
+ link_idx = (int) (args->args[1] ? *((longlong *) args->args[1]) : 0);
+ flags = (int) (args->args[2] ? *((longlong *) args->args[2]) : 0);
+ limit = args->args[3] ? *((longlong *) args->args[3]) : 0;
+ where_clause = args->args[4] ? args->args[4] : (char *) "";
+
+ link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
+ link_idx));
+
+ if (conv_name.append(args->args[0], args->lengths[0],
+ trx->thd->variables.character_set_client))
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ goto error;
+ }
+ conv_name_length = conv_name.length();
+ if (conv_name.reserve(link_idx_str_length + 1))
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ goto error;
+ }
+ conv_name.q_append(link_idx_str, link_idx_str_length + 1);
+ conv_name.length(conv_name.length() - 1);
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
+ if (!(table_mon_list = spider_get_ping_table_mon_list(trx, trx->thd,
+ &conv_name, conv_name_length, link_idx, global_system_variables.server_id,
+ TRUE, &error_num)))
+#else
+ if (!(table_mon_list = spider_get_ping_table_mon_list(trx, trx->thd,
+ &conv_name, conv_name_length, link_idx, thd->server_id, TRUE, &error_num)))
+#endif
+ goto error;
+
+ if (table_mon_list->mon_status == SPIDER_LINK_MON_NG)
+ {
+ mon_table_result->result_status = SPIDER_LINK_MON_NG;
+ DBUG_PRINT("info",
+ ("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 1"));
+ goto end;
+ }
+
+ if (args->args[5])
+ tmp_sid = *((longlong *) args->args[5]);
+
+ if (tmp_sid >= 0)
+ {
+ first_sid = (uint32) tmp_sid;
+ full_mon_count = (int) (args->args[6] ? *((longlong *) args->args[6]) : 0);
+ current_mon_count =
+ (int) (args->args[7] ? *((longlong *) args->args[7]) + 1 : 1);
+ if (full_mon_count != table_mon_list->list_size)
+ {
+ my_printf_error(ER_SPIDER_UDF_PING_TABLE_DIFFERENT_MON_NUM,
+ ER_SPIDER_UDF_PING_TABLE_DIFFERENT_MON_STR, MYF(0));
+ goto error_with_free_table_mon_list;
+ }
+ } else {
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
+ first_sid = global_system_variables.server_id;
+#else
+ first_sid = thd->server_id;
+#endif
+ full_mon_count = table_mon_list->list_size;
+ current_mon_count = 1;
+ }
+
+ success_count = (int) (args->args[8] ? *((longlong *) args->args[8]) : 0);
+ fault_count = (int) (args->args[9] ? *((longlong *) args->args[9]) : 0);
+ if (
+ table_mon_list->mon_status != SPIDER_LINK_MON_NG &&
+ !(ping_conn = spider_get_ping_table_tgt_conn(trx,
+ table_mon_list->share, &error_num))
+ ) {
+ if (error_num == HA_ERR_OUT_OF_MEM)
+ goto error_with_free_table_mon_list;
+ else
+ thd->clear_error();
+ }
+ if (
+ table_mon_list->mon_status == SPIDER_LINK_MON_NG ||
+ error_num ||
+ (tmp_error_num = spider_db_udf_ping_table(table_mon_list, table_mon_list->share, trx,
+ ping_conn, where_clause, args->lengths[4],
+ (flags & SPIDER_UDF_PING_TABLE_PING_ONLY),
+ (flags & SPIDER_UDF_PING_TABLE_USE_WHERE),
+ limit
+ ))
+ ) {
+ if (tmp_error_num == HA_ERR_OUT_OF_MEM)
+ goto error_with_free_table_mon_list;
+ else if(tmp_error_num)
+ thd->clear_error();
+ fault_count++;
+ error_num = 0;
+ if (fault_count > full_mon_count / 2)
+ {
+ mon_table_result->result_status = SPIDER_LINK_MON_NG;
+ DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 2"));
+ if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
+ {
+ pthread_mutex_lock(&table_mon_list->update_status_mutex);
+ if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
+ {
+ table_mon_list->mon_status = SPIDER_LINK_MON_NG;
+ table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG;
+ spider_sys_update_tables_link_status(trx->thd,
+ conv_name.c_ptr(), conv_name_length, link_idx,
+ SPIDER_LINK_STATUS_NG, TRUE);
+ spider_sys_log_tables_link_failed(trx->thd,
+ conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
+ }
+ pthread_mutex_unlock(&table_mon_list->update_status_mutex);
+ }
+ goto end;
+ }
+ } else {
+ success_count++;
+ if (success_count > full_mon_count / 2)
+ {
+ mon_table_result->result_status = SPIDER_LINK_MON_OK;
+ DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_OK 1"));
+ goto end;
+ }
+ }
+
+ if (tmp_sid < 0)
+ {
+ if (!pthread_mutex_trylock(&table_mon_list->receptor_mutex))
+ get_lock = TRUE;
+ }
+
+ if (
+ tmp_sid >= 0 ||
+ get_lock
+ ) {
+ table_mon = table_mon_list->current->next;
+ while (TRUE)
+ {
+ if (!table_mon)
+ table_mon = table_mon_list->first;
+ if (
+ table_mon->server_id == first_sid ||
+ current_mon_count > full_mon_count
+ ) {
+ if (success_count + fault_count > full_mon_count / 2)
+ {
+ mon_table_result->result_status = SPIDER_LINK_MON_DRAW;
+ DBUG_PRINT("info",(
+ "spider mon_table_result->result_status=SPIDER_LINK_MON_DRAW 1"));
+ } else {
+ mon_table_result->result_status = SPIDER_LINK_MON_DRAW_FEW_MON;
+ DBUG_PRINT("info",(
+ "spider mon_table_result->result_status=SPIDER_LINK_MON_DRAW_FEW_MON 1"));
+ }
+ table_mon_list->last_receptor_result = mon_table_result->result_status;
+ break;
+ }
+ if ((mon_conn = spider_get_ping_table_tgt_conn(trx,
+ table_mon->share, &error_num))
+ ) {
+ if (!spider_db_udf_ping_table_mon_next(
+ thd, table_mon, mon_conn, mon_table_result, args->args[0],
+ args->lengths[0], link_idx,
+ where_clause, args->lengths[4], first_sid, full_mon_count,
+ current_mon_count, success_count, fault_count, flags, limit))
+ {
+ if (
+ mon_table_result->result_status == SPIDER_LINK_MON_NG &&
+ table_mon_list->mon_status != SPIDER_LINK_MON_NG
+ ) {
+ pthread_mutex_lock(&table_mon_list->update_status_mutex);
+ if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
+ {
+ table_mon_list->mon_status = SPIDER_LINK_MON_NG;
+ table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG;
+ spider_sys_update_tables_link_status(trx->thd,
+ conv_name.c_ptr(), conv_name_length, link_idx,
+ SPIDER_LINK_STATUS_NG, TRUE);
+ spider_sys_log_tables_link_failed(trx->thd,
+ conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
+ }
+ pthread_mutex_unlock(&table_mon_list->update_status_mutex);
+ }
+ table_mon_list->last_receptor_result =
+ mon_table_result->result_status;
+ break;
+ }
+ }
+ thd->clear_error();
+ table_mon = table_mon->next;
+ current_mon_count++;
+ }
+ if (get_lock)
+ pthread_mutex_unlock(&table_mon_list->receptor_mutex);
+ } else {
+ pthread_mutex_lock(&table_mon_list->receptor_mutex);
+ mon_table_result->result_status = table_mon_list->last_receptor_result;
+ DBUG_PRINT("info",("spider mon_table_result->result_status=%d 1",
+ table_mon_list->last_receptor_result));
+ pthread_mutex_unlock(&table_mon_list->receptor_mutex);
+ }
+
+end:
+ spider_free_ping_table_mon_list(table_mon_list);
+ DBUG_RETURN(mon_table_result->result_status);
+
+error_with_free_table_mon_list:
+ spider_free_ping_table_mon_list(table_mon_list);
+error:
+ *error = 1;
+ DBUG_RETURN(0);
+}
+
+my_bool spider_ping_table_init_body(
+ UDF_INIT *initid,
+ UDF_ARGS *args,
+ char *message
+) {
+ int error_num;
+ THD *thd = current_thd;
+ SPIDER_TRX *trx;
+ SPIDER_MON_TABLE_RESULT *mon_table_result = NULL;
+ DBUG_ENTER("spider_ping_table_init_body");
+ if (args->arg_count != 10)
+ {
+ strcpy(message, "spider_ping_table() requires 10 arguments");
+ goto error;
+ }
+ if (
+ args->arg_type[0] != STRING_RESULT ||
+ args->arg_type[4] != STRING_RESULT
+ ) {
+ strcpy(message, "spider_ping_table() requires string 1st "
+ "and 5th arguments");
+ goto error;
+ }
+ if (
+ args->arg_type[1] != INT_RESULT ||
+ args->arg_type[2] != INT_RESULT ||
+ args->arg_type[3] != INT_RESULT ||
+ args->arg_type[5] != INT_RESULT ||
+ args->arg_type[6] != INT_RESULT ||
+ args->arg_type[7] != INT_RESULT ||
+ args->arg_type[8] != INT_RESULT ||
+ args->arg_type[9] != INT_RESULT
+ ) {
+ strcpy(message, "spider_ping_table() requires integer 2nd, 3rd, 4,6,7,8,"
+ "9th and 10th argument");
+ goto error;
+ }
+
+ if (!(trx = spider_get_trx(thd, TRUE, &error_num)))
+ {
+ my_error(error_num, MYF(0));
+ strcpy(message, spider_stmt_da_message(thd));
+ goto error;
+ }
+
+ if (!(mon_table_result = (SPIDER_MON_TABLE_RESULT *)
+ spider_malloc(spider_current_trx, 11, sizeof(SPIDER_MON_TABLE_RESULT),
+ MYF(MY_WME | MY_ZEROFILL)))
+ ) {
+ strcpy(message, "spider_ping_table() out of memory");
+ goto error;
+ }
+ mon_table_result->trx = trx;
+ initid->ptr = (char *) mon_table_result;
+ DBUG_RETURN(FALSE);
+
+error:
+ if (mon_table_result)
+ {
+ spider_free(spider_current_trx, mon_table_result, MYF(0));
+ }
+ DBUG_RETURN(TRUE);
+}
+
+void spider_ping_table_deinit_body(
+ UDF_INIT *initid
+) {
+ SPIDER_MON_TABLE_RESULT *mon_table_result =
+ (SPIDER_MON_TABLE_RESULT *) initid->ptr;
+ DBUG_ENTER("spider_ping_table_deinit_body");
+ if (mon_table_result)
+ {
+ spider_free(spider_current_trx, mon_table_result, MYF(0));
+ }
+ DBUG_VOID_RETURN;
+}
+
+long long spider_flush_table_mon_cache_body()
+{
+ DBUG_ENTER("spider_flush_table_mon_cache_body");
+ spider_mon_table_cache_version_req++;
+ DBUG_RETURN(1);
+}
+
+void spider_ping_table_free_mon_list(
+ SPIDER_TABLE_MON_LIST *table_mon_list
+) {
+ DBUG_ENTER("spider_ping_table_free_mon_list");
+ if (table_mon_list)
+ {
+ spider_ping_table_free_mon(table_mon_list->first);
+ spider_free_tmp_share_alloc(table_mon_list->share);
+ pthread_mutex_destroy(&table_mon_list->update_status_mutex);
+ pthread_mutex_destroy(&table_mon_list->monitor_mutex);
+ pthread_mutex_destroy(&table_mon_list->receptor_mutex);
+ pthread_mutex_destroy(&table_mon_list->caller_mutex);
+ spider_free(spider_current_trx, table_mon_list, MYF(0));
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_ping_table_free_mon(
+ SPIDER_TABLE_MON *table_mon
+) {
+ SPIDER_TABLE_MON *table_mon_next;
+ DBUG_ENTER("spider_ping_table_free_mon");
+ while (table_mon)
+ {
+ spider_free_tmp_share_alloc(table_mon->share);
+ table_mon_next = table_mon->next;
+ spider_free(spider_current_trx, table_mon, MYF(0));
+ table_mon = table_mon_next;
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_ping_table_mon_from_table(
+ SPIDER_TRX *trx,
+ THD *thd,
+ SPIDER_SHARE *share,
+ uint32 server_id,
+ char *conv_name,
+ uint conv_name_length,
+ int link_idx,
+ char *where_clause,
+ uint where_clause_length,
+ long monitoring_kind,
+ longlong monitoring_limit,
+ bool need_lock
+) {
+ int error_num = 0, current_mon_count, flags;
+ uint32 first_sid;
+/*
+ THD *thd = trx->thd;
+*/
+ SPIDER_TABLE_MON_LIST *table_mon_list;
+ SPIDER_TABLE_MON *table_mon;
+ SPIDER_MON_TABLE_RESULT mon_table_result;
+ SPIDER_CONN *mon_conn;
+ TABLE_SHARE *table_share = share->table_share;
+ char link_idx_str[SPIDER_SQL_INT_LEN];
+ int link_idx_str_length;
+ uint sql_command = thd_sql_command(thd);
+ DBUG_ENTER("spider_ping_table_mon_from_table");
+ if (table_share->tmp_table != NO_TMP_TABLE)
+ {
+ my_printf_error(ER_SPIDER_TMP_TABLE_MON_NUM,
+ ER_SPIDER_TMP_TABLE_MON_STR, MYF(0));
+ DBUG_RETURN(ER_SPIDER_TMP_TABLE_MON_NUM);
+ }
+ if (
+ sql_command == SQLCOM_DROP_TABLE ||
+ sql_command == SQLCOM_ALTER_TABLE
+ ) {
+ my_printf_error(ER_SPIDER_MON_AT_ALTER_TABLE_NUM,
+ ER_SPIDER_MON_AT_ALTER_TABLE_STR, MYF(0));
+ DBUG_RETURN(ER_SPIDER_MON_AT_ALTER_TABLE_NUM);
+ }
+
+ link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
+ link_idx));
+#ifdef _MSC_VER
+ spider_string conv_name_str(conv_name_length + link_idx_str_length + 1);
+ conv_name_str.set_charset(system_charset_info);
+ *((char *)(conv_name_str.ptr() + conv_name_length + link_idx_str_length)) =
+ '\0';
+#else
+ char buf[conv_name_length + link_idx_str_length + 1];
+ buf[conv_name_length + link_idx_str_length] = '\0';
+ spider_string conv_name_str(buf, conv_name_length + link_idx_str_length + 1,
+ system_charset_info);
+#endif
+ conv_name_str.init_calc_mem(136);
+ conv_name_str.length(0);
+ conv_name_str.q_append(conv_name, conv_name_length);
+ conv_name_str.q_append(link_idx_str, link_idx_str_length + 1);
+ conv_name_str.length(conv_name_str.length() - 1);
+
+ if (monitoring_kind == 1)
+ flags = SPIDER_UDF_PING_TABLE_PING_ONLY;
+ else if (monitoring_kind == 3)
+ flags = SPIDER_UDF_PING_TABLE_USE_WHERE;
+ else
+ flags = 0;
+
+ if (!(table_mon_list = spider_get_ping_table_mon_list(trx, thd,
+ &conv_name_str, conv_name_length, link_idx, server_id, need_lock,
+ &error_num)))
+ goto end;
+
+ if (table_mon_list->mon_status == SPIDER_LINK_MON_NG)
+ {
+ DBUG_PRINT("info",
+ ("spider share->link_statuses[%d]=SPIDER_LINK_STATUS_NG", link_idx));
+ share->link_statuses[link_idx] = SPIDER_LINK_STATUS_NG;
+ error_num = ER_SPIDER_LINK_MON_NG_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_NG_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ goto end_with_free_table_mon_list;
+ }
+
+ if (!pthread_mutex_trylock(&table_mon_list->caller_mutex))
+ {
+ table_mon = table_mon_list->current;
+ first_sid = table_mon->server_id;
+ current_mon_count = 1;
+ while (TRUE)
+ {
+ if (!table_mon)
+ table_mon = table_mon_list->first;
+ if (
+ current_mon_count > table_mon_list->list_size ||
+ (current_mon_count > 1 && table_mon->server_id == first_sid)
+ ) {
+ table_mon_list->last_caller_result = SPIDER_LINK_MON_DRAW_FEW_MON;
+ mon_table_result.result_status = SPIDER_LINK_MON_DRAW_FEW_MON;
+ DBUG_PRINT("info",(
+ "spider mon_table_result->result_status=SPIDER_LINK_MON_DRAW_FEW_MON 1"));
+ error_num = ER_SPIDER_LINK_MON_DRAW_FEW_MON_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_DRAW_FEW_MON_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ break;
+ }
+ thd->clear_error();
+ if ((mon_conn = spider_get_ping_table_tgt_conn(trx,
+ table_mon->share, &error_num))
+ ) {
+ if (!spider_db_udf_ping_table_mon_next(
+ thd, table_mon, mon_conn, &mon_table_result, conv_name,
+ conv_name_length, link_idx,
+ where_clause, where_clause_length, -1, table_mon_list->list_size,
+ 0, 0, 0, flags, monitoring_limit))
+ {
+ if (
+ mon_table_result.result_status == SPIDER_LINK_MON_NG &&
+ table_mon_list->mon_status != SPIDER_LINK_MON_NG
+ ) {
+ pthread_mutex_lock(&table_mon_list->update_status_mutex);
+ if (table_mon_list->mon_status != SPIDER_LINK_MON_NG)
+ {
+ table_mon_list->mon_status = SPIDER_LINK_MON_NG;
+ table_mon_list->share->link_statuses[0] = SPIDER_LINK_STATUS_NG;
+ DBUG_PRINT("info", (
+ "spider share->link_statuses[%d]=SPIDER_LINK_STATUS_NG",
+ link_idx));
+ share->link_statuses[link_idx] = SPIDER_LINK_STATUS_NG;
+ spider_sys_update_tables_link_status(thd, conv_name,
+ conv_name_length, link_idx, SPIDER_LINK_STATUS_NG, need_lock);
+ spider_sys_log_tables_link_failed(thd, conv_name,
+ conv_name_length, link_idx, need_lock);
+ }
+ pthread_mutex_unlock(&table_mon_list->update_status_mutex);
+ }
+ table_mon_list->last_caller_result = mon_table_result.result_status;
+ if (mon_table_result.result_status == SPIDER_LINK_MON_OK)
+ {
+ error_num = ER_SPIDER_LINK_MON_OK_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_OK_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ break;
+ }
+ if (mon_table_result.result_status == SPIDER_LINK_MON_NG)
+ {
+ error_num = ER_SPIDER_LINK_MON_NG_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_NG_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ break;
+ }
+ if (mon_table_result.result_status ==
+ SPIDER_LINK_MON_DRAW_FEW_MON)
+ {
+ error_num = ER_SPIDER_LINK_MON_DRAW_FEW_MON_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_DRAW_FEW_MON_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ break;
+ }
+ error_num = ER_SPIDER_LINK_MON_DRAW_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_DRAW_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ break;
+ }
+ }
+ table_mon = table_mon->next;
+ current_mon_count++;
+ }
+ pthread_mutex_unlock(&table_mon_list->caller_mutex);
+ } else {
+ pthread_mutex_lock(&table_mon_list->caller_mutex);
+ switch (table_mon_list->last_caller_result)
+ {
+ case SPIDER_LINK_MON_OK:
+ error_num = ER_SPIDER_LINK_MON_OK_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_OK_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ break;
+ case SPIDER_LINK_MON_NG:
+ error_num = ER_SPIDER_LINK_MON_NG_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_NG_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ break;
+ case SPIDER_LINK_MON_DRAW_FEW_MON:
+ error_num = ER_SPIDER_LINK_MON_DRAW_FEW_MON_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_DRAW_FEW_MON_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ break;
+ default:
+ error_num = ER_SPIDER_LINK_MON_DRAW_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_LINK_MON_DRAW_STR, MYF(0),
+ table_mon_list->share->tgt_dbs[0],
+ table_mon_list->share->tgt_table_names[0]);
+ break;
+ }
+ pthread_mutex_unlock(&table_mon_list->caller_mutex);
+ }
+
+end_with_free_table_mon_list:
+ spider_free_ping_table_mon_list(table_mon_list);
+end:
+ DBUG_RETURN(error_num);
+}
diff --git a/storage/spider/spd_ping_table.h b/storage/spider/spd_ping_table.h
index aca93012d78..d9c5648b6b3 100644
--- a/storage/spider/spd_ping_table.h
+++ b/storage/spider/spd_ping_table.h
@@ -1,102 +1,102 @@
-/* Copyright (C) 2009-2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list(
- SPIDER_TRX *trx,
- THD *thd,
- spider_string *str,
- uint conv_name_length,
- int link_idx,
- uint32 server_id,
- bool need_lock,
- int *error_num
-);
-
-void spider_free_ping_table_mon_list(
- SPIDER_TABLE_MON_LIST *table_mon_list
-);
-
-void spider_release_ping_table_mon_list_loop(
- uint mutex_hash,
- SPIDER_TABLE_MON_LIST *table_mon_list
-);
-
-void spider_release_ping_table_mon_list(
- const char *conv_name,
- uint conv_name_length,
- int link_idx
-);
-
-int spider_get_ping_table_mon(
- THD *thd,
- SPIDER_TABLE_MON_LIST *table_mon_list,
- char *name,
- uint name_length,
- int link_idx,
- uint32 server_id,
- MEM_ROOT *mem_root,
- bool need_lock
-);
-
-SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt(
- THD *thd,
- char *name,
- uint name_length,
- int link_idx,
- uint32 server_id,
- spider_string *str,
- bool need_lock,
- int *error_num
-);
-
-SPIDER_CONN *spider_get_ping_table_tgt_conn(
- SPIDER_TRX *trx,
- SPIDER_SHARE *share,
- int *error_num
-);
-
-int spider_init_ping_table_mon_cache(
- THD *thd,
- MEM_ROOT *mem_root,
- bool need_lock
-);
-
-int spider_ping_table_cache_compare(
- TABLE *table,
- MEM_ROOT *mem_root
-);
-
-void spider_ping_table_free_mon_list(
- SPIDER_TABLE_MON_LIST *table_mon_list
-);
-
-void spider_ping_table_free_mon(
- SPIDER_TABLE_MON *table_mon
-);
-
-int spider_ping_table_mon_from_table(
- SPIDER_TRX *trx,
- THD *thd,
- SPIDER_SHARE *share,
- uint32 server_id,
- char *conv_name,
- uint conv_name_length,
- int link_idx,
- char *where_clause,
- uint where_clause_length,
- long monitoring_kind,
- longlong monitoring_limit,
- bool need_lock
-);
+/* Copyright (C) 2009-2014 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list(
+ SPIDER_TRX *trx,
+ THD *thd,
+ spider_string *str,
+ uint conv_name_length,
+ int link_idx,
+ uint32 server_id,
+ bool need_lock,
+ int *error_num
+);
+
+void spider_free_ping_table_mon_list(
+ SPIDER_TABLE_MON_LIST *table_mon_list
+);
+
+void spider_release_ping_table_mon_list_loop(
+ uint mutex_hash,
+ SPIDER_TABLE_MON_LIST *table_mon_list
+);
+
+void spider_release_ping_table_mon_list(
+ const char *conv_name,
+ uint conv_name_length,
+ int link_idx
+);
+
+int spider_get_ping_table_mon(
+ THD *thd,
+ SPIDER_TABLE_MON_LIST *table_mon_list,
+ char *name,
+ uint name_length,
+ int link_idx,
+ uint32 server_id,
+ MEM_ROOT *mem_root,
+ bool need_lock
+);
+
+SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt(
+ THD *thd,
+ char *name,
+ uint name_length,
+ int link_idx,
+ uint32 server_id,
+ spider_string *str,
+ bool need_lock,
+ int *error_num
+);
+
+SPIDER_CONN *spider_get_ping_table_tgt_conn(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int *error_num
+);
+
+int spider_init_ping_table_mon_cache(
+ THD *thd,
+ MEM_ROOT *mem_root,
+ bool need_lock
+);
+
+int spider_ping_table_cache_compare(
+ TABLE *table,
+ MEM_ROOT *mem_root
+);
+
+void spider_ping_table_free_mon_list(
+ SPIDER_TABLE_MON_LIST *table_mon_list
+);
+
+void spider_ping_table_free_mon(
+ SPIDER_TABLE_MON *table_mon
+);
+
+int spider_ping_table_mon_from_table(
+ SPIDER_TRX *trx,
+ THD *thd,
+ SPIDER_SHARE *share,
+ uint32 server_id,
+ char *conv_name,
+ uint conv_name_length,
+ int link_idx,
+ char *where_clause,
+ uint where_clause_length,
+ long monitoring_kind,
+ longlong monitoring_limit,
+ bool need_lock
+);
diff --git a/storage/spider/spd_sys_table.cc b/storage/spider/spd_sys_table.cc
index 24fa5ff6faa..1ff3496d83e 100644
--- a/storage/spider/spd_sys_table.cc
+++ b/storage/spider/spd_sys_table.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -90,7 +90,10 @@ TABLE *spider_open_sys_table(
if (!(table = spider_sys_open_table(thd, &tables, open_tables_backup)))
#endif
{
- *error_num = my_errno;
+ my_printf_error(ER_SPIDER_CANT_OPEN_SYS_TABLE_NUM,
+ ER_SPIDER_CANT_OPEN_SYS_TABLE_STR, MYF(0),
+ "mysql", table_name);
+ *error_num = ER_SPIDER_CANT_OPEN_SYS_TABLE_NUM;
DBUG_RETURN(NULL);
}
#if MYSQL_VERSION_ID < 50500
@@ -117,7 +120,10 @@ TABLE *spider_open_sys_table(
table, FALSE)
) {
release_table_share(table_share, RELEASE_NORMAL);
- *error_num = my_errno;
+ my_printf_error(ER_SPIDER_CANT_OPEN_SYS_TABLE_NUM,
+ ER_SPIDER_CANT_OPEN_SYS_TABLE_STR, MYF(0),
+ "mysql", table_name);
+ *error_num = ER_SPIDER_CANT_OPEN_SYS_TABLE_NUM;
goto error;
}
}
@@ -1913,7 +1919,6 @@ int spider_sys_update_tables_link_status(
SPIDER_SYS_TABLES_TABLE_NAME_LEN, TRUE, &open_tables_backup, need_lock,
&error_num))
) {
- my_error(error_num, MYF(0));
goto error;
}
if ((error_num = spider_update_tables_link_status(table_tables,
@@ -1952,7 +1957,6 @@ int spider_sys_log_tables_link_failed(
SPIDER_SYS_LINK_FAILED_TABLE_NAME_LEN, TRUE, &open_tables_backup,
need_lock, &error_num))
) {
- my_error(error_num, MYF(0));
goto error;
}
empty_record(table_tables);
@@ -1992,7 +1996,6 @@ int spider_sys_log_xa_failed(
SPIDER_SYS_XA_FAILED_TABLE_NAME_LEN, TRUE, &open_tables_backup,
need_lock, &error_num))
) {
- my_error(error_num, MYF(0));
goto error;
}
empty_record(table_tables);
diff --git a/storage/spider/spd_sys_table.h b/storage/spider/spd_sys_table.h
index 0306f1d4120..8024c23c168 100644
--- a/storage/spider/spd_sys_table.h
+++ b/storage/spider/spd_sys_table.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index 7e47b486f59..ff7e7dbfb11 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -43,6 +43,9 @@
#include "spd_malloc.h"
ulong *spd_db_att_thread_id;
+#ifdef XID_CACHE_IS_SPLITTED
+uint *spd_db_att_xid_cache_split_num;
+#endif
pthread_mutex_t *spd_db_att_LOCK_xid_cache;
HASH *spd_db_att_xid_cache;
struct charset_info_st *spd_charset_utf8_bin;
@@ -1789,6 +1792,8 @@ int spider_parse_connect_info(
#ifdef HA_CAN_FORCE_BULK_DELETE
share->force_bulk_delete = -1;
#endif
+ share->casual_read = -1;
+ share->delete_all_rows_type = -1;
#ifdef WITH_PARTITION_STORAGE_ENGINE
for (roop_count = 4; roop_count > 0; roop_count--)
@@ -1918,6 +1923,7 @@ int spider_parse_connect_info(
#endif
SPIDER_PARAM_DOUBLE("civ", crd_interval, 0);
SPIDER_PARAM_INT_WITH_MAX("cmd", crd_mode, 0, 3);
+ SPIDER_PARAM_INT_WITH_MAX("csr", casual_read, 0, 63);
#ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARAM_INT_WITH_MAX("csy", crd_sync, 0, 2);
#endif
@@ -1925,6 +1931,7 @@ int spider_parse_connect_info(
2147483647);
SPIDER_PARAM_INT_WITH_MAX("ctp", crd_type, 0, 2);
SPIDER_PARAM_DOUBLE("cwg", crd_weight, 1);
+ SPIDER_PARAM_INT_WITH_MAX("dat", delete_all_rows_type, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("ddi", direct_dup_insert, 0, 1);
SPIDER_PARAM_STR_LIST("dff", tgt_default_files);
SPIDER_PARAM_STR_LIST("dfg", tgt_default_groups);
@@ -2108,6 +2115,7 @@ int spider_parse_connect_info(
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
SPIDER_PARAM_LONG_LIST_WITH_MAX("use_hs_read", use_hs_reads, 0, 1);
#endif
+ SPIDER_PARAM_INT_WITH_MAX("casual_read", casual_read, 0, 63);
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
MYF(0), tmp_ptr);
@@ -2256,6 +2264,8 @@ int spider_parse_connect_info(
case 20:
SPIDER_PARAM_LONGLONG_LIST_WITH_MAX(
"monitoring_server_id", monitoring_sid, 0, 4294967295LL);
+ SPIDER_PARAM_INT_WITH_MAX(
+ "delete_all_rows_type", delete_all_rows_type, 0, 1);
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
MYF(0), tmp_ptr);
@@ -3433,6 +3443,16 @@ int spider_set_connect_info_default(
if (share->force_bulk_delete == -1)
share->force_bulk_delete = 0;
#endif
+ if (share->casual_read == -1)
+ share->casual_read = 0;
+ if (share->delete_all_rows_type == -1)
+ {
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ share->delete_all_rows_type = 1;
+#else
+ share->delete_all_rows_type = 0;
+#endif
+ }
if (share->bka_mode == -1)
share->bka_mode = 1;
if (!share->bka_engine)
@@ -4320,12 +4340,15 @@ SPIDER_SHARE *spider_get_share(
&result_list->tmp_table_created,
sizeof(uchar) * share->link_bitmap_size,
#ifdef HA_CAN_BULK_ACCESS
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
&result_list->hs_r_bulk_open_index,
sizeof(uchar) * share->link_bitmap_size,
&result_list->hs_w_bulk_open_index,
sizeof(uchar) * share->link_bitmap_size,
#endif
+#endif
&result_list->sql_kind_backup, sizeof(uint) * share->link_count,
+ &result_list->casual_read, sizeof(int) * share->link_count,
&spider->dbton_handler,
sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE,
NullS))
@@ -4759,12 +4782,15 @@ SPIDER_SHARE *spider_get_share(
&result_list->tmp_table_created,
sizeof(uchar) * share->link_bitmap_size,
#ifdef HA_CAN_BULK_ACCESS
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
&result_list->hs_r_bulk_open_index,
sizeof(uchar) * share->link_bitmap_size,
&result_list->hs_w_bulk_open_index,
sizeof(uchar) * share->link_bitmap_size,
#endif
+#endif
&result_list->sql_kind_backup, sizeof(uint) * share->link_count,
+ &result_list->casual_read, sizeof(int) * share->link_count,
&spider->dbton_handler,
sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE,
NullS))
@@ -5669,21 +5695,14 @@ int spider_close_connection(
handlerton* hton,
THD* thd
) {
- int roop_count = 0, need_mon = 0;
+ int roop_count = 0;
SPIDER_CONN *conn;
SPIDER_TRX *trx;
- ha_spider tmp_spider;
- char buf[MAX_FIELD_WIDTH];
- spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin);
DBUG_ENTER("spider_close_connection");
- tmp_str.init_calc_mem(121);
if (!(trx = (SPIDER_TRX*) *thd_ha_data(thd, spider_hton_ptr)))
DBUG_RETURN(0); /* transaction is not started */
- tmp_spider.conns = &conn;
- tmp_spider.need_mons = &need_mon;
- tmp_spider.trx = trx;
- tmp_spider.result_list.sqls = &tmp_str;
+ trx->tmp_spider->conns = &conn;
while ((conn = (SPIDER_CONN*) my_hash_element(&trx->trx_conn_hash,
roop_count)))
{
@@ -5695,7 +5714,7 @@ int spider_close_connection(
conn->disable_reconnect = FALSE;
if (conn->table_lock != 2)
{
- spider_db_unlock_tables(&tmp_spider, 0);
+ spider_db_unlock_tables(trx->tmp_spider, 0);
}
conn->table_lock = 0;
}
@@ -6000,6 +6019,16 @@ int spider_db_init(
HMODULE current_module = GetModuleHandle(NULL);
spd_db_att_thread_id = (ulong *)
GetProcAddress(current_module, "?thread_id@@3KA");
+#ifdef XID_CACHE_IS_SPLITTED
+ spd_db_att_xid_cache_split_num = (uint *)
+ GetProcAddress(current_module,
+ "?opt_xid_cache_split_num@@3IA");
+ spd_db_att_LOCK_xid_cache = *((pthread_mutex_t **)
+ GetProcAddress(current_module,
+ "?LOCK_xid_cache@@3PAUst_mysql_mutex@@A"));
+ spd_db_att_xid_cache = *((HASH **)
+ GetProcAddress(current_module, "?xid_cache@@3PAUst_hash@@A"));
+#else
spd_db_att_LOCK_xid_cache = (pthread_mutex_t *)
#if MYSQL_VERSION_ID < 50500
GetProcAddress(current_module,
@@ -6010,6 +6039,7 @@ int spider_db_init(
#endif
spd_db_att_xid_cache = (HASH *)
GetProcAddress(current_module, "?xid_cache@@3Ust_hash@@A");
+#endif
spd_charset_utf8_bin = (struct charset_info_st *)
GetProcAddress(current_module, "my_charset_utf8_bin");
spd_defaults_extra_file = (const char **)
@@ -6018,8 +6048,14 @@ int spider_db_init(
GetProcAddress(current_module, "my_defaults_file");
#else
spd_db_att_thread_id = &thread_id;
+#ifdef XID_CACHE_IS_SPLITTED
+ spd_db_att_xid_cache_split_num = &opt_xid_cache_split_num;
+ spd_db_att_LOCK_xid_cache = LOCK_xid_cache;
+ spd_db_att_xid_cache = xid_cache;
+#else
spd_db_att_LOCK_xid_cache = &LOCK_xid_cache;
spd_db_att_xid_cache = &xid_cache;
+#endif
spd_charset_utf8_bin = &my_charset_utf8_bin;
spd_defaults_extra_file = &my_defaults_extra_file;
spd_defaults_file = &my_defaults_file;
@@ -7489,7 +7525,7 @@ longlong spider_split_read_param(
/* This case must select by one shot */
DBUG_PRINT("info",("spider cancel split read"));
result_list->split_read_base = 9223372036854775807LL;
- result_list->semi_split_read = 9223372036854775807LL;
+ result_list->semi_split_read = 0;
result_list->semi_split_read_limit = 9223372036854775807LL;
result_list->first_read = 9223372036854775807LL;
result_list->second_read = 9223372036854775807LL;
@@ -7596,8 +7632,25 @@ bool spider_check_direct_order_limit(
longlong select_limit;
longlong offset_limit;
DBUG_ENTER("spider_check_direct_order_limit");
- if (spider->sql_command != SQLCOM_HA_READ)
- {
+ DBUG_PRINT("info",("spider SQLCOM_HA_READ=%s",
+ (spider->sql_command == SQLCOM_HA_READ) ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider has_clone_for_merge=%s",
+ spider->has_clone_for_merge ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider is_clone=%s",
+ spider->is_clone ? "TRUE" : "FALSE"));
+#ifdef HA_CAN_BULK_ACCESS
+ DBUG_PRINT("info",("spider is_bulk_access_clone=%s",
+ spider->is_bulk_access_clone ? "TRUE" : "FALSE"));
+#endif
+ if (
+ spider->sql_command != SQLCOM_HA_READ &&
+ !spider->has_clone_for_merge &&
+#ifdef HA_CAN_BULK_ACCESS
+ (!spider->is_clone || spider->is_bulk_access_clone)
+#else
+ !spider->is_clone
+#endif
+ ) {
spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
bool first_check = TRUE;
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
@@ -7660,8 +7713,25 @@ bool spider_check_direct_order_limit(
longlong direct_order_limit = spider_param_direct_order_limit(thd,
share->direct_order_limit);
+ DBUG_PRINT("info",("spider direct_order_limit=%lld", direct_order_limit));
if (direct_order_limit)
{
+ DBUG_PRINT("info",("spider first_check=%s",
+ first_check ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider (select_lex->options & OPTION_FOUND_ROWS)=%s",
+ (select_lex->options & OPTION_FOUND_ROWS) ? "TRUE" : "FALSE"));
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ DBUG_PRINT("info",("spider direct_aggregate=%s",
+ spider->result_list.direct_aggregate ? "TRUE" : "FALSE"));
+#endif
+ DBUG_PRINT("info",("spider select_lex->group_list.elements=%u",
+ select_lex->group_list.elements));
+ DBUG_PRINT("info",("spider select_lex->with_sum_func=%s",
+ select_lex->with_sum_func ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider select_lex->having=%s",
+ select_lex->having ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider select_lex->order_list.elements=%u",
+ select_lex->order_list.elements));
if (
!first_check ||
!select_lex->explicit_limit ||
@@ -7989,8 +8059,13 @@ int spider_discover_table_structure(
{
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
}
+#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE_COMMENT
if (!(part_syntax = generate_partition_syntax(part_info, &part_syntax_len,
FALSE, TRUE, info, NULL, NULL)))
+#else
+ if (!(part_syntax = generate_partition_syntax(part_info, &part_syntax_len,
+ FALSE, TRUE, info, NULL)))
+#endif
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
diff --git a/storage/spider/spd_table.h b/storage/spider/spd_table.h
index ea5f50bd98a..1b76aa7dfb8 100644
--- a/storage/spider/spd_table.h
+++ b/storage/spider/spd_table.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc
index 8a89804d923..a66fa5a7f5d 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -38,11 +38,15 @@
#include "spd_ping_table.h"
#include "spd_malloc.h"
+#ifdef XID_CACHE_IS_SPLITTED
+extern uint *spd_db_att_xid_cache_split_num;
+#endif
extern pthread_mutex_t *spd_db_att_LOCK_xid_cache;
extern HASH *spd_db_att_xid_cache;
extern struct charset_info_st *spd_charset_utf8_bin;
extern handlerton *spider_hton_ptr;
+extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
pthread_mutex_t spider_thread_id_mutex;
ulonglong spider_thread_id = 1;
@@ -213,18 +217,15 @@ int spider_free_trx_another_conn(
bool lock
) {
int error_num, tmp_error_num;
- int roop_count = 0, need_mon = 0;
+ int roop_count = 0;
SPIDER_CONN *conn;
- ha_spider tmp_spider;
DBUG_ENTER("spider_free_trx_another_conn");
- tmp_spider.conns = &conn;
- tmp_spider.need_mons = &need_mon;
+ trx->tmp_spider->conns = &conn;
error_num = 0;
while ((conn = (SPIDER_CONN*) my_hash_element(&trx->trx_another_conn_hash,
roop_count)))
{
- tmp_spider.trx = trx;
- if (lock && (tmp_error_num = spider_db_unlock_tables(&tmp_spider, 0)))
+ if (lock && (tmp_error_num = spider_db_unlock_tables(trx->tmp_spider, 0)))
error_num = tmp_error_num;
spider_free_conn_from_trx(trx, conn, TRUE, TRUE, &roop_count);
}
@@ -352,20 +353,16 @@ int spider_trx_all_unlock_tables(
SPIDER_TRX *trx
) {
int error_num;
- int roop_count = 0, need_mon = 0;
+ int roop_count = 0;
THD *thd = trx->thd;
SPIDER_CONN *conn;
- ha_spider tmp_spider;
DBUG_ENTER("spider_trx_all_unlock_tables");
SPIDER_BACKUP_DASTATUS;
- memset((void*)&tmp_spider, 0, sizeof(ha_spider));
- tmp_spider.conns = &conn;
- tmp_spider.need_mons = &need_mon;
+ trx->tmp_spider->conns = &conn;
while ((conn = (SPIDER_CONN*) my_hash_element(&trx->trx_conn_hash,
roop_count)))
{
- tmp_spider.trx = trx;
- if ((error_num = spider_db_unlock_tables(&tmp_spider, 0)))
+ if ((error_num = spider_db_unlock_tables(trx->tmp_spider, 0)))
{
SPIDER_CONN_RESTORE_DASTATUS_AND_RESET_ERROR_NUM;
if (error_num)
@@ -1049,6 +1046,36 @@ int spider_free_trx_alloc(
) {
int roop_count;
DBUG_ENTER("spider_free_trx_alloc");
+ if (trx->tmp_spider)
+ {
+ for (roop_count = 0; roop_count < SPIDER_DBTON_SIZE; ++roop_count)
+ {
+ if (trx->tmp_spider->dbton_handler[roop_count])
+ {
+ delete trx->tmp_spider->dbton_handler[roop_count];
+ trx->tmp_spider->dbton_handler[roop_count] = NULL;
+ }
+ }
+ if (trx->tmp_spider->result_list.sqls)
+ {
+ delete [] trx->tmp_spider->result_list.sqls;
+ trx->tmp_spider->result_list.sqls = NULL;
+ }
+ delete trx->tmp_spider;
+ trx->tmp_spider = NULL;
+ }
+ if (trx->tmp_share)
+ {
+ for (roop_count = 0; roop_count < SPIDER_DBTON_SIZE; ++roop_count)
+ {
+ if (trx->tmp_share->dbton_share[roop_count])
+ {
+ delete trx->tmp_share->dbton_share[roop_count];
+ trx->tmp_share->dbton_share[roop_count] = NULL;
+ }
+ }
+ spider_free_tmp_share_alloc(trx->tmp_share);
+ }
spider_db_udf_free_set_names(trx);
for (roop_count = spider_param_udf_table_lock_mutex_count() - 1;
roop_count >= 0; roop_count--)
@@ -1100,6 +1127,7 @@ int spider_free_trx_alloc(
trx->trx_alter_table_hash.array.max_element *
trx->trx_alter_table_hash.array.size_of_element);
my_hash_free(&trx->trx_alter_table_hash);
+ free_root(&trx->mem_root, MYF(0));
DBUG_RETURN(0);
}
@@ -1108,8 +1136,9 @@ SPIDER_TRX *spider_get_trx(
bool regist_allocated_thds,
int *error_num
) {
- int roop_count = 0;
+ int roop_count = 0, roop_count2;
SPIDER_TRX *trx;
+ SPIDER_SHARE *tmp_share;
pthread_mutex_t *udf_table_mutexes;
DBUG_ENTER("spider_get_trx");
@@ -1121,12 +1150,15 @@ SPIDER_TRX *spider_get_trx(
if (!(trx = (SPIDER_TRX *)
spider_bulk_malloc(NULL, 56, MYF(MY_WME | MY_ZEROFILL),
&trx, sizeof(*trx),
+ &tmp_share, sizeof(SPIDER_SHARE),
&udf_table_mutexes, sizeof(pthread_mutex_t) *
spider_param_udf_table_lock_mutex_count(),
NullS))
)
goto error_alloc_trx;
+ SPD_INIT_ALLOC_ROOT(&trx->mem_root, 4096, 0, MYF(MY_WME));
+ trx->tmp_share = tmp_share;
trx->udf_table_mutexes = udf_table_mutexes;
for (roop_count = 0;
@@ -1263,6 +1295,79 @@ SPIDER_TRX *spider_get_trx(
if (thd)
{
+ spider_set_tmp_share_pointer(trx->tmp_share, trx->tmp_connect_info,
+ trx->tmp_connect_info_length, trx->tmp_long, trx->tmp_longlong);
+ if (
+ spider_set_connect_info_default(
+ trx->tmp_share,
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ NULL,
+ NULL,
+#endif
+ NULL
+ ) ||
+ spider_set_connect_info_default_db_table(
+ trx->tmp_share,
+ "", 0,
+ "", 0
+ ) ||
+ spider_create_conn_keys(trx->tmp_share)
+ ) {
+ goto error_set_connect_info_default;
+ }
+
+ if (!(trx->tmp_spider = new (&trx->mem_root) ha_spider()))
+ {
+ goto error_alloc_spider;
+ }
+ trx->tmp_spider->need_mons = &trx->tmp_need_mon;
+ trx->tmp_spider->share = trx->tmp_share;
+ trx->tmp_spider->trx = trx;
+ trx->tmp_spider->dbton_handler = trx->tmp_dbton_handler;
+ if (!(trx->tmp_spider->result_list.sqls =
+ new spider_string[trx->tmp_share->link_count]))
+ {
+ goto error_init_result_list_sql;
+ }
+ for (roop_count2 = 0; roop_count2 < (int) trx->tmp_share->link_count;
+ ++roop_count2)
+ {
+ trx->tmp_spider->result_list.sqls[roop_count2].init_calc_mem(121);
+ trx->tmp_spider->result_list.sqls[roop_count2].set_charset(
+ trx->tmp_share->access_charset);
+ }
+
+ for (roop_count2 = 0; roop_count2 < SPIDER_DBTON_SIZE; ++roop_count2)
+ {
+ if (!spider_dbton[roop_count2].init)
+ continue;
+
+ if (!(trx->tmp_share->dbton_share[roop_count2] =
+ spider_dbton[roop_count2].create_db_share(trx->tmp_share)))
+ {
+ goto error_create_db_share;
+ }
+ if (trx->tmp_share->dbton_share[roop_count2]->init())
+ {
+ delete trx->tmp_share->dbton_share[roop_count2];
+ trx->tmp_share->dbton_share[roop_count2] = NULL;
+ goto error_create_db_share;
+ }
+
+ if (!(trx->tmp_spider->dbton_handler[roop_count2] =
+ spider_dbton[roop_count2].create_db_handler(trx->tmp_spider,
+ trx->tmp_share->dbton_share[roop_count2])))
+ {
+ goto error_create_db_share;
+ }
+ if (trx->tmp_spider->dbton_handler[roop_count2]->init())
+ {
+ delete trx->tmp_spider->dbton_handler[roop_count2];
+ trx->tmp_spider->dbton_handler[roop_count2] = NULL;
+ goto error_create_db_share;
+ }
+ }
+
if (regist_allocated_thds)
{
pthread_mutex_lock(&spider_allocated_thds_mutex);
@@ -1295,6 +1400,37 @@ SPIDER_TRX *spider_get_trx(
DBUG_RETURN(trx);
error_allocated_thds_insert:
+error_alloc_spider:
+error_create_db_share:
+ if (thd)
+ {
+ delete [] trx->tmp_spider->result_list.sqls;
+ trx->tmp_spider->result_list.sqls = NULL;
+ }
+error_init_result_list_sql:
+ if (thd)
+ {
+ delete trx->tmp_spider;
+ trx->tmp_spider = NULL;
+ for (roop_count2 = 0; roop_count2 < SPIDER_DBTON_SIZE; ++roop_count2)
+ {
+ if (trx->tmp_spider->dbton_handler[roop_count2])
+ {
+ delete trx->tmp_spider->dbton_handler[roop_count2];
+ trx->tmp_spider->dbton_handler[roop_count2] = NULL;
+ }
+ if (trx->tmp_share->dbton_share[roop_count2])
+ {
+ delete trx->tmp_share->dbton_share[roop_count2];
+ trx->tmp_share->dbton_share[roop_count2] = NULL;
+ }
+ }
+ }
+error_set_connect_info_default:
+ if (thd)
+ {
+ spider_free_tmp_share_alloc(trx->tmp_share);
+ }
spider_free_mem_calc(trx,
trx->trx_ha_hash_id,
trx->trx_ha_hash.array.max_element *
@@ -1360,6 +1496,7 @@ error_init_hash:
pthread_mutex_destroy(&trx->udf_table_mutexes[roop_count]);
}
error_init_udf_table_mutex:
+ free_root(&trx->mem_root, MYF(0));
spider_free(NULL, trx, MYF(0));
error_alloc_trx:
*error_num = HA_ERR_OUT_OF_MEM;
@@ -1500,16 +1637,31 @@ int spider_check_and_set_time_zone(
int spider_xa_lock(
XID_STATE *xid_state
) {
+ THD *thd = current_thd;
int error_num;
+ const char *old_proc_info;
DBUG_ENTER("spider_xa_lock");
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache,
(uchar*) xid_state->xid.key(), xid_state->xid.key_length());
+#ifdef XID_CACHE_IS_SPLITTED
+ uint idx = hash_value % *spd_db_att_xid_cache_split_num;
#endif
+#endif
+ old_proc_info = thd_proc_info(thd, "Locking xid by Spider");
+#ifdef XID_CACHE_IS_SPLITTED
+ pthread_mutex_lock(&spd_db_att_LOCK_xid_cache[idx]);
+#else
pthread_mutex_lock(spd_db_att_LOCK_xid_cache);
+#endif
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+#ifdef XID_CACHE_IS_SPLITTED
+ if (my_hash_search_using_hash_value(&spd_db_att_xid_cache[idx], hash_value,
+ xid_state->xid.key(), xid_state->xid.key_length()))
+#else
if (my_hash_search_using_hash_value(spd_db_att_xid_cache, hash_value,
xid_state->xid.key(), xid_state->xid.key_length()))
+#endif
#else
if (my_hash_search(spd_db_att_xid_cache,
xid_state->xid.key(), xid_state->xid.key_length()))
@@ -1519,8 +1671,13 @@ int spider_xa_lock(
goto error;
}
#ifdef HASH_UPDATE_WITH_HASH_VALUE
+#ifdef XID_CACHE_IS_SPLITTED
+ if (my_hash_insert_with_hash_value(&spd_db_att_xid_cache[idx], hash_value,
+ (uchar*)xid_state))
+#else
if (my_hash_insert_with_hash_value(spd_db_att_xid_cache, hash_value,
(uchar*)xid_state))
+#endif
#else
if (my_hash_insert(spd_db_att_xid_cache, (uchar*)xid_state))
#endif
@@ -1528,29 +1685,60 @@ int spider_xa_lock(
error_num = HA_ERR_OUT_OF_MEM;
goto error;
}
+#ifdef XID_CACHE_IS_SPLITTED
+ pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]);
+#else
pthread_mutex_unlock(spd_db_att_LOCK_xid_cache);
+#endif
+ thd_proc_info(thd, old_proc_info);
DBUG_RETURN(0);
error:
+#ifdef XID_CACHE_IS_SPLITTED
+ pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]);
+#else
pthread_mutex_unlock(spd_db_att_LOCK_xid_cache);
+#endif
+ thd_proc_info(thd, old_proc_info);
DBUG_RETURN(error_num);
}
int spider_xa_unlock(
XID_STATE *xid_state
) {
+ THD *thd = current_thd;
+ const char *old_proc_info;
DBUG_ENTER("spider_xa_unlock");
#if defined(SPIDER_HAS_HASH_VALUE_TYPE) && defined(HASH_UPDATE_WITH_HASH_VALUE)
my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache,
(uchar*) xid_state->xid.key(), xid_state->xid.key_length());
+#ifdef XID_CACHE_IS_SPLITTED
+ uint idx = hash_value % *spd_db_att_xid_cache_split_num;
#endif
+#endif
+ old_proc_info = thd_proc_info(thd, "Unlocking xid by Spider");
+#ifdef XID_CACHE_IS_SPLITTED
+ pthread_mutex_lock(&spd_db_att_LOCK_xid_cache[idx]);
+#else
pthread_mutex_lock(spd_db_att_LOCK_xid_cache);
+#endif
#if defined(SPIDER_HAS_HASH_VALUE_TYPE) && defined(HASH_UPDATE_WITH_HASH_VALUE)
- my_hash_delete_with_hash_value(spd_db_att_xid_cache, hash_value, (uchar *)xid_state);
+#ifdef XID_CACHE_IS_SPLITTED
+ my_hash_delete_with_hash_value(&spd_db_att_xid_cache[idx],
+ hash_value, (uchar *)xid_state);
+#else
+ my_hash_delete_with_hash_value(spd_db_att_xid_cache,
+ hash_value, (uchar *)xid_state);
+#endif
#else
my_hash_delete(spd_db_att_xid_cache, (uchar *)xid_state);
#endif
+#ifdef XID_CACHE_IS_SPLITTED
+ pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]);
+#else
pthread_mutex_unlock(spd_db_att_LOCK_xid_cache);
+#endif
+ thd_proc_info(thd, old_proc_info);
DBUG_RETURN(0);
}
@@ -1572,10 +1760,11 @@ int spider_internal_start_trx(
) {
int error_num;
SPIDER_TRX *trx = spider->trx;
- bool sync_autocommit = spider_param_sync_autocommit(trx->thd);
- bool sync_time_zone = spider_param_sync_time_zone(trx->thd);
+ THD *thd = trx->thd;
+ bool sync_autocommit = spider_param_sync_autocommit(thd);
+ bool sync_time_zone = spider_param_sync_time_zone(thd);
double ping_interval_at_trx_start =
- spider_param_ping_interval_at_trx_start(trx->thd);
+ spider_param_ping_interval_at_trx_start(thd);
bool xa_lock = FALSE;
time_t tmp_time = (time_t) time((time_t*) 0);
DBUG_ENTER("spider_internal_start_trx");
@@ -1592,19 +1781,19 @@ int spider_internal_start_trx(
if (!trx->trx_consistent_snapshot)
{
trx->use_consistent_snapshot =
- spider_param_use_consistent_snapshot(trx->thd);
- trx->internal_xa = spider_param_internal_xa(trx->thd);
- trx->internal_xa_snapshot = spider_param_internal_xa_snapshot(trx->thd);
+ spider_param_use_consistent_snapshot(thd);
+ trx->internal_xa = spider_param_internal_xa(thd);
+ trx->internal_xa_snapshot = spider_param_internal_xa_snapshot(thd);
}
}
if (
- (error_num = spider_check_and_set_sql_log_off(trx->thd, conn,
+ (error_num = spider_check_and_set_sql_log_off(thd, conn,
&spider->need_mons[link_idx])) ||
(sync_time_zone &&
- (error_num = spider_check_and_set_time_zone(trx->thd, conn,
+ (error_num = spider_check_and_set_time_zone(thd, conn,
&spider->need_mons[link_idx]))) ||
(sync_autocommit &&
- (error_num = spider_check_and_set_autocommit(trx->thd, conn,
+ (error_num = spider_check_and_set_autocommit(thd, conn,
&spider->need_mons[link_idx])))
)
goto error;
@@ -1628,70 +1817,74 @@ int spider_internal_start_trx(
if (!trx->trx_start)
{
if (
- trx->thd->transaction.xid_state.xa_state == XA_ACTIVE &&
+ thd->transaction.xid_state.xa_state == XA_ACTIVE &&
spider_param_support_xa()
) {
trx->trx_xa = TRUE;
- thd_get_xid(trx->thd, (MYSQL_XID*) &trx->xid);
+ thd_get_xid(thd, (MYSQL_XID*) &trx->xid);
}
- if (!trx->trx_xa && trx->internal_xa)
- {
- if (!trx->trx_consistent_snapshot || trx->internal_xa_snapshot == 3)
+ if (
+ !trx->trx_xa &&
+ trx->internal_xa &&
+ (!trx->trx_consistent_snapshot || trx->internal_xa_snapshot == 3) &&
+ spider->sql_command != SQLCOM_LOCK_TABLES
+ ) {
+ trx->trx_xa = TRUE;
+ trx->xid.formatID = 1;
+ if (spider_param_internal_xa_id_type(thd) == 0)
{
- trx->trx_xa = TRUE;
- trx->xid.formatID = 1;
trx->xid.gtrid_length
= my_sprintf(trx->xid.data,
- (trx->xid.data, "%lx", thd_get_thread_id(trx->thd)));
+ (trx->xid.data, "%lx", thd_get_thread_id(thd)));
+ } else {
+ trx->xid.gtrid_length
+ = my_sprintf(trx->xid.data,
+ (trx->xid.data, "%lx%016llx", thd_get_thread_id(thd),
+ thd->query_id));
+ }
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
- trx->xid.bqual_length
- = my_sprintf(trx->xid.data + trx->xid.gtrid_length,
- (trx->xid.data + trx->xid.gtrid_length, "%lx",
- trx->thd->variables.server_id));
+ trx->xid.bqual_length
+ = my_sprintf(trx->xid.data + trx->xid.gtrid_length,
+ (trx->xid.data + trx->xid.gtrid_length, "%lx",
+ thd->variables.server_id));
#else
- trx->xid.bqual_length
- = my_sprintf(trx->xid.data + trx->xid.gtrid_length,
- (trx->xid.data + trx->xid.gtrid_length, "%x",
- trx->thd->server_id));
+ trx->xid.bqual_length
+ = my_sprintf(trx->xid.data + trx->xid.gtrid_length,
+ (trx->xid.data + trx->xid.gtrid_length, "%x",
+ thd->server_id));
#endif
- trx->internal_xid_state.xa_state = XA_ACTIVE;
- trx->internal_xid_state.xid.set(&trx->xid);
- trx->internal_xid_state.in_thd = 1;
- while ((error_num = spider_xa_lock(&trx->internal_xid_state)))
- {
- if (error_num != ER_SPIDER_XA_LOCKED_NUM)
- goto error;
- else if (trx->xid.formatID == 0)
- {
- my_message(error_num, ER_SPIDER_XA_LOCKED_STR, MYF(0));
- goto error;
- }
- /* retry */
- trx->xid.formatID++;
- trx->internal_xid_state.xid.set(&trx->xid);
- }
- xa_lock = TRUE;
+ trx->internal_xid_state.xa_state = XA_ACTIVE;
+ trx->internal_xid_state.xid.set(&trx->xid);
+ trx->internal_xid_state.in_thd = 1;
+ if ((error_num = spider_xa_lock(&trx->internal_xid_state)))
+ {
+ if (error_num == ER_SPIDER_XA_LOCKED_NUM)
+ my_message(error_num, ER_SPIDER_XA_LOCKED_STR, MYF(0));
+ goto error;
}
- }
+ xa_lock = TRUE;
+ } else
+ trx->internal_xa = FALSE;
DBUG_PRINT("info",("spider trx->trx_consistent_snapshot= %s",
trx->trx_consistent_snapshot ? "TRUE" : "FALSE"));
if (!trx->trx_consistent_snapshot)
{
- trans_register_ha(trx->thd, FALSE, spider_hton_ptr);
- if (thd_test_options(trx->thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
- trans_register_ha(trx->thd, TRUE, spider_hton_ptr);
+ trans_register_ha(thd, FALSE, spider_hton_ptr);
+ if (thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
+ trans_register_ha(thd, TRUE, spider_hton_ptr);
}
trx->trx_start = TRUE;
+ trx->trx_xa_prepared = FALSE;
}
DBUG_PRINT("info",("spider sync_autocommit = %d", sync_autocommit));
DBUG_PRINT("info",("spider conn->semi_trx_chk = %d", conn->semi_trx_chk));
DBUG_PRINT("info",("spider conn->table_lock = %d", conn->table_lock));
DBUG_PRINT("info",("spider conn->autocommit = %d", conn->autocommit));
- DBUG_PRINT("info",("spider semi_trx = %d", spider_param_semi_trx(trx->thd)));
+ DBUG_PRINT("info",("spider semi_trx = %d", spider_param_semi_trx(thd)));
conn->semi_trx = FALSE;
if (conn->table_lock == 3)
{
@@ -1708,7 +1901,7 @@ int spider_internal_start_trx(
(!conn->queued_autocommit && conn->autocommit == 1) ||
(conn->queued_autocommit && conn->queued_autocommit_val == TRUE)
) &&
- spider_param_semi_trx(trx->thd)
+ spider_param_semi_trx(thd)
) {
DBUG_PRINT("info",("spider semi_trx is set"));
conn->semi_trx = TRUE;
@@ -1717,7 +1910,7 @@ int spider_internal_start_trx(
conn->disable_xa = FALSE;
} else if (
!trx->trx_consistent_snapshot &&
- !thd_test_options(trx->thd, OPTION_BEGIN) &&
+ !thd_test_options(thd, OPTION_BEGIN) &&
sync_autocommit &&
conn->semi_trx_chk &&
!conn->table_lock &&
@@ -1725,14 +1918,14 @@ int spider_internal_start_trx(
(!conn->queued_autocommit && conn->autocommit == 1) ||
(conn->queued_autocommit && conn->queued_autocommit_val == TRUE)
) &&
- spider_param_semi_trx(trx->thd)
+ spider_param_semi_trx(thd)
) {
DBUG_PRINT("info",("spider semi_trx is set"));
spider_conn_queue_start_transaction(conn);
conn->semi_trx = TRUE;
} else if (
!trx->trx_consistent_snapshot &&
- thd_test_options(trx->thd, OPTION_BEGIN)
+ thd_test_options(thd, OPTION_BEGIN)
) {
DBUG_PRINT("info",("spider start transaction"));
spider_conn_queue_start_transaction(conn);
@@ -1848,6 +2041,8 @@ int spider_internal_xa_commit(
if ((conn = spider_tree_first(trx->join_trx_top)))
{
do {
+ if (conn->bg_search)
+ spider_bg_conn_break(conn, NULL);
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider conn->join_trx=%u", conn->join_trx));
if (conn->join_trx)
@@ -1950,12 +2145,11 @@ int spider_internal_xa_rollback(
Open_tables_backup open_tables_backup;
#endif
bool server_lost = FALSE;
- bool prepared = (thd->transaction.xid_state.xa_state == XA_PREPARED);
bool table_xa_opened = FALSE;
bool table_xa_member_opened = FALSE;
DBUG_ENTER("spider_internal_xa_rollback");
- if (prepared)
+ if (trx->trx_xa_prepared)
{
/*
select
@@ -2029,11 +2223,13 @@ int spider_internal_xa_rollback(
if ((conn = spider_tree_first(trx->join_trx_top)))
{
do {
+ if (conn->bg_search)
+ spider_bg_conn_break(conn, NULL);
if (conn->join_trx)
{
if (conn->disable_xa)
{
- if (conn->table_lock != 3 && !prepared)
+ if (conn->table_lock != 3 && !trx->trx_xa_prepared)
{
if (
!conn->server_lost &&
@@ -2048,7 +2244,7 @@ int spider_internal_xa_rollback(
if (!conn->server_lost)
{
if (
- !prepared &&
+ !trx->trx_xa_prepared &&
(tmp_error_num = spider_db_xa_end(conn, &trx->xid))
) {
if (
@@ -2102,7 +2298,7 @@ int spider_internal_xa_rollback(
goto error_in_rollback;
if (
- prepared &&
+ trx->trx_xa_prepared &&
!server_lost
) {
/*
@@ -2213,6 +2409,8 @@ int spider_internal_xa_prepare(
if ((conn = spider_tree_first(trx->join_trx_top)))
{
do {
+ if (conn->bg_search)
+ spider_bg_conn_break(conn, NULL);
if (conn->disable_xa)
{
if (conn->table_lock != 3)
@@ -3089,21 +3287,24 @@ int spider_commit(
{
if (trx->trx_xa)
{
- if (
- trx->internal_xa &&
- (error_num = spider_internal_xa_prepare(
- thd, trx, table_xa, table_xa_member, TRUE))
- ) {
+ if (trx->internal_xa && !trx->trx_xa_prepared)
+ {
+ if (
+ (error_num = spider_internal_xa_prepare(
+ thd, trx, table_xa, table_xa_member, TRUE))
+ ) {
/*
- if (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
- {
+ if (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
+ {
*/
- /* rollback for semi_trx */
- spider_rollback(hton, thd, all);
+ /* rollback for semi_trx */
+ spider_rollback(hton, thd, all);
/*
- }
+ }
*/
- DBUG_RETURN(error_num);
+ DBUG_RETURN(error_num);
+ }
+ trx->trx_xa_prepared = TRUE;
}
int tmp_error_num;
if (
@@ -3114,6 +3315,7 @@ int spider_commit(
error_num = tmp_error_num;
}
trx->trx_xa = FALSE;
+ trx->join_trx_top = NULL;
} else {
if ((conn = spider_tree_first(trx->join_trx_top)))
{
@@ -3183,6 +3385,7 @@ int spider_rollback(
error_num = tmp_error_num;
}
trx->trx_xa = FALSE;
+ trx->join_trx_top = NULL;
} else {
if ((conn = spider_tree_first(trx->join_trx_top)))
{
@@ -3246,6 +3449,7 @@ int spider_xa_prepare(
if ((error_num = spider_internal_xa_prepare(
thd, trx, table_xa, table_xa_member, FALSE)))
goto error;
+ trx->trx_xa_prepared = TRUE;
}
}
@@ -3315,22 +3519,40 @@ error_get_trx:
DBUG_RETURN(error_num);
}
+void spider_copy_table_free_trx_conn(
+ SPIDER_TRX *trx
+) {
+ SPIDER_CONN *conn;
+ DBUG_ENTER("spider_copy_table_free_trx_conn");
+ if ((conn = spider_tree_first(trx->join_trx_top)))
+ {
+ do {
+ spider_end_trx(trx, conn);
+ conn->join_trx = 0;
+ } while ((conn = spider_tree_next(conn)));
+ trx->join_trx_top = NULL;
+ }
+ spider_reuse_trx_ha(trx);
+ spider_free_trx_conn(trx, FALSE);
+ trx->trx_consistent_snapshot = FALSE;
+ spider_merge_mem_calc(trx, FALSE);
+ DBUG_VOID_RETURN;
+}
+
int spider_end_trx(
SPIDER_TRX *trx,
SPIDER_CONN *conn
) {
int error_num = 0, need_mon = 0;
- ha_spider tmp_spider;
DBUG_ENTER("spider_end_trx");
- tmp_spider.conns = &conn;
if (conn->table_lock == 3)
{
+ trx->tmp_spider->conns = &conn;
conn->table_lock = 0;
conn->disable_reconnect = FALSE;
- tmp_spider.trx = trx;
if (
!conn->server_lost &&
- (error_num = spider_db_unlock_tables(&tmp_spider, 0))
+ (error_num = spider_db_unlock_tables(trx->tmp_spider, 0))
) {
if (error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM)
error_num = 0;
@@ -3422,8 +3644,6 @@ int spider_check_trx_and_get_conn(
DBUG_PRINT("info",("spider semi_table_lock = %d",
spider_param_semi_table_lock(thd, share->semi_table_lock)));
DBUG_PRINT("info",("spider first_byte = %d", first_byte));
- DBUG_PRINT("info",("spider link_status = %ld",
- share->link_statuses[spider->conn_link_idx[spider->search_link_idx]]));
if (
!trx_ha ||
trx_ha->wait_for_reusing ||
@@ -3615,6 +3835,8 @@ int spider_check_trx_and_get_conn(
#endif
}
} else {
+ DBUG_PRINT("info",("spider link_status = %ld",
+ share->link_statuses[spider->conn_link_idx[spider->search_link_idx]]));
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
@@ -3757,12 +3979,12 @@ void spider_free_tmp_thd(
THD *thd
) {
DBUG_ENTER("spider_free_tmp_thd");
+ thd->cleanup();
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
thd->reset_globals();
#else
thd->restore_globals();
#endif
- thd->cleanup();
delete thd;
DBUG_VOID_RETURN;
}
diff --git a/storage/spider/spd_trx.h b/storage/spider/spd_trx.h
index 95814a4b95c..3f3ca7fabed 100644
--- a/storage/spider/spd_trx.h
+++ b/storage/spider/spd_trx.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2013 Kentoku Shiba
+/* Copyright (C) 2008-2014 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
@@ -208,6 +208,10 @@ int spider_xa_rollback_by_xid(
XID* xid
);
+void spider_copy_table_free_trx_conn(
+ SPIDER_TRX *trx
+);
+
int spider_end_trx(
SPIDER_TRX *trx,
SPIDER_CONN *conn
diff --git a/storage/spider/spd_udf.cc b/storage/spider/spd_udf.cc
index c116bd13805..1c457e69421 100644
--- a/storage/spider/spd_udf.cc
+++ b/storage/spider/spd_udf.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2013 Kentoku Shiba
+/* Copyright (C) 2009-2014 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
diff --git a/storage/spider/spd_udf.h b/storage/spider/spd_udf.h
index eb70055247c..0b20a10393e 100644
--- a/storage/spider/spd_udf.h
+++ b/storage/spider/spd_udf.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2013 Kentoku Shiba
+/* Copyright (C) 2009-2014 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