summaryrefslogtreecommitdiffstats
path: root/storage/spider
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 13:39:13 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 13:39:13 +0000
commit86fbb58c3ac0865482819c10a3e81f2eea001c36 (patch)
tree28c9e526ea739c6f9b89e36115e1e2698bddf981 /storage/spider
parentReleasing progress-linux version 1:10.11.6-2~progress7.99u1. (diff)
downloadmariadb-86fbb58c3ac0865482819c10a3e81f2eea001c36.tar.xz
mariadb-86fbb58c3ac0865482819c10a3e81f2eea001c36.zip
Merging upstream version 1:10.11.7.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'storage/spider')
-rw-r--r--storage/spider/ha_spider.cc58
-rw-r--r--storage/spider/mysql-test/spider/bugfix/disabled.def3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_deinit.inc12
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/gbh_outer_fields_in_join.result50
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_19866.result2
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result6
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result15
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_27575.result17
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_28683.result22
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_28739.result34
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_28739_simple.result21
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_29002.result34
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_29421.result19
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_29456.result42
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_29667.result40
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_29963.result44
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_30014.result37
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_30170.result7
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result9
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_32753.result10
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start.result14
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start_session.result17
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_32986.result24
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_33008.result25
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_33191.result14
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/perfschema.result11
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/signal_ddl_fail.result8
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/spider_join_with_non_spider.result24
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/spider_table_sts.result38
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/subquery.result25
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.cnf (renamed from storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.cnf)1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.test46
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test5
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test9
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test6
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_27575.test23
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_28683.test29
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_28739.cnf3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_28739.test41
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_28739_simple.test31
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test10
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_29002.test32
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test6
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_29421.test26
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_29456.test53
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_29667.cnf3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_29667.test44
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_29963.test56
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_30014.test46
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_30170.test8
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test5
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test11
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test12
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_32753.opt2
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_32753.test12
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.opt1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.test20
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start_session.test22
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_32986.test29
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_33008.test24
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_33191.test11
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/perfschema.opt1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/perfschema.test16
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.opt2
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.test10
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/spider_join_with_non_spider.test29
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.test46
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/subquery.test31
-rw-r--r--storage/spider/mysql-test/spider/include/clean_up_spider.inc3
-rw-r--r--storage/spider/mysql-test/spider/include/init_spider.inc21
-rw-r--r--storage/spider/mysql-test/spider/r/direct_join.result2
-rw-r--r--storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result2
-rw-r--r--storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result2
-rw-r--r--storage/spider/mysql-test/spider/r/direct_right_join.result2
-rw-r--r--storage/spider/mysql-test/spider/r/direct_right_join_nullable.result2
-rw-r--r--storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result2
-rw-r--r--storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result2
-rw-r--r--storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result2
-rw-r--r--storage/spider/mysql-test/spider/r/variable_deprecation.result2
-rw-r--r--storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result2
-rw-r--r--storage/spider/mysql-test/spider/t/variable_deprecation.test3
-rw-r--r--storage/spider/spd_conn.cc18
-rw-r--r--storage/spider/spd_copy_tables.cc14
-rw-r--r--storage/spider/spd_db_conn.cc80
-rw-r--r--storage/spider/spd_db_include.h64
-rw-r--r--storage/spider/spd_db_mysql.cc891
-rw-r--r--storage/spider/spd_db_mysql.h52
-rw-r--r--storage/spider/spd_direct_sql.cc12
-rw-r--r--storage/spider/spd_group_by_handler.cc595
-rw-r--r--storage/spider/spd_include.h281
-rw-r--r--storage/spider/spd_init_query.h43
-rw-r--r--storage/spider/spd_param.cc74
-rw-r--r--storage/spider/spd_ping_table.cc14
-rw-r--r--storage/spider/spd_sys_table.cc577
-rw-r--r--storage/spider/spd_sys_table.h93
-rw-r--r--storage/spider/spd_table.cc222
-rw-r--r--storage/spider/spd_trx.cc26
114 files changed, 2300 insertions, 2294 deletions
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc
index 312f94a8..5b85b3a2 100644
--- a/storage/spider/ha_spider.cc
+++ b/storage/spider/ha_spider.cc
@@ -58,7 +58,7 @@ ha_spider::ha_spider(
{
DBUG_ENTER("ha_spider::ha_spider");
DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 139);
+ spider_alloc_calc_mem_init(mem_calc, SPD_MID_HA_SPIDER_HA_SPIDER_1);
spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
share = NULL;
conns = NULL;
@@ -118,7 +118,7 @@ ha_spider::ha_spider(
{
DBUG_ENTER("ha_spider::ha_spider");
DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 0);
+ spider_alloc_calc_mem_init(mem_calc, SPD_MID_HA_SPIDER_HA_SPIDER_2);
spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
share = NULL;
conns = NULL;
@@ -358,10 +358,10 @@ int ha_spider::open(
}
for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
{
- result_list.sqls[roop_count].init_calc_mem(80);
- result_list.insert_sqls[roop_count].init_calc_mem(81);
- result_list.update_sqls[roop_count].init_calc_mem(82);
- result_list.tmp_sqls[roop_count].init_calc_mem(83);
+ result_list.sqls[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_3);
+ result_list.insert_sqls[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_4);
+ result_list.update_sqls[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_5);
+ result_list.tmp_sqls[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_6);
uint all_link_idx = conn_link_idx[roop_count];
uint dbton_id = share->sql_dbton_ids[all_link_idx];
if (share->dbton_share[dbton_id]->need_change_db_table_name())
@@ -392,7 +392,7 @@ int ha_spider::open(
}
for (roop_count = 0; roop_count < (int) table_share->fields; roop_count++)
{
- blob_buff[roop_count].init_calc_mem(84);
+ blob_buff[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_7);
blob_buff[roop_count].set_charset(table->field[roop_count]->charset());
}
}
@@ -860,6 +860,14 @@ int ha_spider::external_lock(
wide_handler->trx= trx;
/* End of wide_handler setup */
+ if (lock_type == F_UNLCK)
+ {
+ if (!trx->locked_connections)
+ {
+ DBUG_RETURN(0); /* No remote table actually locked by Spider */
+ }
+ }
+
if (store_error_num)
{
DBUG_RETURN(store_error_num);
@@ -888,10 +896,7 @@ int ha_spider::external_lock(
if (lock_type == F_UNLCK)
{
- if (sql_command != SQLCOM_UNLOCK_TABLES)
- {
- DBUG_RETURN(0); /* Unlock remote tables only by UNLOCK TABLES. */
- }
+ wide_handler->sql_command = SQLCOM_UNLOCK_TABLES;
if (!trx->locked_connections)
{
DBUG_RETURN(0); /* No remote table actually locked by Spider */
@@ -3592,7 +3597,7 @@ int ha_spider::multi_range_read_next_first(
spider_free(spider_current_trx, multi_range_keys, MYF(0));
}
if (!(multi_range_keys = (range_id_t *)
- spider_malloc(spider_current_trx, 1, sizeof(range_id_t) *
+ spider_malloc(spider_current_trx, SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_1, sizeof(range_id_t) *
(multi_range_num < result_list.multi_split_read ?
multi_range_num : result_list.multi_split_read), MYF(MY_WME)))
)
@@ -3605,7 +3610,7 @@ int ha_spider::multi_range_read_next_first(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
for (roop_count = 0; roop_count < 2; roop_count++)
- mrr_key_buff[roop_count].init_calc_mem(235);
+ mrr_key_buff[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_3);
}
error_num = 0;
if ((range_res = mrr_funcs.next(mrr_iter, &mrr_cur_range)))
@@ -6068,7 +6073,7 @@ FT_INFO *ha_spider::ft_init_ext(
if (!ft_current)
{
if (!(ft_current = (st_spider_ft_info *)
- spider_malloc(spider_current_trx, 2, sizeof(st_spider_ft_info),
+ spider_malloc(spider_current_trx, SPD_MID_HA_SPIDER_FT_INIT_EXT_1, sizeof(st_spider_ft_info),
MYF(MY_WME | MY_ZEROFILL))))
{
my_error(HA_ERR_OUT_OF_MEM, MYF(0));
@@ -6234,7 +6239,7 @@ int ha_spider::ft_read_internal(
DBUG_RETURN(check_error_mode_eof(error_num));
}
} else {
- uint dbton_id = share->use_sql_dbton_ids[roop_count];
+ uint dbton_id = share->sql_dbton_ids[roop_count];
spider_db_handler *dbton_hdl = dbton_handler[dbton_id];
SPIDER_CONN *conn = conns[roop_count];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
@@ -8484,7 +8489,7 @@ int ha_spider::create(
if (form->s->keys > 0)
{
if (!(tmp_share.static_key_cardinality = (longlong *)
- spider_bulk_malloc(spider_current_trx, 246, MYF(MY_WME),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_HA_SPIDER_CREATE_1, MYF(MY_WME),
&tmp_share.static_key_cardinality,
(uint) (sizeof(*tmp_share.static_key_cardinality) * form->s->keys),
NullS))
@@ -8499,7 +8504,7 @@ int ha_spider::create(
}
}
for (roop_count = 0; roop_count < form->s->keys; roop_count++)
- tmp_share.key_hint[roop_count].init_calc_mem(85);
+ tmp_share.key_hint[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_CREATE_2);
DBUG_PRINT("info",("spider tmp_share.key_hint=%p", tmp_share.key_hint));
if ((error_num = spider_parse_connect_info(&tmp_share, form->s,
form->part_info,
@@ -8521,7 +8526,10 @@ int ha_spider::create(
if (
thd->lex->create_info.or_replace() &&
(error_num = spider_delete_tables(
- table_tables, tmp_share.table_name, &dummy))
+ table_tables, tmp_share.table_name, &dummy)) &&
+ /* In this context, no key found in mysql.spider_tables means
+ the Spider table does not exist */
+ error_num != HA_ERR_KEY_NOT_FOUND
) {
goto error;
}
@@ -8948,12 +8956,6 @@ int ha_spider::delete_table(
)
need_lock = TRUE;
- if ((error_num = spider_sys_delete_table_sts(
- current_thd, name, name_len, need_lock)))
- goto error;
- if ((error_num = spider_sys_delete_table_crd(
- current_thd, name, name_len, need_lock)))
- goto error;
if (
!(table_tables = spider_open_sys_table(
current_thd, SPIDER_SYS_TABLES_TABLE_NAME_STR,
@@ -8966,6 +8968,10 @@ int ha_spider::delete_table(
(error_num = spider_delete_tables(
table_tables, name, &old_link_count))
) {
+ /* In this context, no key found in mysql.spider_tables means
+ the Spider table does not exist */
+ if (error_num == HA_ERR_KEY_NOT_FOUND)
+ error_num= HA_ERR_NO_SUCH_TABLE;
goto error;
}
spider_close_sys_table(current_thd, table_tables,
@@ -9157,7 +9163,7 @@ const COND *ha_spider::cond_push(
{
SPIDER_CONDITION *tmp_cond;
if (!(tmp_cond = (SPIDER_CONDITION *)
- spider_malloc(spider_current_trx, 3, sizeof(*tmp_cond), MYF(MY_WME)))
+ spider_malloc(spider_current_trx, SPD_MID_HA_SPIDER_COND_PUSH_1, sizeof(*tmp_cond), MYF(MY_WME)))
)
DBUG_RETURN(cond);
tmp_cond->cond = (COND *) cond;
@@ -9786,7 +9792,7 @@ int ha_spider::drop_tmp_tables()
) {
if (spider_bit_is_set(result_list.tmp_table_created, roop_count))
{
- uint dbton_id = share->use_sql_dbton_ids[roop_count];
+ uint dbton_id = share->sql_dbton_ids[roop_count];
spider_db_handler *dbton_hdl = dbton_handler[dbton_id];
SPIDER_CONN *conn = conns[roop_count];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
diff --git a/storage/spider/mysql-test/spider/bugfix/disabled.def b/storage/spider/mysql-test/spider/bugfix/disabled.def
index 3fd0a2d4..530b2825 100644
--- a/storage/spider/mysql-test/spider/bugfix/disabled.def
+++ b/storage/spider/mysql-test/spider/bugfix/disabled.def
@@ -1,3 +1,4 @@
wait_timeout : MDEV-26045
-mdev_29904 : MDEV-31101
mdev_27239: MDEV-32046
+mdev_27575 : MDEV-32997
+mdev_28739_simple : MDEV-33343
diff --git a/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_deinit.inc
deleted file mode 100644
index 01645e85..00000000
--- a/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_deinit.inc
+++ /dev/null
@@ -1,12 +0,0 @@
---connection master_1
-alter table mysql.spider_table_sts add column checksum bigint unsigned default null after update_time;
-DROP DATABASE IF EXISTS auto_test_local;
-
---let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP
---disable_warnings
---disable_query_log
---disable_result_log
---source ../t/test_deinit.inc
---enable_result_log
---enable_query_log
---enable_warnings
diff --git a/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_init.inc b/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_init.inc
deleted file mode 100644
index 1e438812..00000000
--- a/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_init.inc
+++ /dev/null
@@ -1,13 +0,0 @@
---disable_warnings
---disable_query_log
---disable_result_log
---source ../t/test_init.inc
---enable_result_log
---enable_query_log
---enable_warnings
---let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1
-let $MASTER_1_COMMENT_2_1=
- COMMENT='table "tbl_a", host "127.0.0.1", port "$MASTER_1_MYPORT", user "root"';
---connection master_1
-alter table mysql.spider_table_sts drop column checksum;
-insert into mysql.spider_table_sts values ('auto_test_local', 'tbl_a', 0, 0, 0, 0, 0, '2019-01-01 00:00:00', '2019-01-01 00:00:00', '2019-01-01 00:00:00');
diff --git a/storage/spider/mysql-test/spider/bugfix/r/gbh_outer_fields_in_join.result b/storage/spider/mysql-test/spider/bugfix/r/gbh_outer_fields_in_join.result
new file mode 100644
index 00000000..75c2f2c2
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/gbh_outer_fields_in_join.result
@@ -0,0 +1,50 @@
+#
+# MDEV-26247 Spider: Valid LEFT JOIN results in ERROR 1064
+#
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+connection child2_1;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+CREATE TABLE t1 (a int) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE t2 (a int) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE t3 (a int) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (1), (2);
+INSERT INTO t3 VALUES (1), (2), (3);
+connection master_1;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+CREATE TABLE t1 (a int) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='srv "s_2_1", table "t1"';
+CREATE TABLE t2 (a int) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='srv "s_2_1", table "t2"';
+CREATE TABLE t3 (a int) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='srv "s_2_1", table "t3"';
+select * from t3 left join t1 on t3.a = t1.a left join t2 on t3.a = t2.a;
+a a a
+1 1 1
+2 NULL 2
+3 NULL NULL
+select * from t1 left join t2 on t1.a = t2.a right join t3 on t3.a = t1.a;
+a a a
+1 1 1
+NULL NULL 2
+NULL NULL 3
+select * from t3 left join (t1 left join t2 on t1.a = t2.a) on t3.a = t1.a;
+a a a
+1 1 1
+2 NULL NULL
+3 NULL NULL
+drop table t1, t2, t3;
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+connection child2_1;
+DROP DATABASE IF EXISTS auto_test_remote;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_19866.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_19866.result
index dbf0f54c..4386b4cb 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_19866.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_19866.result
@@ -72,6 +72,7 @@ SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argum
argument
select `pkey`,`val` from `auto_test_remote`.`tbl_a`
select `pkey`,`val` from `auto_test_remote`.`tbl_a` where `pkey` = 1
+select 1 from (select 1) t0
select `pkey`,`val` from `auto_test_remote`.`tbl_a`
select `pkey`,`val` from `auto_test_remote`.`tbl_a`
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
@@ -85,6 +86,7 @@ argument
select `pkey`,`val` from `auto_test_remote2`.`tbl_a`
select `pkey`,`val` from `auto_test_remote2`.`tbl_a`
select `pkey`,`val` from `auto_test_remote2`.`tbl_a` where `pkey` = 2
+select 1 from (select 1) t0
select `pkey`,`val` from `auto_test_remote2`.`tbl_a`
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
SELECT pkey, val FROM tbl_a ORDER BY pkey;
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result
index b0a430e0..326b84a0 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result
@@ -6,6 +6,9 @@ for child2
for child3
set @old_spider_bgs_mode= @@spider_bgs_mode;
set session spider_bgs_mode=1;
+set spider_same_server_link=1;
+set @old_spider_same_server_link=@@global.spider_same_server_link;
+set global spider_same_server_link=1;
CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
create table td (a int, PRIMARY KEY (a));
create table ts (a int, PRIMARY KEY (a)) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_mdev_26151",TABLE "td", casual_read "3"';
@@ -26,6 +29,7 @@ min(a)
drop table td, ts;
drop server srv_mdev_26151;
set session spider_bgs_mode=@old_spider_bgs_mode;
+set global spider_same_server_link=@old_spider_same_server_link;
for master_1
for child2
for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result
index 723a81a9..6eddf9a7 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result
@@ -28,8 +28,6 @@ INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (1, 11), (2, 22), (3, 33);
INSERT INTO t3 VALUES (1, 111), (2, 222), (3, 333);
connection master_1;
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
CREATE DATABASE auto_test_local;
USE auto_test_local;
CREATE TABLE t1 (
@@ -82,7 +80,6 @@ a22
22
connection master_1;
DROP DATABASE IF EXISTS auto_test_local;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
connection child2_1;
DROP DATABASE IF EXISTS auto_test_remote;
for master_1
@@ -91,6 +88,3 @@ child2_1
child2_2
child2_3
for child3
-#
-# end of test mdev_26247
-#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result
index 72921d2e..35a9d916 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result
@@ -2,18 +2,3 @@
# MDEV-26541 Undefined symbol: _ZTI12ha_partition when attempting to use ha_spider.so in UBSAN builds
#
INSTALL SONAME 'ha_spider.so';
-DROP FUNCTION spider_flush_table_mon_cache;
-DROP FUNCTION spider_copy_tables;
-DROP FUNCTION spider_ping_table;
-DROP FUNCTION spider_bg_direct_sql;
-DROP FUNCTION spider_direct_sql;
-UNINSTALL SONAME IF EXISTS "ha_spider";
-DROP TABLE IF EXISTS mysql.spider_xa;
-DROP TABLE IF EXISTS mysql.spider_xa_member;
-DROP TABLE IF EXISTS mysql.spider_xa_failed_log;
-DROP TABLE IF EXISTS mysql.spider_tables;
-DROP TABLE IF EXISTS mysql.spider_link_mon_servers;
-DROP TABLE IF EXISTS mysql.spider_link_failed_log;
-DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery;
-DROP TABLE IF EXISTS mysql.spider_table_sts;
-DROP TABLE IF EXISTS mysql.spider_table_crd;
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_27575.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_27575.result
new file mode 100644
index 00000000..3b137eaa
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_27575.result
@@ -0,0 +1,17 @@
+#
+# MDEV-27575 Spider: UBSAN member access within null pointer of type 'struct st_plugin_int and SIGSEGV in intern_plugin_lock on SHUTDOWN when setting Spider as default storage engine (temporary or global)
+#
+for master_1
+for child2
+for child3
+SET GLOBAL default_tmp_storage_engine=spider;
+ERROR HY000: Table storage engine 'SPIDER' does not support the create option 'TEMPORARY'
+# restart
+SET GLOBAL default_storage_engine=Spider;
+# restart
+for master_1
+for child2
+for child3
+#
+# end of test mdev_27575
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_28683.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_28683.result
new file mode 100644
index 00000000..358c794e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_28683.result
@@ -0,0 +1,22 @@
+#
+# MDEV-28683 Spider: SIGSEGV in spider_db_direct_delete, SIGSEGV in spider_db_connect, ASAN: heap-use-after-free in spider_db_direct_delete
+#
+for master_1
+for child2
+for child3
+CREATE TABLE t (c INT) ENGINE=Spider;
+SELECT * FROM t;
+ERROR HY000: Unable to connect to foreign data source: localhost
+INSERT INTO t (SELECT 1 FROM t);
+ERROR HY000: Unable to connect to foreign data source: localhost
+LOCK TABLES t WRITE CONCURRENT;
+DELETE FROM t;
+ERROR HY000: Unable to connect to foreign data source: localhost
+UNLOCK TABLES;
+DROP TABLE t;
+for master_1
+for child2
+for child3
+#
+# end of test mdev_28683
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_28739.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_28739.result
new file mode 100644
index 00000000..ee497bb3
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_28739.result
@@ -0,0 +1,34 @@
+#
+# MDEV-28739 Trying to lock uninitialized mutex or hang upon shutdown after using Spider with query_cache
+#
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+connection child2_1;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+CREATE TABLE tbl_a (id INT);
+connection master_1;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+set global query_cache_type= on;
+set spider_same_server_link = on;
+CREATE TABLE tbl_a (
+id INT
+) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a", srv "s_2_1"';
+SELECT * FROM tbl_a;
+id
+# restart
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+connection child2_1;
+DROP DATABASE IF EXISTS auto_test_remote;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_28739_simple.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_28739_simple.result
new file mode 100644
index 00000000..1c337c3d
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_28739_simple.result
@@ -0,0 +1,21 @@
+#
+# MDEV-28739 Trying to lock uninitialized mutex or hang upon shutdown after using Spider with query_cache
+#
+for master_1
+for child2
+for child3
+set global query_cache_type= on;
+set spider_same_server_link=1;
+CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t2 (c int);
+create table t1 (c int) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"';
+SELECT * FROM t1;
+c
+# restart
+drop table t1, t2;
+drop server srv;
+for master_1
+for child2
+for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result
index fae3cc6b..7e4fd3cd 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result
@@ -4,6 +4,7 @@
for master_1
for child2
for child3
+set spider_same_server_link=1;
CREATE SERVER srv FOREIGN DATA WRAPPER mysql
OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
# testing monitoring_*
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result
index d664b090..e92fb199 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result
@@ -4,8 +4,7 @@
for master_1
for child2
for child3
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
+set spider_same_server_link=1;
CREATE SERVER s FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2);
@@ -17,7 +16,6 @@ a
2
DROP TABLE t2, t1_SPIDER, t1;
drop server s;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
for master_1
for child2
for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29002.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29002.result
new file mode 100644
index 00000000..894f51c5
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29002.result
@@ -0,0 +1,34 @@
+for master_1
+for child2
+for child3
+SET spider_same_server_link= on;
+CREATE SERVER s FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+CREATE TABLE t (a INT);
+CREATE TABLE t1_spider (a INT) ENGINE=SPIDER COMMENT = "wrapper 'mysql', srv 's', table 't'";
+CREATE TABLE t2_spider (a INT) ENGINE=SPIDER COMMENT = "wrapper 'mysql', srv 's', table 't'";
+SELECT * FROM t1_spider, t2_spider;
+a a
+SELECT table_name, index_name, cardinality FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name IN ('t1_spider','t2_spider');
+table_name index_name cardinality
+RENAME TABLE t1_spider TO t3_spider;
+SELECT * FROM t3_spider;
+a
+DROP TABLE t3_spider, t2_spider, t;
+drop server s;
+CREATE TABLE t1 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"';
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"';
+CREATE TABLE t3 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"';
+SHOW TABLE STATUS;
+Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
+t1 SPIDER 10 NULL 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL Unable to connect to foreign data source: srv 0
+t2 SPIDER 10 NULL 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL Unable to connect to foreign data source: srv 0
+t3 SPIDER 10 NULL 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL Unable to connect to foreign data source: srv 0
+Warnings:
+Warning 1429 Unable to connect to foreign data source: srv
+Warning 1429 Unable to connect to foreign data source: srv
+Warning 1429 Unable to connect to foreign data source: srv
+drop table t1, t2, t3;
+for master_1
+for child2
+for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result
index 96d8a729..f58ab605 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result
@@ -4,8 +4,7 @@
for master_1
for child2
for child3
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
+set spider_same_server_link=1;
CREATE SERVER s FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t1 (a INT);
CREATE TABLE t2 (b INT);
@@ -17,7 +16,6 @@ SELECT t1_spider.* FROM t1_spider LEFT JOIN t2_spider LEFT JOIN t3_spider ON b =
a
DROP TABLE t1_spider, t2_spider, t3_spider, t1, t2, t3;
drop server s;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
for master_1
for child2
for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29421.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29421.result
new file mode 100644
index 00000000..bcbf050d
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29421.result
@@ -0,0 +1,19 @@
+for master_1
+for child2
+for child3
+set @old_table_open_cache=@@global.table_open_cache;
+set global table_open_cache=10;
+CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+CREATE TABLE t (c INT) ENGINE=InnoDB;
+CREATE TABLE t_s (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv", TABLE "t"';
+CREATE TABLE t1 (a INT) ENGINE=Spider;
+SELECT * FROM t1;
+ERROR HY000: Unable to connect to foreign data source: localhost
+SELECT * FROM information_schema.tables;
+DROP TABLE t, t_s, t1;
+drop server srv;
+set global table_open_cache=@old_table_open_cache;
+for master_1
+for child2
+for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29456.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29456.result
new file mode 100644
index 00000000..365c3d63
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29456.result
@@ -0,0 +1,42 @@
+#
+# MDEV-29456 Spider hangs in 'Waiting for table metadata lock' state on CREATE TABLE after LOCK TABLES
+#
+for master_1
+for child2
+for child3
+set spider_same_server_link=1;
+CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t1 (c int);
+create table t2 (c int) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+CREATE TABLE t3 (c INT KEY) ENGINE=Spider;
+LOCK TABLE t2 WRITE;
+LOCK TABLE t3 WRITE;
+ERROR HY000: Unable to connect to foreign data source: localhost
+UNLOCK TABLES;
+drop table t1, t2, t3;
+CREATE TABLE t (c INT) ENGINE=InnoDB;
+CREATE TABLE t1 (c INT) ENGINE=Spider;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+LOCK TABLES t2 WRITE;
+LOCK TABLES t1 READ;
+ERROR HY000: Unable to connect to foreign data source: localhost
+CREATE TABLE t (c INT) ENGINE=Spider;
+ERROR 42S01: Table 't' already exists
+drop table t, t1, t2;
+CREATE TABLE t (c INT) ENGINE=InnoDB;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+CREATE TABLE t3 (c INT) ENGINE=InnoDB;
+LOCK TABLES t2 WRITE;
+LOCK TABLES mysql.proc WRITE,mysql.user WRITE;
+ERROR HY000: You can't combine write-locking of system tables with other tables or lock types
+INSERT INTO t3 SELECT * FROM t;
+drop table t, t2, t3;
+drop server srv;
+for master_1
+for child2
+for child3
+#
+# end of test mdev_29456
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result
index 54c5e9a6..7749898e 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result
@@ -4,6 +4,7 @@
for master_1
for child2
for child3
+set spider_same_server_link=1;
CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t (a INT);
INSERT INTO t VALUES (23),(48);
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29667.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29667.result
new file mode 100644
index 00000000..f2e90760
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29667.result
@@ -0,0 +1,40 @@
+#
+# MDEV-29667 Server hangs on DROP DATABASE after failing LOCK TABLES on Spider table
+#
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+connection child2_1;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+CREATE TABLE tbl_a (
+a INT
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+connection master_1;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+CREATE TABLE tbl_a (
+a INT
+) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a", srv "s_2_1"';
+CREATE TABLE tbl_b (
+a INT
+) ENGINE=Spider DEFAULT CHARSET=utf8;
+LOCK TABLES tbl_a WRITE;
+LOCK TABLES tbl_b READ, tbl_a READ;
+ERROR HY000: Unable to connect to foreign data source: localhost
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+connection child2_1;
+DROP DATABASE IF EXISTS auto_test_remote;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+#
+# end of test mdev_29667
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29963.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29963.result
new file mode 100644
index 00000000..60451596
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29963.result
@@ -0,0 +1,44 @@
+#
+# MDEV-29963 SIGSEGV in spider_db_mbase::append_lock_tables on LOCK TABLES
+#
+for master_1
+for child2
+for child3
+set spider_same_server_link=1;
+CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+CREATE TABLE t (a INT) ENGINE=Spider;
+CREATE TABLE t2 (b INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+LOCK TABLES t AS a READ,t2 AS b LOW_PRIORITY WRITE,t2 AS c WRITE;
+ERROR HY000: Unable to connect to foreign data source: localhost
+DROP TABLE t2;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+LOCK TABLES t2 WRITE;
+ERROR HY000: Unable to connect to foreign data source: localhost
+DROP TABLE t2,t;
+CREATE TABLE t (a INT);
+CREATE TABLE t1 (a INT) ENGINE=Spider;
+CREATE TABLE t2 (b INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+LOCK TABLES t1 READ, t2 WRITE;
+ERROR HY000: Unable to connect to foreign data source: localhost
+DROP TABLE t2;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+LOCK TABLES t2 WRITE;
+UNLOCK TABLES;
+DROP TABLE t, t1, t2;
+CREATE TABLE t1 (c INT) ENGINE=Spider;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT="WRAPPER 'mysql',srv 'srv',TABLE 't1'";
+LOCK TABLES t1 WRITE,t2 WRITE;
+ERROR HY000: Unable to connect to foreign data source: localhost
+TRUNCATE t2;
+ERROR HY000: Unable to connect to foreign data source: localhost
+LOCK TABLES t2 AS o WRITE;
+ERROR HY000: Unable to connect to foreign data source: localhost
+drop table t1, t2;
+drop server srv;
+for master_1
+for child2
+for child3
+#
+# end of test mdev_29963
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_30014.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_30014.result
new file mode 100644
index 00000000..e971f323
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_30014.result
@@ -0,0 +1,37 @@
+#
+# MDEV-30014 heap-use-after-free in ha_spider::lock_tables(), highly sporadic SIGSEGV in intern_close_table
+#
+for master_1
+for child2
+for child3
+set spider_same_server_link=1;
+CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t1 (c int);
+create table t2 (c int) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+CREATE TABLE t3 (c INT KEY) ENGINE=Spider;
+LOCK TABLE t2 WRITE,t3 WRITE;
+ERROR HY000: Unable to connect to foreign data source: localhost
+CREATE TABLE t4 (c INT) ENGINE=Spider;
+FLUSH NO_WRITE_TO_BINLOG TABLES t4 WITH READ LOCK;
+Warnings:
+Error 1429 Unable to connect to foreign data source: localhost
+Error 1429 Unable to connect to foreign data source: localhost
+UNLOCK TABLES;
+drop table t1, t2, t3, t4;
+create table t1 (c int);
+create table t2 (c int) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+CREATE TABLE t3 (c INT KEY) ENGINE=Spider;
+LOCK TABLE t2 WRITE, t3 WRITE;
+ERROR HY000: Unable to connect to foreign data source: localhost
+UNLOCK TABLES;
+drop table t1, t2, t3;
+drop server srv;
+for master_1
+for child2
+for child3
+#
+# end of test mdev_30014
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_30170.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_30170.result
new file mode 100644
index 00000000..2183447b
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_30170.result
@@ -0,0 +1,7 @@
+install soname 'ha_spider';
+DROP TABLE non_existing_table;
+ERROR 42S02: Unknown table 'test.non_existing_table'
+create or replace table non_existing_table (c int) engine=Spider;
+drop table non_existing_table;
+Warnings:
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result
index 13297e10..cefa5248 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result
@@ -4,8 +4,7 @@
for master_1
for child2
for child3
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
+set spider_same_server_link=1;
CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2);
@@ -16,7 +15,6 @@ a
2
DROP TABLE t1, t2;
DROP SERVER srv;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
for master_1
for child2
for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result
index 62b06336..f156cf38 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result
@@ -4,6 +4,7 @@
for master_1
for child2
for child3
+set spider_same_server_link=1;
CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t (c BLOB) ENGINE=InnoDB;
CREATE TABLE ts (c BLOB) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result
index c1aa7a1f..26877967 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result
@@ -5,6 +5,7 @@ for master_1
for child2
for child3
SET @old_spider_read_only_mode = @@session.spider_read_only_mode;
+set spider_same_server_link=1;
CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
set session spider_read_only_mode = default;
create table t2 (c int);
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result
index 28cb546e..5197abd3 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result
@@ -4,22 +4,17 @@
for master_1
for child2
for child3
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
+set spider_same_server_link=1;
CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t1 ( a bigint(20) NOT NULL, b bigint(20) DEFAULT 0, PRIMARY KEY (a));
CREATE TABLE t2 ( a bigint(20) NOT NULL, b bigint(20) DEFAULT 0, PRIMARY KEY (a)) ENGINE=SPIDER COMMENT='srv "srv", WRAPPER "mysql", TABLE "t1"';
-SET SESSION optimizer_switch='semijoin=off';
-SELECT * FROM t2
-WHERE A BETWEEN 0 AND 10 AND B IN(SELECT B FROM t2 WHERE A BETWEEN 11 AND 20);
+SELECT * FROM t2 WHERE b IN (SELECT b FROM t2 WHERE a > 10);
a b
-SET SESSION optimizer_switch='semijoin=on';
SELECT * FROM t2
WHERE A BETWEEN 0 AND 10 AND B IN(SELECT B FROM t2 WHERE A BETWEEN 11 AND 20);
a b
drop table t1, t2;
drop server srv;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
for master_1
for child2
for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result
index 04d7e884..cbc91432 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result
@@ -1,6 +1,7 @@
for master_1
for child2
for child3
+set spider_same_server_link=1;
CREATE SERVER srv FOREIGN DATA WRAPPER mysql
OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
set session spider_delete_all_rows_type=0;
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_32753.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_32753.result
new file mode 100644
index 00000000..4260d80f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_32753.result
@@ -0,0 +1,10 @@
+#
+# MDEV-32753 Spider engine does not load in ORACLE mode
+#
+select * from mysql.plugin;
+name dl
+create table t (c int) Engine=SPIDER;
+drop table t;
+#
+# end of test mdev_32753
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start.result
new file mode 100644
index 00000000..4e046d16
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start.result
@@ -0,0 +1,14 @@
+#
+# MDEV-32753 Spider engine does not load in ORACLE mode
+#
+install soname 'ha_spider';
+select * from mysql.plugin;
+name dl
+SPIDER ha_spider.so
+SPIDER_ALLOC_MEM ha_spider.so
+SPIDER_WRAPPER_PROTOCOLS ha_spider.so
+create table t (c int) Engine=SPIDER;
+drop table t;
+#
+# end of test mdev_32753_after_start
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start_session.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start_session.result
new file mode 100644
index 00000000..b9d02563
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start_session.result
@@ -0,0 +1,17 @@
+#
+# MDEV-32753 Spider engine does not load in ORACLE mode
+#
+set @old_sql_mode=@@sql_mode;
+SET @@sql_mode = CONCAT(@@sql_mode, ',ORACLE');
+install soname 'ha_spider';
+select * from mysql.plugin;
+name dl
+SPIDER ha_spider.so
+SPIDER_ALLOC_MEM ha_spider.so
+SPIDER_WRAPPER_PROTOCOLS ha_spider.so
+create table t (c int) Engine=SPIDER;
+drop table t;
+set sql_mode=@old_sql_mode;
+#
+# end of test mdev_32753_after_start
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_32986.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_32986.result
new file mode 100644
index 00000000..c3bdef98
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_32986.result
@@ -0,0 +1,24 @@
+#
+# MDEV-32907
+#
+for master_1
+for child2
+for child3
+set spider_same_server_link=1;
+CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t2 (c varchar(16));
+create table t1 (c varchar(16)) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"';
+insert into t1 values ('TestSpiderRegex');
+select c from t1 where c regexp '(Test|Spider|Regex)';
+c
+TestSpiderRegex
+drop table t1, t2;
+drop server srv;
+for master_1
+for child2
+for child3
+#
+# end of test mdev_32907
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33008.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33008.result
new file mode 100644
index 00000000..3bcb4bb0
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33008.result
@@ -0,0 +1,25 @@
+for master_1
+for child2
+for child3
+set spider_same_server_link=on;
+CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t2 (
+`id` int(11) NOT NULL AUTO_INCREMENT,
+`code` varchar(10) DEFAULT NULL,
+PRIMARY KEY (`id`)
+);
+create table t1 ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"';
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `code` varchar(10) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=SPIDER DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'
+drop table t1, t2;
+drop server srv;
+for master_1
+for child2
+for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33191.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33191.result
new file mode 100644
index 00000000..75ca6c2f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33191.result
@@ -0,0 +1,14 @@
+INSTALL SONAME 'ha_spider';
+set spider_same_server_link=on;
+CREATE TABLE t2(c INT);
+CREATE TABLE t1(c INT) ENGINE=Spider COMMENT='socket "$SOCKET", user "root", table "t2 t3"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+ALTER TABLE t1 ENGINE=Spider;
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+TRUNCATE TABLE t1;
+ERROR 42S02: Table 'test.t3' doesn't exist
+drop table t1, t2;
+Warnings:
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
diff --git a/storage/spider/mysql-test/spider/bugfix/r/perfschema.result b/storage/spider/mysql-test/spider/bugfix/r/perfschema.result
new file mode 100644
index 00000000..9ce2e38f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/perfschema.result
@@ -0,0 +1,11 @@
+#
+# MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled
+#
+connect foo,localhost,root;
+select variable_name, variable_value from performance_schema.status_by_thread
+where variable_name like '%spider_direct_aggregate%';
+variable_name variable_value
+Spider_direct_aggregate 0
+Spider_direct_aggregate 0
+disconnect foo;
+connection default;
diff --git a/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result b/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result
index 196e48d5..0118f575 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result
@@ -4,6 +4,9 @@ for child3
MDEV-6268 SPIDER table with no COMMENT clause causes queries to wait forever
+set spider_same_server_link=1;
+set @old_spider_same_server_link=@@global.spider_same_server_link;
+set global spider_same_server_link=1;
CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
create table t2 (c int);
create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_self_reference_multi",TABLE "t2"';
@@ -17,6 +20,7 @@ select * from t2;
ERROR HY000: An infinite loop is detected when opening table test.t0
drop table t0, t1, t2;
drop server srv_self_reference_multi;
+set global spider_same_server_link=@old_spider_same_server_link;
for master_1
for child2
for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/signal_ddl_fail.result b/storage/spider/mysql-test/spider/bugfix/r/signal_ddl_fail.result
new file mode 100644
index 00000000..c86e600b
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/signal_ddl_fail.result
@@ -0,0 +1,8 @@
+#
+# MDEV-32559 Move alter table statements in spider init queries to be executed in the signal_ddl_recovery_done callback
+#
+select * from mysql.plugin;
+name dl
+#
+# end of test signal_ddl_fail
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/spider_join_with_non_spider.result b/storage/spider/mysql-test/spider/bugfix/r/spider_join_with_non_spider.result
new file mode 100644
index 00000000..420ca657
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/spider_join_with_non_spider.result
@@ -0,0 +1,24 @@
+#
+# Test joining a spider table with a non-spider table
+#
+for master_1
+for child2
+for child3
+set spider_same_server_link=1;
+CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t1 (c int);
+create table t2 (d int);
+insert into t2 values (1), (2);
+create table t3 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+insert into t3 values (2), (3);
+select c from t3 join t2 on c = d;
+c
+2
+drop table t1, t2, t3;
+drop server srv;
+for master_1
+for child2
+for child3
+#
+# end of test spider_join_with_non_spider
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/r/spider_table_sts.result b/storage/spider/mysql-test/spider/bugfix/r/spider_table_sts.result
deleted file mode 100644
index f915cc95..00000000
--- a/storage/spider/mysql-test/spider/bugfix/r/spider_table_sts.result
+++ /dev/null
@@ -1,38 +0,0 @@
-for master_1
-for child2
-for child3
-connection master_1;
-alter table mysql.spider_table_sts drop column checksum;
-insert into mysql.spider_table_sts values ('auto_test_local', 'tbl_a', 0, 0, 0, 0, 0, '2019-01-01 00:00:00', '2019-01-01 00:00:00', '2019-01-01 00:00:00');
-
-this test is for MDEV-19842
-
-drop and create databases
-connection master_1;
-CREATE DATABASE auto_test_local;
-USE auto_test_local;
-
-create table
-connection master_1;
-CREATE TABLE tbl_a (
-pkey int NOT NULL,
-PRIMARY KEY (pkey)
-) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
-
-select test 1
-connection master_1;
-SELECT pkey FROM tbl_a;
-ERROR HY000: System table spider_table_sts is different version
-
-deinit
-connection master_1;
-DROP DATABASE IF EXISTS auto_test_local;
-ERROR HY000: System table spider_table_sts is different version
-connection master_1;
-alter table mysql.spider_table_sts add column checksum bigint unsigned default null after update_time;
-DROP DATABASE IF EXISTS auto_test_local;
-for master_1
-for child2
-for child3
-
-end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/r/subquery.result b/storage/spider/mysql-test/spider/bugfix/r/subquery.result
new file mode 100644
index 00000000..280f5715
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/subquery.result
@@ -0,0 +1,25 @@
+#
+# Test spider select with subqueries
+#
+for master_1
+for child2
+for child3
+set spider_same_server_link=1;
+CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t1 (c1 int);
+create table t2 (c2 int);
+insert into t1 values (1), (2);
+insert into t2 values (0), (1), (2);
+create table t1s (c1 int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+create table t2s (c2 int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"';
+select c1 from t1s, (select c2 from t2s where c2 > 0) t where c1 + 1 = c2;
+c1
+1
+drop table t1, t2, t1s, t2s;
+drop server srv;
+for master_1
+for child2
+for child3
+#
+# end of test subquery
+#
diff --git a/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.cnf b/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.cnf
index b0853e32..05dfd8a0 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.cnf
+++ b/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.cnf
@@ -1,2 +1,3 @@
!include include/default_mysqld.cnf
!include ../my_1_1.cnf
+!include ../my_2_1.cnf
diff --git a/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.test b/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.test
new file mode 100644
index 00000000..f60abc30
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.test
@@ -0,0 +1,46 @@
+--echo #
+--echo # MDEV-26247 Spider: Valid LEFT JOIN results in ERROR 1064
+--echo #
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+--connection child2_1
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+eval CREATE TABLE t1 (a int) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+eval CREATE TABLE t2 (a int) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+eval CREATE TABLE t3 (a int) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (1), (2);
+INSERT INTO t3 VALUES (1), (2), (3);
+
+--connection master_1
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+
+eval CREATE TABLE t1 (a int) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='srv "s_2_1", table "t1"';
+eval CREATE TABLE t2 (a int) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='srv "s_2_1", table "t2"';
+eval CREATE TABLE t3 (a int) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='srv "s_2_1", table "t3"';
+
+select * from t3 left join t1 on t3.a = t1.a left join t2 on t3.a = t2.a;
+select * from t1 left join t2 on t1.a = t2.a right join t3 on t3.a = t1.a;
+select * from t3 left join (t1 left join t2 on t1.a = t2.a) on t3.a = t1.a;
+
+drop table t1, t2, t3;
+
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+--connection child2_1
+DROP DATABASE IF EXISTS auto_test_remote;
+
+--disable_query_log
+--disable_result_log
+--source ../t/test_deinit.inc
+--enable_query_log
+--enable_result_log
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test
index f9e157d3..dcf1438f 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test
@@ -14,6 +14,10 @@
--let $srv=srv_mdev_26151
set @old_spider_bgs_mode= @@spider_bgs_mode;
set session spider_bgs_mode=1;
+set spider_same_server_link=1;
+set @old_spider_same_server_link=@@global.spider_same_server_link;
+set global spider_same_server_link=1;
+
evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
# casual_read != 0 && casual_read != 1
@@ -42,6 +46,7 @@ drop table td, ts;
eval drop server $srv;
set session spider_bgs_mode=@old_spider_bgs_mode;
+set global spider_same_server_link=@old_spider_same_server_link;
--disable_query_log
--disable_result_log
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test
index 8d27c6e0..80328e05 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test
@@ -7,6 +7,7 @@
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
+
--connection child2_1
CREATE DATABASE auto_test_remote;
USE auto_test_remote;
@@ -33,10 +34,6 @@ INSERT INTO t2 VALUES (1, 11), (2, 22), (3, 33);
INSERT INTO t3 VALUES (1, 111), (2, 222), (3, 333);
--connection master_1
-#FIXME: this is a workaround.
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
-
CREATE DATABASE auto_test_local;
USE auto_test_local;
@@ -71,7 +68,6 @@ SELECT a22 FROM t1 RIGHT JOIN t2 ON a21 = a11 WHERE a11 IN (1,2);
--connection master_1
DROP DATABASE IF EXISTS auto_test_local;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
--connection child2_1
DROP DATABASE IF EXISTS auto_test_remote;
@@ -80,6 +76,3 @@ DROP DATABASE IF EXISTS auto_test_remote;
--source ../t/test_deinit.inc
--enable_query_log
--enable_result_log
---echo #
---echo # end of test mdev_26247
---echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test
index bf6cb255..add5f621 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test
@@ -2,10 +2,7 @@
--echo # MDEV-26541 Undefined symbol: _ZTI12ha_partition when attempting to use ha_spider.so in UBSAN builds
--echo #
-if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%UBSAN%"`)
-{
---skip test needs to be run with UBSAN
-}
+# this test should be checked with ubsan
# init spider
@@ -20,4 +17,5 @@ while (!$PLUGIN_EXIST)
`SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`;
}
+--disable_query_log
--source ../../include/clean_up_spider.inc
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27575.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_27575.test
new file mode 100644
index 00000000..79a08489
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27575.test
@@ -0,0 +1,23 @@
+--echo #
+--echo # MDEV-27575 Spider: UBSAN member access within null pointer of type 'struct st_plugin_int and SIGSEGV in intern_plugin_lock on SHUTDOWN when setting Spider as default storage engine (temporary or global)
+--echo #
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+SET GLOBAL default_tmp_storage_engine=spider;
+--source include/restart_mysqld.inc
+
+SET GLOBAL default_storage_engine=Spider;
+--source include/restart_mysqld.inc
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--echo #
+--echo # end of test mdev_27575
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_28683.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_28683.test
new file mode 100644
index 00000000..0508a999
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_28683.test
@@ -0,0 +1,29 @@
+--echo #
+--echo # MDEV-28683 Spider: SIGSEGV in spider_db_direct_delete, SIGSEGV in spider_db_connect, ASAN: heap-use-after-free in spider_db_direct_delete
+--echo #
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+CREATE TABLE t (c INT) ENGINE=Spider;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+SELECT * FROM t;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+INSERT INTO t (SELECT 1 FROM t);
+LOCK TABLES t WRITE CONCURRENT;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+DELETE FROM t;
+
+UNLOCK TABLES;
+DROP TABLE t;
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--echo #
+--echo # end of test mdev_28683
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.cnf
new file mode 100644
index 00000000..05dfd8a0
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.cnf
@@ -0,0 +1,3 @@
+!include include/default_mysqld.cnf
+!include ../my_1_1.cnf
+!include ../my_2_1.cnf
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.test
new file mode 100644
index 00000000..d4ac8e42
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.test
@@ -0,0 +1,41 @@
+--echo #
+--echo # MDEV-28739 Trying to lock uninitialized mutex or hang upon shutdown after using Spider with query_cache
+--echo #
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+--connection child2_1
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+CREATE TABLE tbl_a (id INT);
+
+--connection master_1
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+
+set global query_cache_type= on;
+set spider_same_server_link = on;
+
+eval CREATE TABLE tbl_a (
+ id INT
+) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a", srv "s_2_1"';
+
+SELECT * FROM tbl_a;
+
+--source include/restart_mysqld.inc
+
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+--connection child2_1
+DROP DATABASE IF EXISTS auto_test_remote;
+
+--disable_query_log
+--disable_result_log
+--source ../t/test_deinit.inc
+--enable_query_log
+--enable_result_log
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_28739_simple.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_28739_simple.test
new file mode 100644
index 00000000..feff85df
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_28739_simple.test
@@ -0,0 +1,31 @@
+--echo #
+--echo # MDEV-28739 Trying to lock uninitialized mutex or hang upon shutdown after using Spider with query_cache
+--echo #
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+# set @@global.debug_dbug="+d,xid_thd_trace,enter,exit,info,error:o,/tmp/trace2.out:i:F:L";
+#set @@global.debug_dbug="d:t:i:o,mysqld.trace";
+
+set global query_cache_type= on;
+set spider_same_server_link=1;
+evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t2 (c int);
+create table t1 (c int) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"';
+SELECT * FROM t1;
+#shutdown;
+--source include/restart_mysqld.inc
+drop table t1, t2;
+drop server srv;
+
+--disable_query_log
+--disable_result_log
+--source ../t/test_deinit.inc
+--enable_query_log
+--enable_result_log
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test
index 4f23168e..a1642f7a 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test
@@ -9,6 +9,7 @@
# This test covers some table params under consideration for inclusion
# in the engine-defined options to be implemented in MDEV-28856.
+set spider_same_server_link=1;
evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql
OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test
index d67011ca..51d4c5c9 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test
@@ -2,19 +2,14 @@
--echo # MDEV-28998 ASAN errors in spider_fields::free_conn_holder or spider_create_group_by_handler
--echo #
-if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%ASAN%"`)
-{
---skip test needs to be run with ASAN
-}
+# this test should be checked with ubsan
--disable_query_log
--disable_result_log
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
-# FIXME: this is a workaround.
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
+set spider_same_server_link=1;
evalp CREATE SERVER s FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t1 (a INT);
@@ -27,7 +22,6 @@ SELECT * FROM t2;
# Cleanup
DROP TABLE t2, t1_SPIDER, t1;
drop server s;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
--disable_query_log
--disable_result_log
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29002.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29002.test
new file mode 100644
index 00000000..51620a5a
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29002.test
@@ -0,0 +1,32 @@
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+SET spider_same_server_link= on;
+evalp CREATE SERVER s FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+
+CREATE TABLE t (a INT);
+CREATE TABLE t1_spider (a INT) ENGINE=SPIDER COMMENT = "wrapper 'mysql', srv 's', table 't'";
+CREATE TABLE t2_spider (a INT) ENGINE=SPIDER COMMENT = "wrapper 'mysql', srv 's', table 't'";
+SELECT * FROM t1_spider, t2_spider;
+SELECT table_name, index_name, cardinality FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name IN ('t1_spider','t2_spider');
+RENAME TABLE t1_spider TO t3_spider;
+SELECT * FROM t3_spider;
+
+DROP TABLE t3_spider, t2_spider, t;
+drop server s;
+
+# case by roel
+CREATE TABLE t1 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"';
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"';
+CREATE TABLE t3 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"';
+SHOW TABLE STATUS;
+drop table t1, t2, t3;
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test
index 0bfcc46f..2e56583d 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test
@@ -6,9 +6,7 @@
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
-#FIXME: this is a workaround.
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
+set spider_same_server_link=1;
evalp CREATE SERVER s FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t1 (a INT);
@@ -24,8 +22,6 @@ SELECT t1_spider.* FROM t1_spider LEFT JOIN t2_spider LEFT JOIN t3_spider ON b =
# Cleanup
DROP TABLE t1_spider, t2_spider, t3_spider, t1, t2, t3;
drop server s;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
-
--disable_query_log
--disable_result_log
--source ../../t/test_deinit.inc
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29421.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29421.test
new file mode 100644
index 00000000..47ad42d3
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29421.test
@@ -0,0 +1,26 @@
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+set @old_table_open_cache=@@global.table_open_cache;
+set global table_open_cache=10;
+evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+CREATE TABLE t (c INT) ENGINE=InnoDB;
+CREATE TABLE t_s (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv", TABLE "t"';
+CREATE TABLE t1 (a INT) ENGINE=Spider;
+--error 1429
+SELECT * FROM t1;
+--disable_result_log
+SELECT * FROM information_schema.tables;
+--enable_result_log
+DROP TABLE t, t_s, t1;
+drop server srv;
+set global table_open_cache=@old_table_open_cache;
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29456.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29456.test
new file mode 100644
index 00000000..89d53227
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29456.test
@@ -0,0 +1,53 @@
+--echo #
+--echo # MDEV-29456 Spider hangs in 'Waiting for table metadata lock' state on CREATE TABLE after LOCK TABLES
+--echo #
+--source include/have_innodb.inc
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+set spider_same_server_link=1;
+evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+
+create table t1 (c int);
+create table t2 (c int) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+CREATE TABLE t3 (c INT KEY) ENGINE=Spider;
+LOCK TABLE t2 WRITE;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+LOCK TABLE t3 WRITE;
+UNLOCK TABLES;
+drop table t1, t2, t3;
+
+CREATE TABLE t (c INT) ENGINE=InnoDB;
+CREATE TABLE t1 (c INT) ENGINE=Spider;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+LOCK TABLES t2 WRITE;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+LOCK TABLES t1 READ;
+--error ER_TABLE_EXISTS_ERROR
+CREATE TABLE t (c INT) ENGINE=Spider;
+drop table t, t1, t2;
+
+# MDEV-30049
+CREATE TABLE t (c INT) ENGINE=InnoDB;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+CREATE TABLE t3 (c INT) ENGINE=InnoDB;
+LOCK TABLES t2 WRITE;
+--error 1428
+LOCK TABLES mysql.proc WRITE,mysql.user WRITE; # ERROR 1428 (HY000): You can't combine write-locking of system tables with other tables or lock types
+INSERT INTO t3 SELECT * FROM t;
+drop table t, t2, t3;
+
+drop server srv;
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--echo #
+--echo # end of test mdev_29456
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test
index 88591f80..bacf5073 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test
@@ -8,6 +8,7 @@
--enable_result_log
--enable_query_log
+set spider_same_server_link=1;
--let $srv=srv_mdev_29502
evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.cnf
new file mode 100644
index 00000000..05dfd8a0
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.cnf
@@ -0,0 +1,3 @@
+!include include/default_mysqld.cnf
+!include ../my_1_1.cnf
+!include ../my_2_1.cnf
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.test
new file mode 100644
index 00000000..c96eb60e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.test
@@ -0,0 +1,44 @@
+--echo #
+--echo # MDEV-29667 Server hangs on DROP DATABASE after failing LOCK TABLES on Spider table
+--echo #
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+--connection child2_1
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+eval CREATE TABLE tbl_a (
+ a INT
+) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+
+--connection master_1
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+eval CREATE TABLE tbl_a (
+ a INT
+) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a", srv "s_2_1"';
+eval CREATE TABLE tbl_b (
+ a INT
+) $MASTER_1_ENGINE $MASTER_1_CHARSET;
+
+LOCK TABLES tbl_a WRITE;
+--error 1429
+LOCK TABLES tbl_b READ, tbl_a READ;
+
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+
+--connection child2_1
+DROP DATABASE IF EXISTS auto_test_remote;
+
+--disable_query_log
+--disable_result_log
+--source ../t/test_deinit.inc
+--enable_query_log
+--enable_result_log
+--echo #
+--echo # end of test mdev_29667
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29963.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29963.test
new file mode 100644
index 00000000..93b38c79
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29963.test
@@ -0,0 +1,56 @@
+--echo #
+--echo # MDEV-29963 SIGSEGV in spider_db_mbase::append_lock_tables on LOCK TABLES
+--echo #
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+set spider_same_server_link=1;
+evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+
+CREATE TABLE t (a INT) ENGINE=Spider;
+CREATE TABLE t2 (b INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+LOCK TABLES t AS a READ,t2 AS b LOW_PRIORITY WRITE,t2 AS c WRITE;
+DROP TABLE t2;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+LOCK TABLES t2 WRITE;
+DROP TABLE t2,t;
+
+# A less complex scenario
+CREATE TABLE t (a INT);
+CREATE TABLE t1 (a INT) ENGINE=Spider;
+CREATE TABLE t2 (b INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+LOCK TABLES t1 READ, t2 WRITE;
+DROP TABLE t2;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
+LOCK TABLES t2 WRITE;
+UNLOCK TABLES;
+DROP TABLE t, t1, t2;
+
+# MDEV-31357
+CREATE TABLE t1 (c INT) ENGINE=Spider;
+CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT="WRAPPER 'mysql',srv 'srv',TABLE 't1'";
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+LOCK TABLES t1 WRITE,t2 WRITE;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+TRUNCATE t2;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+LOCK TABLES t2 AS o WRITE;
+drop table t1, t2;
+
+drop server srv;
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--echo #
+--echo # end of test mdev_29963
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30014.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30014.test
new file mode 100644
index 00000000..9c59adc8
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30014.test
@@ -0,0 +1,46 @@
+--echo #
+--echo # MDEV-30014 heap-use-after-free in ha_spider::lock_tables(), highly sporadic SIGSEGV in intern_close_table
+--echo #
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+set spider_same_server_link=1;
+evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+
+create table t1 (c int);
+create table t2 (c int) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+CREATE TABLE t3 (c INT KEY) ENGINE=Spider;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+LOCK TABLE t2 WRITE,t3 WRITE;
+CREATE TABLE t4 (c INT) ENGINE=Spider;
+FLUSH NO_WRITE_TO_BINLOG TABLES t4 WITH READ LOCK;
+UNLOCK TABLES;
+
+drop table t1, t2, t3, t4;
+
+# This is a test case in MDEV-29456 but it is more like the above
+# case.
+create table t1 (c int);
+create table t2 (c int) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+CREATE TABLE t3 (c INT KEY) ENGINE=Spider;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+LOCK TABLE t2 WRITE, t3 WRITE;
+UNLOCK TABLES;
+drop table t1, t2, t3;
+
+drop server srv;
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--echo #
+--echo # end of test mdev_30014
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30170.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30170.test
new file mode 100644
index 00000000..69026843
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30170.test
@@ -0,0 +1,8 @@
+install soname 'ha_spider';
+--error ER_BAD_TABLE_ERROR
+DROP TABLE non_existing_table;
+# Test that create or replace a non existing spider table work
+create or replace table non_existing_table (c int) engine=Spider;
+drop table non_existing_table;
+--disable_query_log
+--source ../../include/clean_up_spider.inc
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test
index 6d14f155..36e06f3f 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test
@@ -6,9 +6,7 @@
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
-
+set spider_same_server_link=1;
evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t1 (a INT);
@@ -21,7 +19,6 @@ SELECT a FROM t2 WHERE a IN ( SELECT a FROM t2 );
DROP TABLE t1, t2;
DROP SERVER srv;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
--disable_query_log
--disable_result_log
--source ../../t/test_deinit.inc
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test
index cc24ce82..ca3f000c 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test
@@ -2,21 +2,18 @@
--echo # MDEV-30981 Spider UBSAN: null pointer passed as argument 2, which is declared to never be null in spider_create_trx_alter_table on ALTER
--echo #
-if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%UBSAN%"`)
-{
---skip test needs to be run with UBSAN
-}
-
+# this test should be checked with ubsan
+
--disable_query_log
--disable_result_log
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
-
+
CREATE TABLE t (c INT) ENGINE=Spider PARTITION BY LIST (c) (PARTITION p VALUES IN (1,2));
ALTER TABLE t ENGINE=InnoDB;
drop table t;
-
+
--disable_query_log
--disable_result_log
--source ../t/test_deinit.inc
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test
index e628c3b9..a3698c97 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test
@@ -9,6 +9,7 @@
--enable_result_log
--enable_query_log
+set spider_same_server_link=1;
evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t (c BLOB) ENGINE=InnoDB;
CREATE TABLE ts (c BLOB) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"';
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test
index 64cbf415..a5942fad 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test
@@ -10,6 +10,7 @@
--let $srv=srv_mdev_31524
SET @old_spider_read_only_mode = @@session.spider_read_only_mode;
+set spider_same_server_link=1;
evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
# when the user does not set var nor the table option, the default
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test
index 48bfa740..4dfe3b57 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test
@@ -6,25 +6,17 @@
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
-set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler;
-set spider_disable_group_by_handler=1;
-
+set spider_same_server_link=1;
evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
CREATE TABLE t1 ( a bigint(20) NOT NULL, b bigint(20) DEFAULT 0, PRIMARY KEY (a));
CREATE TABLE t2 ( a bigint(20) NOT NULL, b bigint(20) DEFAULT 0, PRIMARY KEY (a)) ENGINE=SPIDER COMMENT='srv "srv", WRAPPER "mysql", TABLE "t1"';
-SET SESSION optimizer_switch='semijoin=off';
-SELECT * FROM t2
-WHERE A BETWEEN 0 AND 10 AND B IN(SELECT B FROM t2 WHERE A BETWEEN 11 AND 20);
-
-SET SESSION optimizer_switch='semijoin=on';
-
+SELECT * FROM t2 WHERE b IN (SELECT b FROM t2 WHERE a > 10);
SELECT * FROM t2
WHERE A BETWEEN 0 AND 10 AND B IN(SELECT B FROM t2 WHERE A BETWEEN 11 AND 20);
drop table t1, t2;
drop server srv;
-set spider_disable_group_by_handler=@old_spider_disable_group_by_handler;
--disable_query_log
--disable_result_log
--source ../../t/test_deinit.inc
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test
index 3e823790..93b004a0 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test
@@ -4,6 +4,7 @@
--enable_result_log
--enable_query_log
+set spider_same_server_link=1;
evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql
OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.opt b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.opt
new file mode 100644
index 00000000..c3151b0e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.opt
@@ -0,0 +1,2 @@
+--sql-mode=oracle
+--plugin-load-add=ha_spider
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.test
new file mode 100644
index 00000000..2be7289f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.test
@@ -0,0 +1,12 @@
+--echo #
+--echo # MDEV-32753 Spider engine does not load in ORACLE mode
+--echo #
+
+# This test tests spider init during server startup under global
+# ORACLE mode
+select * from mysql.plugin;
+create table t (c int) Engine=SPIDER;
+drop table t;
+--echo #
+--echo # end of test mdev_32753
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.opt b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.opt
new file mode 100644
index 00000000..a918abb9
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.opt
@@ -0,0 +1 @@
+--sql-mode=oracle
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.test
new file mode 100644
index 00000000..de2ab789
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.test
@@ -0,0 +1,20 @@
+--echo #
+--echo # MDEV-32753 Spider engine does not load in ORACLE mode
+--echo #
+
+# This test tests spider init after startup under global ORACLE mode
+install soname 'ha_spider';
+--replace_regex /\.dll/.so/
+select * from mysql.plugin;
+create table t (c int) Engine=SPIDER;
+drop table t;
+
+--disable_query_log
+--disable_result_log
+--source ../../include/clean_up_spider.inc
+--enable_result_log
+--enable_query_log
+
+--echo #
+--echo # end of test mdev_32753_after_start
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start_session.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start_session.test
new file mode 100644
index 00000000..bf7bdb4f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start_session.test
@@ -0,0 +1,22 @@
+--echo #
+--echo # MDEV-32753 Spider engine does not load in ORACLE mode
+--echo #
+
+# This test tests spider init after startup under session ORACLE mode
+set @old_sql_mode=@@sql_mode;
+SET @@sql_mode = CONCAT(@@sql_mode, ',ORACLE');
+install soname 'ha_spider';
+select * from mysql.plugin;
+create table t (c int) Engine=SPIDER;
+drop table t;
+set sql_mode=@old_sql_mode;
+
+--disable_query_log
+--disable_result_log
+--source ../../include/clean_up_spider.inc
+--enable_result_log
+--enable_query_log
+
+--echo #
+--echo # end of test mdev_32753_after_start
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_32986.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_32986.test
new file mode 100644
index 00000000..14438745
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_32986.test
@@ -0,0 +1,29 @@
+--echo #
+--echo # MDEV-32907
+--echo #
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+set spider_same_server_link=1;
+evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+
+create table t2 (c varchar(16));
+create table t1 (c varchar(16)) ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"';
+
+insert into t1 values ('TestSpiderRegex');
+select c from t1 where c regexp '(Test|Spider|Regex)';
+drop table t1, t2;
+drop server srv;
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--echo #
+--echo # end of test mdev_32907
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33008.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33008.test
new file mode 100644
index 00000000..48d9a4f0
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33008.test
@@ -0,0 +1,24 @@
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+set spider_same_server_link=on;
+evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql
+OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t2 (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `code` varchar(10) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+);
+create table t1 ENGINE=Spider
+COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"';
+show create table t1;
+drop table t1, t2;
+
+drop server srv;
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33191.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33191.test
new file mode 100644
index 00000000..90709127
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33191.test
@@ -0,0 +1,11 @@
+INSTALL SONAME 'ha_spider';
+set spider_same_server_link=on;
+CREATE TABLE t2(c INT);
+--let $SOCKET=`SELECT @@global.socket`
+evalp CREATE TABLE t1(c INT) ENGINE=Spider COMMENT='socket "$SOCKET", user "root", table "t2 t3"';
+ALTER TABLE t1 ENGINE=Spider;
+--error ER_NO_SUCH_TABLE
+TRUNCATE TABLE t1;
+drop table t1, t2;
+--disable_query_log
+--source ../../include/clean_up_spider.inc
diff --git a/storage/spider/mysql-test/spider/bugfix/t/perfschema.opt b/storage/spider/mysql-test/spider/bugfix/t/perfschema.opt
new file mode 100644
index 00000000..d2ed32dd
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/perfschema.opt
@@ -0,0 +1 @@
+--loose-performance-schema
diff --git a/storage/spider/mysql-test/spider/bugfix/t/perfschema.test b/storage/spider/mysql-test/spider/bugfix/t/perfschema.test
new file mode 100644
index 00000000..9346d2b5
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/perfschema.test
@@ -0,0 +1,16 @@
+source include/have_perfschema.inc;
+disable_query_log;
+source ../../include/init_spider.inc;
+enable_query_log;
+
+--echo #
+--echo # MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled
+--echo #
+connect foo,localhost,root;
+select variable_name, variable_value from performance_schema.status_by_thread
+where variable_name like '%spider_direct_aggregate%';
+disconnect foo;
+connection default;
+
+disable_query_log;
+source ../../include/deinit_spider.inc;
diff --git a/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test b/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test
index 2ac927d9..4263560b 100644
--- a/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test
+++ b/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test
@@ -8,6 +8,9 @@
--echo MDEV-6268 SPIDER table with no COMMENT clause causes queries to wait forever
--echo
+set spider_same_server_link=1;
+set @old_spider_same_server_link=@@global.spider_same_server_link;
+set global spider_same_server_link=1;
--let $srv=srv_self_reference_multi
evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
create table t2 (c int);
@@ -22,6 +25,7 @@ select * from t1;
select * from t2;
drop table t0, t1, t2;
eval drop server $srv;
+set global spider_same_server_link=@old_spider_same_server_link;
--disable_query_log
--disable_result_log
diff --git a/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.opt b/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.opt
new file mode 100644
index 00000000..d883df7b
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.opt
@@ -0,0 +1,2 @@
+--plugin-load-add=ha_spider
+--debug-dbug=d,fail_spider_ddl_recovery_done
diff --git a/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.test b/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.test
new file mode 100644
index 00000000..f13eae3a
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.test
@@ -0,0 +1,10 @@
+--source include/have_debug.inc
+--echo #
+--echo # MDEV-32559 Move alter table statements in spider init queries to be executed in the signal_ddl_recovery_done callback
+--echo #
+# This test tests that failure in ddl_recovery callback causes the
+# plugin to be deinitialized.
+select * from mysql.plugin;
+--echo #
+--echo # end of test signal_ddl_fail
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/spider_join_with_non_spider.test b/storage/spider/mysql-test/spider/bugfix/t/spider_join_with_non_spider.test
new file mode 100644
index 00000000..294b469a
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/spider_join_with_non_spider.test
@@ -0,0 +1,29 @@
+--echo #
+--echo # Test joining a spider table with a non-spider table
+--echo #
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+set spider_same_server_link=1;
+evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t1 (c int);
+create table t2 (d int);
+insert into t2 values (1), (2);
+create table t3 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+insert into t3 values (2), (3);
+select c from t3 join t2 on c = d;
+drop table t1, t2, t3;
+drop server srv;
+
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--echo #
+--echo # end of test spider_join_with_non_spider
+--echo #
diff --git a/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.test b/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.test
deleted file mode 100644
index 72130175..00000000
--- a/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.test
+++ /dev/null
@@ -1,46 +0,0 @@
---source ../include/spider_table_sts_init.inc
---echo
---echo this test is for MDEV-19842
---echo
---echo drop and create databases
-
---connection master_1
---disable_warnings
-CREATE DATABASE auto_test_local;
-USE auto_test_local;
---enable_warnings
-
---echo
---echo create table
-
---connection master_1
---disable_query_log
-echo CREATE TABLE tbl_a (
- pkey int NOT NULL,
- PRIMARY KEY (pkey)
-) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
-eval CREATE TABLE tbl_a (
- pkey int NOT NULL,
- PRIMARY KEY (pkey)
-) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
---enable_query_log
-
---echo
---echo select test 1
-
---connection master_1
---error 12609
-SELECT pkey FROM tbl_a;
-
---echo
---echo deinit
---disable_warnings
-
---connection master_1
---error 12609
-DROP DATABASE IF EXISTS auto_test_local;
-
---enable_warnings
---source ../include/spider_table_sts_deinit.inc
---echo
---echo end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/t/subquery.test b/storage/spider/mysql-test/spider/bugfix/t/subquery.test
new file mode 100644
index 00000000..70238a52
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/subquery.test
@@ -0,0 +1,31 @@
+--echo #
+--echo # Test spider select with subqueries
+--echo #
+--disable_query_log
+--disable_result_log
+--source ../../t/test_init.inc
+--enable_result_log
+--enable_query_log
+set spider_same_server_link=1;
+evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
+create table t1 (c1 int);
+create table t2 (c2 int);
+
+insert into t1 values (1), (2);
+insert into t2 values (0), (1), (2);
+
+create table t1s (c1 int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"';
+create table t2s (c2 int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"';
+
+select c1 from t1s, (select c2 from t2s where c2 > 0) t where c1 + 1 = c2;
+
+drop table t1, t2, t1s, t2s;
+drop server srv;
+--disable_query_log
+--disable_result_log
+--source ../../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--echo #
+--echo # end of test subquery
+--echo #
diff --git a/storage/spider/mysql-test/spider/include/clean_up_spider.inc b/storage/spider/mysql-test/spider/include/clean_up_spider.inc
index 1f0659dc..1c977bfb 100644
--- a/storage/spider/mysql-test/spider/include/clean_up_spider.inc
+++ b/storage/spider/mysql-test/spider/include/clean_up_spider.inc
@@ -3,7 +3,8 @@ DROP FUNCTION spider_copy_tables;
DROP FUNCTION spider_ping_table;
DROP FUNCTION spider_bg_direct_sql;
DROP FUNCTION spider_direct_sql;
-UNINSTALL SONAME IF EXISTS "ha_spider";
+--replace_regex /\.dll/.so/
+UNINSTALL SONAME IF EXISTS 'ha_spider';
DROP TABLE IF EXISTS mysql.spider_xa;
DROP TABLE IF EXISTS mysql.spider_xa_member;
DROP TABLE IF EXISTS mysql.spider_xa_failed_log;
diff --git a/storage/spider/mysql-test/spider/include/init_spider.inc b/storage/spider/mysql-test/spider/include/init_spider.inc
index ccf9e305..6014b1d7 100644
--- a/storage/spider/mysql-test/spider/include/init_spider.inc
+++ b/storage/spider/mysql-test/spider/include/init_spider.inc
@@ -158,27 +158,6 @@ let $PLUGIN_VERSION=
`SELECT SUBSTRING_INDEX(plugin_version, '.', 1)
FROM information_schema.plugins
WHERE plugin_name = 'SPIDER'`;
-if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`)
-{
- let $HAS_REWRITE=
- `SELECT IF (STRCMP('$SERVER_NAME', 'MariaDB') = 0,
- IF ($SERVER_MAJOR_VERSION = 10,
- IF ($SERVER_MINOR_VERSION < 4, 0, 1),
- IF ($SERVER_MAJOR_VERSION < 10, 0, 1)),
- 0)`;
- let $HAS_REWRITE= 0;
- if ($HAS_REWRITE)
- {
- let $PLUGIN_NAME= spider_flush_rewrite_cache;
- let $PLUGIN_EXIST=
- `SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`;
- while (!$PLUGIN_EXIST)
- {
- let $PLUGIN_EXIST=
- `SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`;
- }
- }
-}
let $PLUGIN_NAME= spider_flush_table_mon_cache;
let $PLUGIN_EXIST=
`SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`;
diff --git a/storage/spider/mysql-test/spider/r/direct_join.result b/storage/spider/mysql-test/spider/r/direct_join.result
index 398985ac..96f18a54 100644
--- a/storage/spider/mysql-test/spider/r/direct_join.result
+++ b/storage/spider/mysql-test/spider/r/direct_join.result
@@ -167,7 +167,7 @@ connection child2_1;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %';
argument
select `id`,`hr_status`,`region_code`,`region` from `auto_test_remote`.`tbl_person` where `id` = '24FC3F0A5119432BAE13DD65AABAA39C' and `region` = 510411
-select count(0) `count(0)` from `auto_test_remote`.`tbl_ncd_cm_person` t0 where ((t0.`person_id` = '24FC3F0A5119432BAE13DD65AABAA39C') and (t0.`diseaseKind_id` = '52A0328740914BCE86ED10A4D2521816'))
+select count(0) `count(0)` from (select 1) t0 join `auto_test_remote`.`tbl_ncd_cm_person` t1 where ((t1.`person_id` = '24FC3F0A5119432BAE13DD65AABAA39C') and (t1.`diseaseKind_id` = '52A0328740914BCE86ED10A4D2521816'))
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
SELECT * FROM tbl_person;
id hr_status region_code region
diff --git a/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result
index a6bd3a7c..96b00c61 100644
--- a/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result
+++ b/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result
@@ -87,7 +87,7 @@ NULL NULL NULL 3
connection child2_1;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %';
argument
-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_auto_inc` t2 join `auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r` t0) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) where 1 order by t3.`a` desc
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r_auto_inc` t2) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) where 1 order by t3.`a` desc
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
diff --git a/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result
index 8fab6d24..7ba1084a 100644
--- a/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result
+++ b/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result
@@ -86,7 +86,7 @@ NULL c 2000-01-03 00:00:00 3
connection child2_1;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %';
argument
-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r` t0) on ((t1.`c` = t2.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1) on ((t1.`c` = t2.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
diff --git a/storage/spider/mysql-test/spider/r/direct_right_join.result b/storage/spider/mysql-test/spider/r/direct_right_join.result
index d7780b94..ee0940a4 100644
--- a/storage/spider/mysql-test/spider/r/direct_right_join.result
+++ b/storage/spider/mysql-test/spider/r/direct_right_join.result
@@ -79,7 +79,7 @@ a b c
connection child2_1;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %';
argument
-select t0.`b` `b`,t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r_int` t2 left join (`auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1) on ((t0.`a` = t2.`a`) and (t1.`a` = t2.`a`)) where 1 order by t0.`b` desc
+select t0.`b` `b`,t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r_int` t2 left join (`auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r` t0) on ((t0.`a` = t2.`a`) and (t1.`a` = t2.`a`)) where 1 order by t0.`b` desc
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
diff --git a/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result
index 5101ea50..fefb67fa 100644
--- a/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result
+++ b/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result
@@ -87,7 +87,7 @@ NULL c 2000-01-03 00:00:00 3
connection child2_1;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %';
argument
-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join `auto_test_remote`.`ta_r_auto_inc` t2 on (t2.`b` = t3.`b`) left join `auto_test_remote`.`ta_r_3` t1 on (t1.`c` = t2.`c`) left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null)) where 1 order by t3.`a` desc
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null))) on (t1.`c` = t2.`c`)) on (t2.`b` = t3.`b`) where 1 order by t3.`a` desc
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
diff --git a/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result
index c90fe3ab..64c3b57c 100644
--- a/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result
+++ b/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result
@@ -86,7 +86,7 @@ NULL c 2000-01-03 00:00:00 3
connection child2_1;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %';
argument
-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join `auto_test_remote`.`ta_r_3` t1 on (t1.`c` = t2.`c`) left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null)) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null))) on (t1.`c` = t2.`c`) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
diff --git a/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result
index f6c808be..68d11934 100644
--- a/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result
+++ b/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result
@@ -87,7 +87,7 @@ NULL c 2000-01-03 00:00:00 3
connection child2_1;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %';
argument
-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_auto_inc` t2 join `auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null))) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`)) where 1 order by t3.`a` desc
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null)) join `auto_test_remote`.`ta_r_auto_inc` t2) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`)) where 1 order by t3.`a` desc
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
diff --git a/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result b/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result
index 3eed8df2..850546fa 100644
--- a/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result
+++ b/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result
@@ -86,8 +86,10 @@ SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argum
argument
select `value` from `auto_test_remote2`.`tbl_a` where `value` = 5
select `value2` from `auto_test_remote2`.`tbl_b` where `value2` = 5
+select sum('5') `sum(a.value)`,count('5') `count(b.value2)` from (select 1) t0 join (select 1) t1
select `value` from `auto_test_remote2`.`tbl_a` where `value` = 5
select `value2` from `auto_test_remote2`.`tbl_b` where `value2` = 5
+select sum('5') `sum(a.value)`,count('5') `count(b.value2)` from (select 1) t0 join (select 1) t1
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'
SELECT value FROM tbl_a ORDER BY value;
value
diff --git a/storage/spider/mysql-test/spider/r/variable_deprecation.result b/storage/spider/mysql-test/spider/r/variable_deprecation.result
index cea36ff2..be964ce4 100644
--- a/storage/spider/mysql-test/spider/r/variable_deprecation.result
+++ b/storage/spider/mysql-test/spider/r/variable_deprecation.result
@@ -75,8 +75,6 @@ Warning 1287 '@@spider_load_crd_at_startup' is deprecated and will be removed in
SHOW VARIABLES LIKE "spider_load_crd_at_startup";
Variable_name Value
spider_load_crd_at_startup 0
-DROP TABLE tbl_a;
-DROP TABLE tbl_b;
# MDEV-28008 Deprecate spider_crd_mode and spider_sts_mode
SET spider_crd_mode = 1;
Warnings:
diff --git a/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result b/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result
index a5553304..72645f4f 100644
--- a/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result
+++ b/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result
@@ -46,7 +46,7 @@ connection child2_1;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_a`%' ;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_b`%';
argument
-select t0.`val` `val`,t0.`akey` `akey` from `auto_test_remote`.`tbl_a` t0 where (t0.`akey` = '4')
+select t0.`val` `val`,t0.`akey` `akey` from `auto_test_remote`.`tbl_a` t0 join (select 1) t1 where (t0.`akey` = '4')
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_a`%' ;
SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_b`%'
argument
diff --git a/storage/spider/mysql-test/spider/t/variable_deprecation.test b/storage/spider/mysql-test/spider/t/variable_deprecation.test
index 3ed8dcf5..6159b25b 100644
--- a/storage/spider/mysql-test/spider/t/variable_deprecation.test
+++ b/storage/spider/mysql-test/spider/t/variable_deprecation.test
@@ -47,9 +47,6 @@ SHOW VARIABLES LIKE "spider_load_sts_at_startup";
SET GLOBAL spider_load_crd_at_startup = 0;
SHOW VARIABLES LIKE "spider_load_crd_at_startup";
-DROP TABLE tbl_a;
-DROP TABLE tbl_b;
-
--echo # MDEV-28008 Deprecate spider_crd_mode and spider_sts_mode
SET spider_crd_mode = 1;
SHOW VARIABLES LIKE "spider_crd_mode";
diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc
index 443912b5..92775896 100644
--- a/storage/spider/spd_conn.cc
+++ b/storage/spider/spd_conn.cc
@@ -411,7 +411,7 @@ SPIDER_CONN *spider_create_conn(
tables_on_different_db_are_joinable = TRUE;
}
if (!(conn = (SPIDER_CONN *)
- spider_bulk_malloc(spider_current_trx, 18, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_CONN_1, MYF(MY_WME | MY_ZEROFILL),
&conn, (uint) (sizeof(*conn)),
&tmp_name, (uint) (share->conn_keys_lengths[link_idx] + 1),
&tmp_host, (uint) (share->tgt_hosts_lengths[link_idx] + 1),
@@ -450,7 +450,7 @@ SPIDER_CONN *spider_create_conn(
goto error_alloc_conn;
}
- conn->default_database.init_calc_mem(75);
+ conn->default_database.init_calc_mem(SPD_MID_CREATE_CONN_2);
conn->conn_key_length = share->conn_keys_lengths[link_idx];
conn->conn_key = tmp_name;
memcpy(conn->conn_key, share->conn_keys[link_idx],
@@ -1204,13 +1204,7 @@ int spider_conn_queue_and_merge_loop_check(
lcptr->flag = SPIDER_LOP_CHK_MERAGED;
lcptr->next = NULL;
if (!conn->loop_check_meraged_first)
- {
conn->loop_check_meraged_first = lcptr;
- conn->loop_check_meraged_last = lcptr;
- } else {
- conn->loop_check_meraged_last->next = lcptr;
- conn->loop_check_meraged_last = lcptr;
- }
}
DBUG_RETURN(0);
@@ -1303,7 +1297,7 @@ int spider_conn_queue_loop_check(
loop_check_buf[lex_str.length] = '\0';
DBUG_PRINT("info", ("spider param name=%s", lex_str.str));
loop_check = get_variable(&thd->user_vars, &lex_str, FALSE);
- if (!loop_check || loop_check->type != STRING_RESULT)
+ if (!loop_check || loop_check->type_handler()->result_type() != STRING_RESULT)
{
DBUG_PRINT("info", ("spider client is not Spider"));
lex_str.str = "";
@@ -1865,7 +1859,7 @@ int spider_create_conn_thread(
error_num = HA_ERR_OUT_OF_MEM;
goto error_job_stack_init;
}
- spider_alloc_calc_mem_init(conn->bg_job_stack, 163);
+ spider_alloc_calc_mem_init(conn->bg_job_stack, SPD_MID_CREATE_CONN_THREAD_1);
spider_alloc_calc_mem(spider_current_trx,
conn->bg_job_stack,
conn->bg_job_stack.max_element *
@@ -3476,7 +3470,7 @@ int spider_create_mon_threads(
char *buf = (char *) my_alloca(share->table_name_length + SPIDER_SQL_INT_LEN + 1);
spider_string conv_name_str(buf, share->table_name_length +
SPIDER_SQL_INT_LEN + 1, system_charset_info);
- conv_name_str.init_calc_mem(105);
+ conv_name_str.init_calc_mem(SPD_MID_CREATE_MON_THREADS_1);
conv_name_str.length(0);
conv_name_str.q_append(share->table_name, share->table_name_length);
for (roop_count = 0; roop_count < (int) share->all_link_count;
@@ -3509,7 +3503,7 @@ int spider_create_mon_threads(
}
}
if (!(share->bg_mon_thds = (THD **)
- spider_bulk_malloc(spider_current_trx, 23, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_MON_THREADS_2, MYF(MY_WME | MY_ZEROFILL),
&share->bg_mon_thds,
(uint) (sizeof(THD *) * share->all_link_count),
&share->bg_mon_threads,
diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc
index ab1f8d35..70ca17f8 100644
--- a/storage/spider/spd_copy_tables.cc
+++ b/storage/spider/spd_copy_tables.cc
@@ -274,7 +274,7 @@ int spider_udf_get_copy_tgt_tables(
}
do {
if (!(table_conn = (SPIDER_COPY_TABLE_CONN *)
- spider_bulk_malloc(spider_current_trx, 25, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_GET_COPY_TGT_TABLES_1, MYF(MY_WME | MY_ZEROFILL),
&table_conn, (uint) (sizeof(SPIDER_COPY_TABLE_CONN)),
&tmp_share, (uint) (sizeof(SPIDER_SHARE)),
&tmp_connect_info,
@@ -590,7 +590,7 @@ int spider_udf_copy_tables_create_table_list(
}
if (!(copy_tables->link_idxs[0] = (int *)
- spider_bulk_malloc(spider_current_trx, 26, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_COPY_TABLES_CREATE_TABLE_LIST_1, MYF(MY_WME | MY_ZEROFILL),
&copy_tables->link_idxs[0],
(uint) (sizeof(int) * copy_tables->link_idx_count[0]),
&copy_tables->link_idxs[1],
@@ -772,7 +772,7 @@ long long spider_copy_tables_body(
}
if (!(copy_tables = (SPIDER_COPY_TABLES *)
- spider_bulk_malloc(spider_current_trx, 27, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_COPY_TABLES_BODY_1, MYF(MY_WME | MY_ZEROFILL),
&copy_tables, (uint) (sizeof(SPIDER_COPY_TABLES)),
NullS))
) {
@@ -984,7 +984,7 @@ long long spider_copy_tables_body(
{
tmp_spider = &spider[roop_count];
if (!(tmp_spider->dbton_handler = (spider_db_handler **)
- spider_bulk_alloc_mem(spider_current_trx, 205,
+ spider_bulk_alloc_mem(spider_current_trx, SPD_MID_COPY_TABLES_BODY_2,
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
&tmp_spider->dbton_handler,
sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE,
@@ -1005,7 +1005,7 @@ long long spider_copy_tables_body(
}
*/
tmp_spider->conns = &table_conn->conn;
- tmp_sql[roop_count].init_calc_mem(122);
+ tmp_sql[roop_count].init_calc_mem(SPD_MID_COPY_TABLES_BODY_3);
tmp_sql[roop_count].set_charset(copy_tables->access_charset);
tmp_spider->result_list.sqls = &tmp_sql[roop_count];
tmp_spider->need_mons = &table_conn->need_mon;
@@ -1030,7 +1030,7 @@ long long spider_copy_tables_body(
{
tmp_spider = &spider[roop_count];
if (!(tmp_spider->dbton_handler = (spider_db_handler **)
- spider_bulk_alloc_mem(spider_current_trx, 206,
+ spider_bulk_alloc_mem(spider_current_trx, SPD_MID_COPY_TABLES_BODY_4,
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
&tmp_spider->dbton_handler,
sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE,
@@ -1051,7 +1051,7 @@ long long spider_copy_tables_body(
}
*/
tmp_spider->conns = &table_conn->conn;
- tmp_sql[roop_count].init_calc_mem(201);
+ tmp_sql[roop_count].init_calc_mem(SPD_MID_COPY_TABLES_BODY_5);
tmp_sql[roop_count].set_charset(copy_tables->access_charset);
tmp_spider->result_list.sqls = &tmp_sql[roop_count];
tmp_spider->need_mons = &table_conn->need_mon;
diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc
index a541a5db..16d5b836 100644
--- a/storage/spider/spd_db_conn.cc
+++ b/storage/spider/spd_db_conn.cc
@@ -250,7 +250,7 @@ int spider_db_conn_queue_action(
spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info);
DBUG_ENTER("spider_db_conn_queue_action");
DBUG_PRINT("info", ("spider conn=%p", conn));
- sql_str.init_calc_mem(106);
+ sql_str.init_calc_mem(SPD_MID_DB_CONN_QUEUE_ACTION_1);
sql_str.length(0);
if (conn->queued_connect)
{
@@ -651,7 +651,7 @@ int spider_db_query(
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
spider_string tmp_query_str(sizeof(char) * (length + 1));
- tmp_query_str.init_calc_mem(107);
+ tmp_query_str.init_calc_mem(SPD_MID_DB_QUERY_1);
char *tmp_query = (char *) tmp_query_str.c_ptr_safe();
memcpy(tmp_query, query, length);
tmp_query[length] = '\0';
@@ -2174,7 +2174,7 @@ int spider_db_fetch_for_item_sum_func(
{
if (!spider->direct_aggregate_item_first)
{
- if (!spider_bulk_malloc(spider_current_trx, 240, MYF(MY_WME),
+ if (!spider_bulk_malloc(spider_current_trx, SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_1, MYF(MY_WME),
&spider->direct_aggregate_item_first,
(uint) (sizeof(SPIDER_ITEM_HLD)),
NullS)
@@ -2191,7 +2191,7 @@ int spider_db_fetch_for_item_sum_func(
} else {
if (!spider->direct_aggregate_item_current->next)
{
- if (!spider_bulk_malloc(spider_current_trx, 241, MYF(MY_WME),
+ if (!spider_bulk_malloc(spider_current_trx, SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_2, MYF(MY_WME),
&spider->direct_aggregate_item_current->next,
(uint) (sizeof(SPIDER_ITEM_HLD)), NullS)
) {
@@ -2235,7 +2235,7 @@ int spider_db_fetch_for_item_sum_func(
} else {
char buf[MAX_FIELD_WIDTH];
spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
- tmp_str.init_calc_mem(242);
+ tmp_str.init_calc_mem(SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_3);
tmp_str.length(0);
if ((error_num = row->append_to_str(&tmp_str)))
DBUG_RETURN(error_num);
@@ -3089,7 +3089,7 @@ int spider_db_store_result(
if (!result_list->first)
{
if (!(result_list->first = (SPIDER_RESULT *)
- spider_malloc(spider_current_trx, 4, sizeof(*result_list->first),
+ spider_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_1, sizeof(*result_list->first),
MYF(MY_WME | MY_ZEROFILL)))
) {
if (!conn->mta_conn_mutex_unlock_later)
@@ -3119,7 +3119,7 @@ int spider_db_store_result(
if (result_list->bgs_current == result_list->last)
{
if (!(result_list->last = (SPIDER_RESULT *)
- spider_malloc(spider_current_trx, 5, sizeof(*result_list->last),
+ spider_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_2, sizeof(*result_list->last),
MYF(MY_WME | MY_ZEROFILL)))
) {
if (!conn->mta_conn_mutex_unlock_later)
@@ -3162,7 +3162,7 @@ int spider_db_store_result(
if (result_list->current == result_list->last)
{
if (!(result_list->last = (SPIDER_RESULT *)
- spider_malloc(spider_current_trx, 6, sizeof(*result_list->last),
+ spider_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_3, sizeof(*result_list->last),
MYF(MY_WME | MY_ZEROFILL)))
) {
if (!conn->mta_conn_mutex_unlock_later)
@@ -3373,7 +3373,7 @@ int spider_db_store_result(
}
current->field_count = field_count;
if (!(position = (SPIDER_POSITION *)
- spider_bulk_malloc(spider_current_trx, 7, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_4, MYF(MY_WME | MY_ZEROFILL),
&position, (uint) (sizeof(SPIDER_POSITION) * page_size),
&tmp_row, (uint) (sizeof(SPIDER_DB_ROW) * field_count),
NullS))
@@ -3436,7 +3436,7 @@ int spider_db_store_result(
THD *thd = current_thd;
char buf[MAX_FIELD_WIDTH];
spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin);
- tmp_str.init_calc_mem(120);
+ tmp_str.init_calc_mem(SPD_MID_DB_STORE_RESULT_5);
DBUG_PRINT("info",("spider store result to temporary table"));
DBUG_ASSERT(!current->result_tmp_tbl);
@@ -3797,7 +3797,7 @@ int spider_db_store_result_for_reuse_cursor(
THD *thd = current_thd;
char buf[MAX_FIELD_WIDTH];
spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin);
- tmp_str.init_calc_mem(120);
+ tmp_str.init_calc_mem(SPD_MID_DB_STORE_RESULT_FOR_REUSE_CURSOR_1);
DBUG_PRINT("info",("spider store result to temporary table"));
DBUG_ASSERT(!current->result_tmp_tbl);
@@ -6537,7 +6537,7 @@ int spider_db_delete_all_rows(
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
- uint dbton_id = share->use_sql_dbton_ids[roop_count];
+ uint dbton_id = share->sql_dbton_ids[roop_count];
spider_db_handler *dbton_hdl = spider->dbton_handler[dbton_id];
conn = spider->conns[roop_count];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
@@ -7468,19 +7468,20 @@ int spider_db_open_item_ident(
} else {
if (str)
{
- SPIDER_FIELD_CHAIN *field_chain = fields->get_next_field_chain();
- SPIDER_FIELD_HOLDER *field_holder = field_chain->field_holder;
- spider = field_holder->spider;
+ SPIDER_TABLE_HOLDER *table= fields->find_table(field);
+ /* If table or table->spider is NULL the GBH creation
+ would have been skipped the first pass (see below). */
+ spider = table->spider;
share = spider->share;
if ((error_num = share->dbton_share[dbton_id]->
append_column_name_with_alias(str, field->field_index,
- field_holder->alias->ptr(), field_holder->alias->length())))
+ table->alias->ptr(), table->alias->length())))
DBUG_RETURN(error_num);
- } else {
- if ((error_num = fields->add_field(field)))
- {
- DBUG_RETURN(error_num);
- }
+ } else
+ {
+ SPIDER_TABLE_HOLDER *table= fields->find_table(field);
+ if (!table || !table->spider)
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
}
}
}
@@ -7583,21 +7584,20 @@ int spider_db_open_item_field(
} else {
if (str)
{
- SPIDER_FIELD_CHAIN *field_chain = fields->get_next_field_chain();
- SPIDER_FIELD_HOLDER *field_holder = field_chain->field_holder;
- spider = field_holder->spider;
+ SPIDER_TABLE_HOLDER *table= fields->find_table(field);
+ /* If table or table->spider is NULL the GBH creation
+ would have been skipped the first pass (see below). */
+ spider = table->spider;
share = spider->share;
- field = spider->field_exchange(field);
- DBUG_ASSERT(field);
if ((error_num = share->dbton_share[dbton_id]->
append_column_name_with_alias(str, field->field_index,
- field_holder->alias->ptr(), field_holder->alias->length())))
+ table->alias->ptr(), table->alias->length())))
DBUG_RETURN(error_num);
- } else {
- if ((error_num = fields->add_field(field)))
- {
- DBUG_RETURN(error_num);
- }
+ } else
+ {
+ SPIDER_TABLE_HOLDER *table= fields->find_table(field);
+ if (!table || !table->spider)
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
}
DBUG_RETURN(0);
}
@@ -7740,7 +7740,7 @@ int spider_db_open_item_string(
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(126);
+ tmp_str.init_calc_mem(SPD_MID_DB_OPEN_ITEM_STRING_1);
if (!(tmp_str2 = item->val_str(tmp_str.get_str())))
{
@@ -7859,7 +7859,7 @@ 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);
+ tmp_str.init_calc_mem(SPD_MID_DB_OPEN_ITEM_INT_1);
if (!(tmp_str2 = item->val_str(tmp_str.get_str())))
{
@@ -8909,8 +8909,8 @@ int spider_db_udf_ping_table(
system_charset_info);
spider_string where_str(where_buf, sizeof(where_buf),
system_charset_info);
- sql_str.init_calc_mem(128);
- where_str.init_calc_mem(129);
+ sql_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_1);
+ where_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_2);
sql_str.length(0);
where_str.length(0);
if (
@@ -9020,8 +9020,8 @@ int spider_db_udf_ping_table_append_mon_next(
spider_string where_clause_str(where_clause ? where_clause : "",
where_clause_length + 1, str->charset());
DBUG_ENTER("spider_db_udf_ping_table_append_mon_next");
- child_table_name_str.init_calc_mem(130);
- where_clause_str.init_calc_mem(131);
+ child_table_name_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_1);
+ where_clause_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_2);
child_table_name_str.length(child_table_name_length);
where_clause_str.length(where_clause_length);
limit_str_length = my_sprintf(limit_str, (limit_str, "%lld", limit));
@@ -9174,7 +9174,7 @@ int spider_db_udf_ping_table_mon_next(
}
spider_string sql_str(sql_buf, sizeof(sql_buf),
thd->variables.character_set_client);
- sql_str.init_calc_mem(132);
+ sql_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_MON_NEXT_1);
sql_str.length(0);
trx.thd = thd;
spider.share = share;
@@ -9328,7 +9328,7 @@ int spider_db_udf_copy_tables(
KEY *key_info = &table->key_info[table->s->primary_key];
DBUG_ENTER("spider_db_udf_copy_tables");
if (!(last_row_pos = (ulong *)
- spider_bulk_malloc(spider_current_trx, 30, MYF(MY_WME),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_DB_UDF_COPY_TABLES_1, MYF(MY_WME),
&last_row_pos, (uint) (sizeof(ulong) * table->s->fields),
&last_lengths, (uint) (sizeof(ulong) * table->s->fields),
NullS))
diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h
index ef0fb8f2..c2cbe5f2 100644
--- a/storage/spider/spd_db_include.h
+++ b/storage/spider/spd_db_include.h
@@ -542,34 +542,26 @@ typedef struct spider_conn_holder
spider_conn_holder *next;
} SPIDER_CONN_HOLDER;
+/* Record information of a local (spider) table, for use of the spider
+group by handler. */
typedef struct spider_table_holder
{
TABLE *table;
ha_spider *spider;
+ /* alias of the table, in the form of tk, where k is the index of
+ the table from `query->from' indexed by next_local. */
spider_string *alias;
} SPIDER_TABLE_HOLDER;
-typedef struct spider_field_holder
-{
- Field *field;
- ha_spider *spider;
- spider_string *alias;
- spider_field_holder *next;
-} SPIDER_FIELD_HOLDER;
-
-typedef struct spider_field_chain
-{
- spider_field_holder *field_holder;
- spider_field_chain *next;
-} SPIDER_FIELD_CHAIN;
-
+/* For use of the spider group by handler. */
class spider_fields
{
uint dbton_count;
uint current_dbton_num;
uint dbton_ids[SPIDER_DBTON_SIZE];
+ /* Number of tables in `query->from'. */
uint table_count;
- uint current_table_num;
+ /* All tables in `query->from', in the same order by next_local. */
SPIDER_TABLE_HOLDER *table_holder;
SPIDER_LINK_IDX_CHAIN *first_link_idx_chain;
SPIDER_LINK_IDX_CHAIN *last_link_idx_chain;
@@ -578,13 +570,6 @@ class spider_fields
SPIDER_CONN_HOLDER *first_conn_holder;
SPIDER_CONN_HOLDER *last_conn_holder;
SPIDER_CONN_HOLDER *current_conn_holder;
- SPIDER_FIELD_HOLDER *first_field_holder;
- SPIDER_FIELD_HOLDER *last_field_holder;
- SPIDER_FIELD_HOLDER *current_field_holder;
- SPIDER_FIELD_CHAIN *first_field_chain;
- SPIDER_FIELD_CHAIN *last_field_chain;
- SPIDER_FIELD_CHAIN *current_field_chain;
- Field **first_field_ptr;
Field **current_field_ptr;
public:
spider_fields();
@@ -627,8 +612,6 @@ public:
long access_balance
);
SPIDER_CONN_HOLDER *create_conn_holder();
- void set_pos_to_first_conn_holder();
- SPIDER_CONN_HOLDER *get_next_conn_holder();
bool has_conn_holder();
void clear_conn_holder_from_conn();
bool check_conn_same_conn(
@@ -642,24 +625,14 @@ public:
void free_conn_holder(
SPIDER_CONN_HOLDER *conn_holder_arg
);
- SPIDER_TABLE_HOLDER *add_table(
- ha_spider *spider_arg
- );
- bool all_query_fields_are_query_table_members();
- int create_table_holder(
+ SPIDER_TABLE_HOLDER *find_table(Field *field);
+ void set_table_holder(
+ SPIDER_TABLE_HOLDER *table_holder_arg,
uint table_count_arg
);
- void set_pos_to_first_table_holder();
- SPIDER_TABLE_HOLDER *get_next_table_holder();
+ SPIDER_TABLE_HOLDER *get_first_table_holder();
SPIDER_TABLE_HOLDER *get_table_holder(TABLE *table);
uint get_table_count();
- int add_field(Field *field_arg);
- SPIDER_FIELD_HOLDER *create_field_holder();
- void set_pos_to_first_field_holder();
- SPIDER_FIELD_HOLDER *get_next_field_holder();
- SPIDER_FIELD_CHAIN *create_field_chain();
- void set_pos_to_first_field_chain();
- SPIDER_FIELD_CHAIN *get_next_field_chain();
void set_field_ptr(Field **field_arg);
Field **get_next_field_ptr();
int ping_table_mon_from_table(
@@ -797,11 +770,6 @@ public:
TABLE_LIST *table_list,
uint table_count
) = 0;
- virtual int reappend_tables(
- spider_fields *fields,
- SPIDER_LINK_IDX_CHAIN *link_idx_chain,
- spider_string *str
- ) = 0;
virtual int append_where(
spider_string *str
) = 0;
@@ -1530,10 +1498,6 @@ public:
spider_fields *fields,
ulong sql_type
) = 0;
- virtual int reappend_tables_part(
- spider_fields *fields,
- ulong sql_type
- ) = 0;
virtual int append_where_part(
ulong sql_type
) = 0;
@@ -1674,6 +1638,12 @@ static const LEX_CSTRING maturity_name[] =
{ STRING_WITH_LEN("Stable") }
};
+/*
+ Type of singletons based on the type of the remote database.
+
+ All such singletons are stored in the array `spider_dbton', see
+ `spider_db_init()'.
+*/
typedef struct st_spider_dbton
{
uint dbton_id;
diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc
index e0dffe57..c2f0c6b8 100644
--- a/storage/spider/spd_db_mysql.cc
+++ b/storage/spider/spd_db_mysql.cc
@@ -451,7 +451,7 @@ int spider_db_mbase_row::append_escaped_to_str(
DBUG_ENTER("spider_db_mbase_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.init_calc_mem(SPD_MID_DB_MBASE_ROW_APPEND_ESCAPED_TO_STR_1);
tmp_str.length(*lengths);
if (str->reserve(*lengths * 2 + 2))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -544,7 +544,7 @@ SPIDER_DB_ROW *spider_db_mbase_row::clone()
row_size = record_size + field_count;
}
if (!spider_bulk_malloc(
- spider_current_trx, 29, MYF(MY_WME),
+ spider_current_trx, SPD_MID_DB_MBASE_ROW_CLONE_1, MYF(MY_WME),
&clone_row->row, (uint) (sizeof(char*) * (field_count + 1)),
&tmp_char, (uint) (row_size),
&clone_row->lengths, (uint) (sizeof(ulong) * field_count),
@@ -774,9 +774,9 @@ SPIDER_DB_ROW *spider_db_mbase_result::fetch_row_from_tmp_table(
uint field_count;
DBUG_ENTER("spider_db_mbase_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_str1.init_calc_mem(SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_1);
+ tmp_str2.init_calc_mem(SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_2);
+ tmp_str3.init_calc_mem(SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_3);
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());
@@ -1529,10 +1529,13 @@ int spider_db_mbase_result::fetch_index_for_discover_table_structure(
}
DBUG_RETURN(0);
}
- if (num_fields() != 13)
+ 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_PRINT("info",("spider num_fields < 13"));
+ my_printf_error(ER_SPIDER_CANT_NUM, ER_SPIDER_CANT_STR1, MYF(0),
+ "fetch index for table structure discovery because of "
+ "wrong number of columns in SHOW INDEX FROM output: ",
+ num_fields());
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
}
bool first = TRUE;
@@ -1826,7 +1829,7 @@ int spider_db_mbase::init()
) {
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
- spider_alloc_calc_mem_init(lock_table_hash, 140);
+ spider_alloc_calc_mem_init(lock_table_hash, SPD_MID_DB_MBASE_INIT_1);
spider_alloc_calc_mem(spider_current_trx,
lock_table_hash,
lock_table_hash.array.max_element *
@@ -1929,7 +1932,7 @@ int spider_db_mbase::connect(
if (!spider_param_same_server_link(thd))
{
- if (!strcmp(tgt_host, my_localhost))
+ if (!strcmp(tgt_host, my_localhost) || !tgt_host || !tgt_host[0])
{
if (!strcmp(tgt_socket, *spd_mysqld_unix_port))
{
@@ -1939,7 +1942,7 @@ int spider_db_mbase::connect(
DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM);
}
} else if (!strcmp(tgt_host, "127.0.0.1") ||
- !strcmp(tgt_host, glob_hostname))
+ !strcmp(tgt_host, glob_hostname) || !tgt_host || !tgt_host[0])
{
if (tgt_port == (long) *spd_mysqld_port)
{
@@ -2066,7 +2069,7 @@ int spider_db_mbase::exec_query(
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);
+ tmp_query_str.init_calc_mem(SPD_MID_DB_MBASE_EXEC_QUERY_1);
if (tmp_query_str.reserve(
length + conn->tgt_wrapper_length +
tgt_len + (SPIDER_SQL_SPACE_LEN * 2)))
@@ -2096,7 +2099,7 @@ int spider_db_mbase::exec_query(
struct tm lt;
struct tm *l_time = localtime_r(&cur_time, &lt);
spider_string tmp_query_str;
- tmp_query_str.init_calc_mem(243);
+ tmp_query_str.init_calc_mem(SPD_MID_DB_MBASE_EXEC_QUERY_2);
uint query_length = thd->query_length();
if ((log_result_error_with_sql & 2) && query_length)
{
@@ -2640,7 +2643,7 @@ int spider_db_mbase::xa_end(
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
DBUG_ENTER("spider_db_mbase::xa_end");
DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(108);
+ sql_str.init_calc_mem(SPD_MID_DB_MBASE_XA_END_1);
sql_str.length(0);
sql_str.q_append(SPIDER_SQL_XA_END_STR, SPIDER_SQL_XA_END_LEN);
@@ -2683,7 +2686,7 @@ int spider_db_mbase::xa_prepare(
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
DBUG_ENTER("spider_db_mbase::xa_prepare");
DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(109);
+ sql_str.init_calc_mem(SPD_MID_DB_MBASE_XA_PREPARE_1);
sql_str.length(0);
sql_str.q_append(SPIDER_SQL_XA_PREPARE_STR, SPIDER_SQL_XA_PREPARE_LEN);
@@ -2726,7 +2729,7 @@ int spider_db_mbase::xa_commit(
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
DBUG_ENTER("spider_db_mbase::xa_commit");
DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(110);
+ sql_str.init_calc_mem(SPD_MID_DB_MBASE_XA_COMMIT_1);
sql_str.length(0);
sql_str.q_append(SPIDER_SQL_XA_COMMIT_STR, SPIDER_SQL_XA_COMMIT_LEN);
@@ -2769,7 +2772,7 @@ int spider_db_mbase::xa_rollback(
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
DBUG_ENTER("spider_db_mbase::xa_rollback");
DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(111);
+ sql_str.init_calc_mem(SPD_MID_DB_MBASE_XA_ROLLBACK_1);
sql_str.length(0);
sql_str.q_append(SPIDER_SQL_XA_ROLLBACK_STR, SPIDER_SQL_XA_ROLLBACK_LEN);
@@ -3106,7 +3109,7 @@ int spider_db_mbase::set_wait_timeout(
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
DBUG_ENTER("spider_db_mbase::set_wait_timeout");
DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(264);
+ sql_str.init_calc_mem(SPD_MID_DB_MBASE_SET_WAIT_TIMEOUT_1);
sql_str.length(0);
timeout_str_length =
my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout));
@@ -3160,7 +3163,7 @@ int spider_db_mbase::set_sql_mode(
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
DBUG_ENTER("spider_db_mbase::set_sql_mode");
DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(265);
+ sql_str.init_calc_mem(SPD_MID_DB_MBASE_SET_SQL_MODE_1);
sql_str.length(0);
if (sql_str.reserve(SPIDER_SQL_SQL_MODE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -3225,7 +3228,7 @@ int spider_db_mbase::set_time_zone(
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
DBUG_ENTER("spider_db_mbase::set_time_zone");
DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(214);
+ sql_str.init_calc_mem(SPD_MID_DB_MBASE_SET_TIME_ZONE_1);
sql_str.length(0);
if (sql_str.reserve(SPIDER_SQL_TIME_ZONE_LEN +
tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
@@ -3278,7 +3281,7 @@ int spider_db_mbase::set_loop_check(
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
DBUG_ENTER("spider_db_mbase::set_loop_check");
DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(270);
+ sql_str.init_calc_mem(SPD_MID_DB_MBASE_SET_LOOP_CHECK_1);
while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element(
&conn->loop_check_queue, 0)))
{
@@ -3960,7 +3963,7 @@ int spider_db_mariadb_util::append_column_value(ha_spider *spider,
THD *thd = field->table->in_use;
Time_zone *saved_time_zone = thd->variables.time_zone;
DBUG_ENTER("spider_db_mariadb_util::append_column_value");
- tmp_str.init_calc_mem(113);
+ tmp_str.init_calc_mem(SPD_MID_DB_MARIADB_UTIL_APPEND_COLUMN_VALUE_1);
thd->variables.time_zone = UTC;
@@ -4036,7 +4039,7 @@ int spider_db_mariadb_util::append_column_value(ha_spider *spider,
DBUG_PRINT("info", ("spider append_escaped"));
char buf2[MAX_FIELD_WIDTH];
spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset());
- tmp_str2.init_calc_mem(114);
+ tmp_str2.init_calc_mem(SPD_MID_DB_MARIADB_UTIL_APPEND_COLUMN_VALUE_2);
tmp_str2.length(0);
if (
tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
@@ -4104,7 +4107,7 @@ int spider_db_mysql_util::append_column_value(
THD *thd = field->table->in_use;
Time_zone *saved_time_zone = thd->variables.time_zone;
DBUG_ENTER("spider_db_mysql_util::append_column_value");
- tmp_str.init_calc_mem(266);
+ tmp_str.init_calc_mem(SPD_MID_DB_MYSQL_UTIL_APPEND_COLUMN_VALUE_1);
thd->variables.time_zone = UTC;
@@ -4255,7 +4258,7 @@ int spider_db_mysql_util::append_column_value(
DBUG_PRINT("info", ("spider append_escaped"));
char buf2[MAX_FIELD_WIDTH];
spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset());
- tmp_str2.init_calc_mem(267);
+ tmp_str2.init_calc_mem(SPD_MID_DB_MYSQL_UTIL_APPEND_COLUMN_VALUE_2);
tmp_str2.length(0);
if (
tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
@@ -5828,12 +5831,17 @@ int spider_db_mbase_util::print_item_func(
item_count -= 2;
break;
}
- } 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 == 6)
+ {
+ if (!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 (!strncasecmp("regexp", func_name, func_name_length))
+ /* Keep the infix expression */
+ break;
} else if (func_name_length == 7)
{
if (!strncasecmp("isfalse", func_name, func_name_length))
@@ -6093,7 +6101,7 @@ int spider_db_mbase_util::print_item_func(
char *tmp_ptr, *tmp_ptr2;
DBUG_ASSERT(tmp_str.length() == 0);
tmp_str.set_charset(str->charset());
- tmp_str.init_calc_mem(123);
+ tmp_str.init_calc_mem(SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_1);
tmp_str.reserve(MAX_FIELD_WIDTH);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
if (!merge_func)
@@ -6218,7 +6226,7 @@ int spider_db_mbase_util::print_item_func(
char *tmp_ptr, *tmp_ptr2;
DBUG_ASSERT(tmp_str.length() == 0);
tmp_str.set_charset(str->charset());
- tmp_str.init_calc_mem(124);
+ tmp_str.init_calc_mem(SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_2);
tmp_str.reserve(MAX_FIELD_WIDTH);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
if (!merge_func)
@@ -6355,7 +6363,7 @@ int spider_db_mbase_util::print_item_func(
char *tmp_ptr, *tmp_ptr2;
DBUG_ASSERT(tmp_str.length() == 0);
tmp_str.set_charset(str->charset());
- tmp_str.init_calc_mem(125);
+ tmp_str.init_calc_mem(SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_3);
tmp_str.reserve(MAX_FIELD_WIDTH);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
if (!merge_func)
@@ -6803,440 +6811,250 @@ int spider_db_mbase_util::append_escaped_util(
DBUG_RETURN(0);
}
-int spider_db_mbase_util::append_table(
- ha_spider *spider,
- spider_fields *fields,
- spider_string *str,
- TABLE_LIST *table_list,
- TABLE_LIST **used_table_list,
- uint *current_pos,
- TABLE_LIST **cond_table_list_ptr,
- bool top_down,
- bool first
-) {
- int error_num;
- bool use_cond_table_list = FALSE;
- spider_mbase_share *db_share;
- spider_mbase_handler *dbton_hdl;
- SPIDER_TABLE_HOLDER *table_holder;
- TABLE_LIST *cond_table_list = *cond_table_list_ptr;
- ha_spider *spd;
- DBUG_ENTER("spider_db_mbase_util::append_table");
- DBUG_PRINT("info",("spider table_list=%p", table_list));
- DBUG_PRINT("info",("spider table_list->outer_join=%u",
- table_list->outer_join));
- DBUG_PRINT("info",("spider table_list->on_expr=%p",
- table_list->on_expr));
- DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
- table_list->join_using_fields));
- DBUG_PRINT("info",("spider table_list->table=%p",
- table_list->table));
- if (!top_down && table_list->embedding)
- {
- if ((error_num = append_embedding_tables(spider, fields, str,
- table_list->embedding, used_table_list, current_pos,
- cond_table_list_ptr)))
+/*
+ Walk a TABLE_LIST, or format it to a string and append it.
+
+ If str is NULL, walk the nested join (if any) to determine whether
+ to create a group by handler. Otherwise, format the TABLE_LIST to a
+ string and append it to str.
+
+ Adapted from TABLE_LIST::print().
+*/
+int spider_db_mbase_util::append_table_list(spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table,
+ table_map *upper_usable_tables,
+ table_map eliminated_tables)
+{
+ DBUG_ENTER("spider_db_mbase_util::append_table_list");
+ /* Eliminated tables were removed from append_join(). */
+ DBUG_ASSERT(!is_eliminated_table(eliminated_tables, table));
+ if (!str) /* First pass (GBH creation) */
+ {
+ DBUG_ASSERT(upper_usable_tables);
+ if (table->nested_join)
+ DBUG_RETURN(append_join(fields, str,
+ &table->nested_join->join_list,
+ upper_usable_tables, eliminated_tables));
+ /* jtbm is a kind of semi join, and TABLE_LIST::print() adds an
+ extra " <materialize> " annotation. */
+ if (table->jtbm_subselect)
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ /* TODO: These conditions are printed in a different way in
+ TABLE_LIST::print(), but they do not seem to occur very often.
+ Let's not worry about them now. */
+ if (table->view_name.str || table->derived || table->table_function)
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ *upper_usable_tables |= table->table->map;
+ DBUG_RETURN(0);
+ }
+ /* Second pass (query execution) */
+ DBUG_ASSERT(!upper_usable_tables);
+ if (table->nested_join)
+ {
+ if (str->append("("))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (int error_num= append_join(
+ fields, str, &table->nested_join->join_list,
+ upper_usable_tables, eliminated_tables))
DBUG_RETURN(error_num);
- } else if (!table_list->table)
+ if (str->append(")"))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+ }
+ /* These have been ruled out during the creation of the group by
+ handler, see above. */
+ DBUG_ASSERT(!table->jtbm_subselect);
+ DBUG_ASSERT(!table->view_name.str);
+ DBUG_ASSERT(!table->derived);
+ DBUG_ASSERT(!table->table_function);
+ /* We have a "normal" table. Print it and append to str. */
+ SPIDER_TABLE_HOLDER *table_holder = fields->get_table_holder(table->table);
+ ha_spider *spd = table_holder->spider;
+ spider_mbase_share *db_share =
+ (spider_mbase_share *) spd->share->dbton_share[dbton_id];
+ spider_mbase_handler *dbton_hdl =
+ (spider_mbase_handler *) spd->dbton_handler[dbton_id];
+ if (table->table->const_table)
{
- if ((error_num = append_tables_top_down(spider, fields, str, table_list,
- used_table_list, current_pos, cond_table_list_ptr)))
+ if (str->append(STRING_WITH_LEN("(select 1)")))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ else
+ if (int error_num= db_share->append_table_name(
+ str, spd->conn_link_idx[dbton_hdl->first_link_idx]))
DBUG_RETURN(error_num);
- } else {
- if (
- table_list->outer_join ||
- table_list->on_expr ||
- table_list->join_using_fields
- ) {
- DBUG_PRINT("info",("spider use table_list"));
- if (table_list->outer_join & JOIN_TYPE_LEFT)
- {
- if (str)
- {
- if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
- }
- } else {
- if (str)
- {
- if (str->reserve(SPIDER_SQL_JOIN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
- }
- }
- } else if (
- cond_table_list &&
- (
- cond_table_list->outer_join ||
- cond_table_list->on_expr ||
- cond_table_list->join_using_fields
- )
- ) {
- DBUG_PRINT("info",("spider use cond_table_list"));
- if (cond_table_list->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT))
- {
- if (str)
- {
- if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
- }
- } else {
- if (str)
- {
- if (str->reserve(SPIDER_SQL_JOIN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
- }
- }
- use_cond_table_list = TRUE;
- } else if (*current_pos > 0 && !first)
- {
- DBUG_PRINT("info",("spider no condition"));
- if (str)
- {
- if (str->reserve(SPIDER_SQL_JOIN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
- }
- }
-
- if (str)
- {
- table_holder = fields->get_table_holder(table_list->table);
- spd = table_holder->spider;
- db_share = (spider_mbase_share *)
- spd->share->dbton_share[dbton_id];
- dbton_hdl = (spider_mbase_handler *)
- spd->dbton_handler[dbton_id];
+ if (str->append(" ") ||
+ str->append(table_holder->alias->ptr(),
+ /* Don't append the trailing dot */
+ table_holder->alias->length() - 1))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+}
- dbton_hdl->table_name_pos = str->length();
+/*
+ Walk an array of TABLE_LIST's, or format it to a string and append it.
- if (str->reserve(
- db_share->db_nm_max_length +
- SPIDER_SQL_DOT_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
- db_share->table_nm_max_length + SPIDER_SQL_SPACE_LEN +
- table_holder->alias->length() - SPIDER_SQL_DOT_LEN
- )) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
+ If str is NULL, walk each TABLE_LIST to determine whether to create
+ a group by handler. Otherwise, format the TABLE_LISTs to a string
+ and append it to str.
- if ((error_num = db_share->append_table_name_with_adjusting(str,
- spd->conn_link_idx[dbton_hdl->first_link_idx])))
- {
- DBUG_RETURN(error_num);
- }
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(table_holder->alias->ptr(),
- table_holder->alias->length() - SPIDER_SQL_DOT_LEN);
- }
- used_table_list[(*current_pos)++] = table_list;
+ Adapted from print_table_array().
+*/
+int spider_db_mbase_util::append_table_array(spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST **table,
+ TABLE_LIST **end,
+ table_map *upper_usable_tables,
+ table_map eliminated_tables)
+{
+ DBUG_ENTER("spider_db_mbase_util::append_table_array");
+ if (str)
+ {
+ DBUG_ASSERT(!upper_usable_tables);
+ if (int error_num= append_table_list(fields, str, *table, NULL,
+ eliminated_tables))
+ DBUG_RETURN(error_num);
- if (str)
+ for (TABLE_LIST **tbl= table + 1; tbl < end; tbl++)
{
- List<String> *join_using_fields = table_list->join_using_fields;
- if (!join_using_fields && cond_table_list)
- {
- join_using_fields = cond_table_list->join_using_fields;
- }
+ TABLE_LIST *curr= *tbl;
- if (join_using_fields)
+ /* JOIN_TYPE_OUTER is just a marker unrelated to real join */
+ if (curr->outer_join & (JOIN_TYPE_LEFT|JOIN_TYPE_RIGHT))
{
- if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
+ /* MySQL converts right to left joins */
+ if (str->append(STRING_WITH_LEN(" left join ")))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
- SPIDER_SQL_OPEN_PAREN_LEN);
- List_iterator_fast<String> it2(*join_using_fields);
- String *ptr;
- while ((ptr = it2++))
- {
- if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(ptr->ptr(), ptr->length());
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- 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);
}
- }
-
- Item *on_expr = table_list->on_expr;
- if (!on_expr && cond_table_list)
- {
- on_expr = cond_table_list->on_expr;
- }
-
- if (on_expr)
- {
- if (str)
+ else if (curr->straight)
{
- if (str->reserve(SPIDER_SQL_ON_LEN))
- {
+ if (str->append(STRING_WITH_LEN(" straight_join ")))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
}
- if ((error_num = spider_db_print_item_type(on_expr, NULL,
- spider, str, NULL, 0, dbton_id, TRUE, fields)))
- {
- DBUG_RETURN(error_num);
- }
- }
+ /* semi join should already have been ruled out during the
+ creation of the group by handler. */
+ else if (curr->sj_inner_tables)
+ DBUG_ASSERT(0);
+ else
+ if (str->append(STRING_WITH_LEN(" join ")))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (use_cond_table_list)
- {
- (*cond_table_list_ptr) = NULL;
- DBUG_PRINT("info",("spider cond_table_list=%p", (*cond_table_list_ptr)));
- }
- }
- DBUG_RETURN(0);
-}
+ if (int error_num= append_table_list(fields, str, curr, NULL,
+ eliminated_tables))
+ DBUG_RETURN(error_num);
-int spider_db_mbase_util::append_tables_top_down(
- ha_spider *spider,
- spider_fields *fields,
- spider_string *str,
- TABLE_LIST *table_list,
- TABLE_LIST **used_table_list,
- uint *current_pos,
- TABLE_LIST **cond_table_list_ptr
-) {
- int error_num;
- uint outer_join_backup;
- TABLE_LIST *cur_table_list, *prev_table_list = NULL, *cond_table_list = NULL;
- bool first = TRUE;
- DBUG_ENTER("spider_db_mbase_util::append_tables_top_down");
- DBUG_PRINT("info",("spider this=%p", this));
- if (
- table_list->outer_join ||
- table_list->on_expr ||
- table_list->join_using_fields
- ) {
- DBUG_ASSERT(!(*cond_table_list_ptr));
- (*cond_table_list_ptr) = table_list;
- DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
- }
- List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
- cur_table_list = it1++;
- if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
- {
- first = FALSE;
- prev_table_list = cur_table_list;
- cur_table_list = it1++;
- } else if (*cond_table_list_ptr)
- {
- first = TRUE;
- cond_table_list = (*cond_table_list_ptr);
- (*cond_table_list_ptr) = NULL;
- if (cond_table_list->outer_join & JOIN_TYPE_LEFT)
- {
- if (str)
+ if (curr->on_expr)
{
- if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
+ if (str->append(STRING_WITH_LEN(" on ")))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- }
- } else {
- if (str)
- {
- if (str->reserve(SPIDER_SQL_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ if (int error_num=
+ spider_db_print_item_type(curr->on_expr, NULL,
+ fields->get_first_table_holder()->spider,
+ str, NULL, 0, dbton_id, TRUE, fields))
+ DBUG_RETURN(error_num);
}
}
}
-
- do {
- if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
+ else /* str == NULL */
+ {
+ table_map usable_tables= 0;
+ if (int error_num= append_table_list(fields, str, *table,
+ &usable_tables, eliminated_tables))
+ DBUG_RETURN(error_num);
+ for (TABLE_LIST **tbl= table + 1; tbl < end; tbl++)
{
- prev_table_list = cur_table_list;
- } else {
- if ((error_num = append_table(spider, fields, str, cur_table_list,
- used_table_list, current_pos, cond_table_list_ptr, TRUE, first)))
+ TABLE_LIST *curr= *tbl;
+ /* semi join is an "internal" join and is unsupported. */
+ if (curr->sj_inner_tables)
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ if (int error_num= append_table_list(fields, str, curr,
+ &usable_tables, eliminated_tables))
DBUG_RETURN(error_num);
- first = FALSE;
- if (prev_table_list)
+ if (curr->on_expr)
{
- outer_join_backup = prev_table_list->outer_join;
- prev_table_list->outer_join = JOIN_TYPE_LEFT;
- if ((error_num = append_table(spider, fields, str, prev_table_list,
- used_table_list, current_pos, cond_table_list_ptr, TRUE, FALSE)))
- {
- prev_table_list->outer_join = outer_join_backup;
+ /* The join refers to fields outside of the current context,
+ and cannot be handled by a group by handler. */
+ if ((curr->on_expr->used_tables() & usable_tables) !=
+ curr->on_expr->used_tables())
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ if (int error_num=
+ spider_db_print_item_type(curr->on_expr, NULL,
+ fields->get_first_table_holder()->spider,
+ str, NULL, 0, dbton_id, TRUE, fields))
DBUG_RETURN(error_num);
- }
- prev_table_list->outer_join = outer_join_backup;
- prev_table_list = NULL;
- }
- }
- } while ((cur_table_list = it1++));
-
- if (cond_table_list)
- {
- 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);
-
- List<String> *join_using_fields = cond_table_list->join_using_fields;
- if (join_using_fields)
- {
- if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
- SPIDER_SQL_OPEN_PAREN_LEN);
- List_iterator_fast<String> it2(*join_using_fields);
- String *ptr;
- while ((ptr = it2++))
- {
- if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(ptr->ptr(), ptr->length());
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- 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);
- }
- }
-
- Item *on_expr = cond_table_list->on_expr;
- if (on_expr)
- {
- if (str)
- {
- if (str->reserve(SPIDER_SQL_ON_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
- }
- if ((error_num = spider_db_print_item_type(on_expr, NULL,
- spider, str, NULL, 0, dbton_id, TRUE, fields)))
- {
- DBUG_RETURN(error_num);
}
}
+ /* Update usable tables in the outer context. */
+ if (upper_usable_tables)
+ *upper_usable_tables |= usable_tables;
}
DBUG_RETURN(0);
}
-int spider_db_mbase_util::append_tables_top_down_check(
- TABLE_LIST *table_list,
- TABLE_LIST **used_table_list,
- uint *current_pos
-) {
- int error_num;
- TABLE_LIST *cur_table_list;
- DBUG_ENTER("spider_db_mbase_util::append_tables_top_down_check");
- DBUG_PRINT("info",("spider this=%p", this));
- List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
- while ((cur_table_list = it1++))
+/*
+ Walk a join, or format it to a string and append the string.
+
+ Skip all eliminated tables.
+
+ If str is NULL, walk the tables to determine whether to create a
+ group by handler. Otherwise, format the join to a string and append
+ it to str.
+
+ Adapted from print_join().
+*/
+int spider_db_mbase_util::append_join(spider_fields *fields,
+ spider_string *str,
+ List<TABLE_LIST> *tables,
+ table_map *upper_usable_tables,
+ table_map eliminated_tables)
+{
+ /* List is reversed => we should reverse it before using */
+ List_iterator_fast<TABLE_LIST> ti(*tables);
+ TABLE_LIST **table;
+ THD *thd= fields->get_first_table_holder()->spider->wide_handler->trx->thd;
+ DBUG_ENTER("spider_db_mbase_util::append_join");
+
+ size_t tables_to_print= 0;
+
+ for (TABLE_LIST *t= ti++; t ; t= ti++)
{
- if (!cur_table_list->table)
- {
- if ((error_num = append_tables_top_down_check(
- cur_table_list, used_table_list, current_pos)))
- DBUG_RETURN(error_num);
- } else {
- used_table_list[(*current_pos)++] = cur_table_list;
- }
+ /* optimized_away implies const_table */
+ DBUG_ASSERT(!t->optimized_away || t->table->const_table);
+ if (!is_eliminated_table(eliminated_tables, t))
+ tables_to_print++;
}
- DBUG_RETURN(0);
-}
+ if (tables_to_print == 0)
+ {
+ if (str && str->append(STRING_WITH_LEN("dual")))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(0);
+ }
+ ti.rewind();
-int spider_db_mbase_util::append_embedding_tables(
- ha_spider *spider,
- spider_fields *fields,
- spider_string *str,
- TABLE_LIST *table_list,
- TABLE_LIST **used_table_list,
- uint *current_pos,
- TABLE_LIST **cond_table_list_ptr
-) {
- int error_num;
- TABLE_LIST *embedding = table_list->embedding;
- DBUG_ENTER("spider_db_mbase_util::append_embedding_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- if (embedding)
- {
- DBUG_PRINT("info",("spider embedding=%p", embedding));
- DBUG_PRINT("info",("spider embedding->outer_join=%u",
- embedding->outer_join));
- DBUG_PRINT("info",("spider embedding->on_expr=%p",
- embedding->on_expr));
- DBUG_PRINT("info",("spider embedding->join_using_fields=%p",
- embedding->join_using_fields));
- DBUG_PRINT("info",("spider embedding->table=%p",
- embedding->table));
- if ((error_num = append_embedding_tables(spider, fields, str, embedding,
- used_table_list, current_pos, cond_table_list_ptr)))
- DBUG_RETURN(error_num);
- } else {
- DBUG_PRINT("info",("spider table_list=%p", table_list));
- DBUG_PRINT("info",("spider table_list->outer_join=%u",
- table_list->outer_join));
- DBUG_PRINT("info",("spider table_list->on_expr=%p",
- table_list->on_expr));
- DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
- table_list->join_using_fields));
- DBUG_PRINT("info",("spider table_list->table=%p",
- table_list->table));
- if (table_list->outer_join & JOIN_TYPE_RIGHT)
- {
- if ((error_num = append_tables_top_down_check(table_list,
- used_table_list, current_pos)))
- DBUG_RETURN(error_num);
- DBUG_ASSERT(!(*cond_table_list_ptr));
- (*cond_table_list_ptr) = table_list;
- DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
- } else {
- if ((error_num = append_tables_top_down(spider, fields, str, table_list,
- used_table_list, current_pos, cond_table_list_ptr)))
- DBUG_RETURN(error_num);
- }
+ if (!(table= static_cast<TABLE_LIST **>(thd->alloc(sizeof(TABLE_LIST*) *
+ tables_to_print))))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+
+ TABLE_LIST *tmp, **t= table + (tables_to_print - 1);
+ while ((tmp= ti++))
+ if (!is_eliminated_table(eliminated_tables, tmp))
+ *t--= tmp;
+
+ DBUG_ASSERT(tables->elements >= 1);
+ if ((*table)->sj_inner_tables)
+ {
+ /* Semi join is not supported. */
+ if (!str)
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ /* Semi join should have been skipped in the first pass. */
+ else
+ DBUG_ASSERT(0);
}
- DBUG_RETURN(0);
+ int error_num= append_table_array(
+ fields, str, table, table + tables_to_print, upper_usable_tables,
+ eliminated_tables);
+ DBUG_RETURN(error_num);
}
int spider_db_mbase_util::append_from_and_tables(
@@ -7245,116 +7063,17 @@ int spider_db_mbase_util::append_from_and_tables(
spider_string *str,
TABLE_LIST *table_list,
uint table_count
-) {
- int error_num;
- uint current_pos = 0, roop_count, backup_pos, outer_join_backup;
- TABLE *table;
- TABLE_LIST **used_table_list, *prev_table_list = NULL,
- *cond_table_list = NULL;
+)
+{
DBUG_ENTER("spider_db_mbase_util::append_from_and_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- used_table_list = (TABLE_LIST **)
- my_alloca(sizeof(TABLE_LIST *) * table_count);
- if (!used_table_list)
+ if (str && str->append(" from "))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-
- if (str)
- {
- if (str->reserve(SPIDER_SQL_FROM_LEN))
- {
- my_afree(used_table_list);
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
- }
-
- do {
- table = table_list->table;
- if (table->const_table)
- continue;
-
- for (roop_count = 0; roop_count < current_pos; ++roop_count)
- {
- if (used_table_list[roop_count] == table_list)
- break;
- }
- if (roop_count < current_pos)
- continue;
-
- if (prev_table_list)
- current_pos = backup_pos;
- else
- backup_pos = current_pos;
- if ((error_num = append_table(spider, fields, str, table_list, used_table_list,
- &current_pos, &cond_table_list, FALSE, FALSE)))
- {
- my_afree(used_table_list);
- DBUG_RETURN(error_num);
- }
- if (prev_table_list)
- {
- outer_join_backup = prev_table_list->outer_join;
- prev_table_list->outer_join = JOIN_TYPE_LEFT;
- if ((error_num = append_table(spider, fields, str, prev_table_list,
- used_table_list, &current_pos, &cond_table_list, FALSE, FALSE)))
- {
- prev_table_list->outer_join = outer_join_backup;
- my_afree(used_table_list);
- DBUG_RETURN(error_num);
- }
- prev_table_list->outer_join = outer_join_backup;
- prev_table_list = NULL;
- }
- if (cond_table_list && (cond_table_list->outer_join & JOIN_TYPE_RIGHT))
- {
- prev_table_list = cond_table_list;
- cond_table_list = NULL;
- DBUG_PRINT("info",("spider cond_table_list=%p", cond_table_list));
- }
- } while ((table_list = table_list->next_local));
- my_afree(used_table_list);
- DBUG_RETURN(0);
-}
-
-int spider_db_mbase_util::reappend_tables(
- spider_fields *fields,
- SPIDER_LINK_IDX_CHAIN *link_idx_chain,
- spider_string *str
-) {
- int error_num;
- uint32 length;
- ha_spider *spider;
- spider_mbase_share *db_share;
- spider_mbase_handler *dbton_hdl;
- SPIDER_TABLE_HOLDER *table_holder;
- SPIDER_LINK_IDX_HOLDER *link_idx_holder;
- DBUG_ENTER("spider_db_mbase_util::reappend_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- length = str->length();
- fields->set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
- fields->set_pos_to_first_table_holder();
- while ((table_holder = fields->get_next_table_holder()))
- {
- link_idx_holder =
- fields->get_next_table_on_link_idx_chain(link_idx_chain);
- spider = table_holder->spider;
- db_share = (spider_mbase_share *)
- spider->share->dbton_share[dbton_id];
- if (!db_share->same_db_table_name)
- {
- dbton_hdl = (spider_mbase_handler *) spider->dbton_handler[dbton_id];
- str->length(dbton_hdl->table_name_pos);
- if ((error_num = db_share->append_table_name_with_adjusting(str,
- spider->conn_link_idx[link_idx_holder->link_idx])))
- {
- DBUG_RETURN(error_num);
- }
- }
- }
- str->length(length);
- DBUG_RETURN(0);
+ const table_map eliminated_tables= table_list->select_lex->join ?
+ table_list->select_lex->join->eliminated_tables : 0;
+ int error_num = append_join(fields, str, table_list->select_lex->join_list,
+ NULL, eliminated_tables);
+ DBUG_RETURN(error_num);
}
-
int spider_db_mbase_util::append_where(
spider_string *str
) {
@@ -7455,7 +7174,7 @@ spider_mbase_share::spider_mbase_share(
{
DBUG_ENTER("spider_mbase_share::spider_mbase_share");
DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 71);
+ spider_alloc_calc_mem_init(mem_calc, SPD_MID_MBASE_SHARE_SPIDER_MBASE_SHARE_1);
spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
DBUG_VOID_RETURN;
}
@@ -7529,7 +7248,7 @@ int spider_mbase_share::init()
DBUG_ENTER("spider_mbase_share::init");
DBUG_PRINT("info",("spider this=%p", this));
if (!(key_select_pos = (int *)
- spider_bulk_alloc_mem(spider_current_trx, 112,
+ spider_bulk_alloc_mem(spider_current_trx, SPD_MID_MBASE_SHARE_INIT_1,
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
&key_select_pos,
sizeof(int) * keys,
@@ -7547,7 +7266,7 @@ int spider_mbase_share::init()
}
for (roop_count = 0; roop_count < keys; roop_count++)
{
- key_hint[roop_count].init_calc_mem(189);
+ key_hint[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_INIT_2);
key_hint[roop_count].set_charset(spider_share->access_charset);
}
DBUG_PRINT("info",("spider key_hint=%p", key_hint));
@@ -7571,13 +7290,13 @@ int spider_mbase_share::init()
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
- table_select->init_calc_mem(96);
+ table_select->init_calc_mem(SPD_MID_MBASE_SHARE_INIT_3);
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);
+ key_select[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_INIT_4);
if ((error_num = append_key_select(roop_count)))
DBUG_RETURN(error_num);
}
@@ -7728,9 +7447,9 @@ int spider_mbase_share::create_table_names_str()
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);
+ table_names_str[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_1);
+ db_names_str[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_2);
+ db_table_str[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_3);
if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
continue;
if (first_all_link_idx == -1)
@@ -7869,7 +7588,7 @@ int spider_mbase_share::create_column_name_str()
for (field = table_share->field, str = column_name_str;
*field; field++, str++)
{
- str->init_calc_mem(89);
+ str->init_calc_mem(SPD_MID_MBASE_SHARE_CREATE_COLUMN_NAME_STR_1);
str->set_charset(spider_share->access_charset);
if ((error_num = spider_db_append_name_with_quote_str(str,
(*field)->field_name, dbton_id)))
@@ -7937,8 +7656,8 @@ int spider_mbase_share::append_show_table_status()
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);
+ show_table_status[0 + (2 * roop_count)].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_TABLE_STATUS_1);
+ show_table_status[1 + (2 * roop_count)].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_TABLE_STATUS_2);
if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
continue;
@@ -8018,7 +7737,7 @@ int spider_mbase_share::append_show_records()
for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
roop_count++)
{
- show_records[roop_count].init_calc_mem(92);
+ show_records[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_RECORDS_1);
if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
continue;
@@ -8068,8 +7787,8 @@ int spider_mbase_share::append_show_index()
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);
+ show_index[0 + (2 * roop_count)].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_INDEX_1);
+ show_index[1 + (2 * roop_count)].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_INDEX_2);
if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
continue;
@@ -8202,7 +7921,7 @@ int spider_mbase_share::discover_table_structure(
uint strlen = str->length();
DBUG_ENTER("spider_mbase_share::discover_table_structure");
DBUG_PRINT("info",("spider this=%p", this));
- sql_str.init_calc_mem(228);
+ sql_str.init_calc_mem(SPD_MID_MBASE_SHARE_DISCOVER_TABLE_STRUCTURE_1);
for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
roop_count++)
{
@@ -8536,7 +8255,7 @@ spider_mbase_handler::spider_mbase_handler(
{
DBUG_ENTER("spider_mbase_handler::spider_mbase_handler");
DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 183);
+ spider_alloc_calc_mem_init(mem_calc, SPD_MID_MBASE_HANDLER_SPIDER_MBASE_HANDLER_1);
spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
DBUG_VOID_RETURN;
}
@@ -8609,14 +8328,14 @@ int spider_mbase_handler::init()
TABLE *table = spider->get_table();
DBUG_ENTER("spider_mbase_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);
+ sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_1);
+ sql_part.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_2);
+ sql_part2.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_3);
+ ha_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_4);
+ insert_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_5);
+ update_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_6);
+ tmp_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_7);
+ dup_update_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_8);
if (
(sql.real_alloc(init_sql_alloc_size)) ||
(insert_sql.real_alloc(init_sql_alloc_size)) ||
@@ -8636,7 +8355,7 @@ int spider_mbase_handler::init()
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,
+ spider_bulk_alloc_mem(spider_current_trx, SPD_MID_MBASE_HANDLER_INIT_9,
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
&link_for_hash,
sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
@@ -8740,7 +8459,7 @@ int spider_mbase_handler::append_key_column_types(
spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info);
DBUG_ENTER("spider_mbase_handler::append_key_column_types");
DBUG_PRINT("info",("spider this=%p", this));
- tmp_str.init_calc_mem(115);
+ tmp_str.init_calc_mem(SPD_MID_MBASE_HANDLER_APPEND_KEY_COLUMN_TYPES_1);
start_key_part_map = start_key->keypart_map & full_key_part_map;
DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
@@ -8870,7 +8589,7 @@ int spider_mbase_handler::append_tmp_table_and_sql_for_bka(
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.init_calc_mem(SPD_MID_MBASE_HANDLER_APPEND_TMP_TABLE_AND_SQL_FOR_BKA_1);
tgt_table_name_str.length(0);
create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
first_link_idx);
@@ -9121,7 +8840,7 @@ int spider_mbase_handler::append_union_table_and_sql_for_bka(
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.init_calc_mem(SPD_MID_MBASE_HANDLER_APPEND_UNION_TABLE_AND_SQL_FOR_BKA_1);
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)))
@@ -11107,7 +10826,7 @@ int spider_mbase_handler::append_match_against(
char buf[MAX_FIELD_WIDTH];
spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
- tmp_str.init_calc_mem(116);
+ tmp_str.init_calc_mem(SPD_MID_MBASE_HANDLER_APPEND_MATCH_AGAINST_1);
tmp_str.length(0);
if (
tmp_str.append(ft_init_key->ptr(), ft_init_key->length(),
@@ -13223,14 +12942,10 @@ int spider_mbase_handler::set_sql_for_exec(
int link_idx,
SPIDER_LINK_IDX_CHAIN *link_idx_chain
) {
- int error_num;
DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
DBUG_PRINT("info",("spider this=%p", this));
if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
{
- if ((error_num = spider_db_mbase_utility->reappend_tables(
- spider->fields, link_idx_chain, &sql)))
- DBUG_RETURN(error_num);
exec_sql = &sql;
}
DBUG_RETURN(0);
@@ -13264,7 +12979,7 @@ int spider_mbase_handler::set_sql_for_exec(
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.init_calc_mem(SPD_MID_MBASE_HANDLER_SET_SQL_FOR_EXEC_1);
tgt_table_name_str.length(0);
if (result_list->tmp_table_join && spider->bka_mode != 2)
{
@@ -15213,7 +14928,7 @@ int spider_mbase_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),
+ if (!spider_bulk_malloc(spider_current_trx, SPD_MID_MBASE_HANDLER_INIT_UNION_TABLE_NAME_POS_1, MYF(MY_WME),
&union_table_name_pos_first, (uint) (sizeof(SPIDER_INT_HLD)),
NullS)
) {
@@ -15234,7 +14949,7 @@ int spider_mbase_handler::set_union_table_name_pos()
{
if (!union_table_name_pos_current->next)
{
- if (!spider_bulk_malloc(spider_current_trx, 237, MYF(MY_WME),
+ if (!spider_bulk_malloc(spider_current_trx, SPD_MID_MBASE_HANDLER_SET_UNION_TABLE_NAME_POS_1, MYF(MY_WME),
&union_table_name_pos_current->next, (uint) (sizeof(SPIDER_INT_HLD)),
NullS)
) {
@@ -15296,8 +15011,7 @@ int spider_mbase_handler::append_from_and_tables_part(
default:
DBUG_RETURN(0);
}
- fields->set_pos_to_first_table_holder();
- table_holder = fields->get_next_table_holder();
+ table_holder = fields->get_first_table_holder();
table_list = table_holder->table->pos_in_table_list;
error_num = spider_db_mbase_utility->append_from_and_tables(
table_holder->spider, fields, str,
@@ -15305,27 +15019,6 @@ int spider_mbase_handler::append_from_and_tables_part(
DBUG_RETURN(error_num);
}
-int spider_mbase_handler::reappend_tables_part(
- spider_fields *fields,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mbase_handler::reappend_tables_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 = spider_db_mbase_utility->reappend_tables(fields,
- link_idx_chain, str);
- DBUG_RETURN(error_num);
-}
-
int spider_mbase_handler::append_where_part(
ulong sql_type
) {
@@ -15678,7 +15371,7 @@ int spider_mbase_copy_table::init()
{
DBUG_ENTER("spider_mbase_copy_table::init");
DBUG_PRINT("info",("spider this=%p", this));
- sql.init_calc_mem(78);
+ sql.init_calc_mem(SPD_MID_MBASE_COPY_TABLE_INIT_1);
DBUG_RETURN(0);
}
diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h
index ec72a97f..9ccc0e33 100644
--- a/storage/spider/spd_db_mysql.h
+++ b/storage/spider/spd_db_mysql.h
@@ -158,40 +158,22 @@ public:
spider_string *to,
String *from
) override;
- int append_table(
- ha_spider *spider,
- spider_fields *fields,
- spider_string *str,
- TABLE_LIST *table_list,
- TABLE_LIST **used_table_list,
- uint *current_pos,
- TABLE_LIST **cond_table_list_ptr,
- bool top_down,
- bool first
- );
- int append_tables_top_down(
- ha_spider *spider,
- spider_fields *fields,
- spider_string *str,
- TABLE_LIST *table_list,
- TABLE_LIST **used_table_list,
- uint *current_pos,
- TABLE_LIST **cond_table_list_ptr
- );
int append_tables_top_down_check(
TABLE_LIST *table_list,
TABLE_LIST **used_table_list,
uint *current_pos
);
- int append_embedding_tables(
- ha_spider *spider,
- spider_fields *fields,
- spider_string *str,
- TABLE_LIST *table_list,
- TABLE_LIST **used_table_list,
- uint *current_pos,
- TABLE_LIST **cond_table_list_ptr
- );
+ int append_table_list(spider_fields *fields,
+ spider_string *str, TABLE_LIST *table,
+ table_map *upper_usable_tables,
+ table_map eliminated_tables);
+ int append_table_array(spider_fields *fields,
+ spider_string *str, TABLE_LIST **table,
+ TABLE_LIST **end, table_map *upper_usable_tables,
+ table_map eliminated_tables);
+ int append_join(spider_fields *fields, spider_string *str,
+ List<TABLE_LIST> *tables, table_map *upper_usable_tables,
+ table_map eliminated_tables);
int append_from_and_tables(
ha_spider *spider,
spider_fields *fields,
@@ -199,11 +181,6 @@ public:
TABLE_LIST *table_list,
uint table_count
) override;
- int reappend_tables(
- spider_fields *fields,
- SPIDER_LINK_IDX_CHAIN *link_idx_chain,
- spider_string *str
- ) override;
int append_where(
spider_string *str
) override;
@@ -634,8 +611,11 @@ public:
spider_string *show_table_status;
spider_string *show_records;
spider_string *show_index;
+ /* The remote table names */
spider_string *table_names_str;
+ /* The remote db names */
spider_string *db_names_str;
+ /* fixme: this field looks useless */
spider_string *db_table_str;
my_hash_value_type *db_table_str_hash_value;
uint table_nm_max_length;
@@ -1485,10 +1465,6 @@ public:
spider_fields *fields,
ulong sql_type
);
- int reappend_tables_part(
- spider_fields *fields,
- ulong sql_type
- );
int append_where_part(
ulong sql_type
);
diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc
index dbf7cc8f..d345bb04 100644
--- a/storage/spider/spd_direct_sql.cc
+++ b/storage/spider/spd_direct_sql.cc
@@ -109,7 +109,7 @@ int spider_udf_direct_sql_create_table_list(
break;
}
if (!(direct_sql->db_names = (char**)
- spider_bulk_malloc(spider_current_trx, 31, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_TABLE_LIST_2, MYF(MY_WME | MY_ZEROFILL),
&direct_sql->db_names, (uint) (sizeof(char*) * table_count),
&direct_sql->table_names, (uint) (sizeof(char*) * table_count),
&direct_sql->tables, (uint) (sizeof(TABLE*) * table_count),
@@ -238,7 +238,7 @@ int spider_udf_direct_sql_create_conn_key(
+ direct_sql->tgt_filedsn_length + 1
+ direct_sql->tgt_driver_length;
if (!(direct_sql->conn_key = (char *)
- spider_malloc(spider_current_trx, 9, direct_sql->conn_key_length + 1,
+ spider_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_KEY_1, direct_sql->conn_key_length + 1,
MYF(MY_WME | MY_ZEROFILL)))
)
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -389,7 +389,7 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
spider_dbton[direct_sql->dbton_id].db_util->
tables_on_different_db_are_joinable();
if (!(conn = (SPIDER_CONN *)
- spider_bulk_malloc(spider_current_trx, 32, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_1, MYF(MY_WME | MY_ZEROFILL),
&conn, (uint) (sizeof(*conn)),
&tmp_name, (uint) (direct_sql->conn_key_length + 1),
&tmp_host, (uint) (direct_sql->tgt_host_length + 1),
@@ -420,7 +420,7 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
*error_num = HA_ERR_OUT_OF_MEM;
goto error_alloc_conn;
}
- conn->default_database.init_calc_mem(138);
+ conn->default_database.init_calc_mem(SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_2);
conn->conn_key_length = direct_sql->conn_key_length;
conn->conn_key = tmp_name;
@@ -1439,7 +1439,7 @@ long long spider_direct_sql_body(
DBUG_ENTER("spider_direct_sql_body");
SPIDER_BACKUP_DASTATUS;
if (!(direct_sql = (SPIDER_DIRECT_SQL *)
- spider_bulk_malloc(spider_current_trx, 34, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_DIRECT_SQL_BODY_1, MYF(MY_WME | MY_ZEROFILL),
&direct_sql, (uint) (sizeof(SPIDER_DIRECT_SQL)),
&sql, (uint) (sizeof(char) * args->lengths[0]),
NullS))
@@ -1674,7 +1674,7 @@ my_bool spider_direct_sql_init_body(
if (bg)
{
if (!(bg_direct_sql = (SPIDER_BG_DIRECT_SQL *)
- spider_malloc(spider_current_trx, 10, sizeof(SPIDER_BG_DIRECT_SQL),
+ spider_malloc(spider_current_trx, SPD_MID_DIRECT_SQL_INIT_BODY_1, sizeof(SPIDER_BG_DIRECT_SQL),
MYF(MY_WME | MY_ZEROFILL)))
) {
strcpy(message, "spider_bg_direct_sql() out of memory");
diff --git a/storage/spider/spd_group_by_handler.cc b/storage/spider/spd_group_by_handler.cc
index 3cd299c6..6236a7b9 100644
--- a/storage/spider/spd_group_by_handler.cc
+++ b/storage/spider/spd_group_by_handler.cc
@@ -22,6 +22,7 @@
#include "probes_mysql.h"
#include "sql_class.h"
#include "sql_partition.h"
+#include "sql_select.h"
#include "ha_partition.h"
#include "sql_common.h"
#include <errmsg.h>
@@ -42,11 +43,9 @@ extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
spider_fields::spider_fields() :
dbton_count(0), current_dbton_num(0),
- table_count(0), current_table_num(0), table_holder(NULL),
+ table_count(0), table_holder(NULL),
first_link_idx_chain(NULL), last_link_idx_chain(NULL), current_link_idx_chain(NULL),
- first_conn_holder(NULL), last_conn_holder(NULL), current_conn_holder(NULL),
- first_field_holder(NULL), last_field_holder(NULL), current_field_holder(NULL),
- first_field_chain(NULL), last_field_chain(NULL), current_field_chain(NULL)
+ first_conn_holder(NULL), last_conn_holder(NULL), current_conn_holder(NULL)
{
DBUG_ENTER("spider_fields::spider_fields");
DBUG_PRINT("info",("spider this=%p", this));
@@ -65,24 +64,6 @@ spider_fields::~spider_fields()
spider_free(spider_current_trx, current_link_idx_chain, MYF(0));
}
}
- if (first_field_chain)
- {
- while ((current_field_chain = first_field_chain))
- {
- first_field_chain = current_field_chain->next;
- spider_free(spider_current_trx, current_field_chain, MYF(0));
- }
- }
- if (first_field_holder)
- {
- while ((current_field_holder = first_field_holder))
- {
- first_field_holder = current_field_holder->next;
- spider_free(spider_current_trx, current_field_holder, MYF(0));
- }
- }
- if (table_holder)
- spider_free(spider_current_trx, table_holder, MYF(0));
if (first_conn_holder)
{
while ((current_conn_holder = first_conn_holder))
@@ -364,7 +345,7 @@ SPIDER_LINK_IDX_CHAIN *spider_fields::create_link_idx_chain(
DBUG_ENTER("spider_fields::create_link_idx_chain");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN((SPIDER_LINK_IDX_CHAIN *)
- spider_malloc(spider_current_trx, 254, sizeof(SPIDER_LINK_IDX_CHAIN),
+ spider_malloc(spider_current_trx, SPD_MID_FIELDS_CREATE_LINK_IDX_CHAIN_1, sizeof(SPIDER_LINK_IDX_CHAIN),
MYF(MY_WME | MY_ZEROFILL)));
}
@@ -471,7 +452,6 @@ int spider_fields::get_ok_link_idx(
void spider_fields::set_first_link_idx(
) {
- SPIDER_TABLE_HOLDER *table_holder;
SPIDER_LINK_IDX_HOLDER *link_idx_holder;
SPIDER_LINK_IDX_CHAIN *link_idx_chain;
uint dbton_id;
@@ -493,11 +473,10 @@ void spider_fields::set_first_link_idx(
DBUG_ASSERT(link_idx_chain);
set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
- set_pos_to_first_table_holder();
- while ((table_holder = get_next_table_holder()))
+ for (uint i= 0; i < table_count; i++)
{
link_idx_holder = get_next_table_on_link_idx_chain(link_idx_chain);
- spider = table_holder->spider;
+ spider = table_holder[i].spider;
dbton_hdl = spider->dbton_handler[dbton_id];
dbton_hdl->first_link_idx = link_idx_holder->link_idx;
}
@@ -554,7 +533,7 @@ SPIDER_LINK_IDX_HOLDER *spider_fields::create_link_idx_holder(
DBUG_ENTER("spider_fields::create_link_idx_holder");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN((SPIDER_LINK_IDX_HOLDER *)
- spider_malloc(spider_current_trx, 253, sizeof(SPIDER_LINK_IDX_HOLDER),
+ spider_malloc(spider_current_trx, SPD_MID_FIELDS_CREATE_LINK_IDX_HOLDER_1, sizeof(SPIDER_LINK_IDX_HOLDER),
MYF(MY_WME | MY_ZEROFILL)));
}
@@ -632,7 +611,7 @@ SPIDER_CONN_HOLDER *spider_fields::create_conn_holder(
DBUG_ENTER("spider_fields::create_conn_holder");
DBUG_PRINT("info",("spider this=%p", this));
return_conn_holder = (SPIDER_CONN_HOLDER *)
- spider_bulk_malloc(spider_current_trx, 252, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_FIELDS_CREATE_CONN_HOLDER_1, MYF(MY_WME | MY_ZEROFILL),
&return_conn_holder, (uint) (sizeof(SPIDER_CONN_HOLDER)),
&table_link_idx_holder,
(uint) (table_count * sizeof(SPIDER_TABLE_LINK_IDX_HOLDER)),
@@ -646,24 +625,6 @@ SPIDER_CONN_HOLDER *spider_fields::create_conn_holder(
DBUG_RETURN(return_conn_holder);
}
-void spider_fields::set_pos_to_first_conn_holder(
-) {
- DBUG_ENTER("spider_fields::set_pos_to_first_conn_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- current_conn_holder = first_conn_holder;
- DBUG_VOID_RETURN;
-}
-
-SPIDER_CONN_HOLDER *spider_fields::get_next_conn_holder(
-) {
- SPIDER_CONN_HOLDER *return_conn_holder = current_conn_holder;
- DBUG_ENTER("spider_fields::get_next_conn_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- if (current_conn_holder)
- current_conn_holder = current_conn_holder->next;
- DBUG_RETURN(return_conn_holder);
-}
-
bool spider_fields::has_conn_holder(
) {
DBUG_ENTER("spider_fields::has_conn_holder");
@@ -862,19 +823,17 @@ void spider_fields::free_conn_holder(
DBUG_VOID_RETURN;
}
-SPIDER_TABLE_HOLDER *spider_fields::add_table(
- ha_spider *spider_arg
+/* Add the table associated with an ha_spider to a table_holder.
+Return the table_holder. */
+static SPIDER_TABLE_HOLDER *spider_add_table_holder(
+ ha_spider *spider_arg,
+ SPIDER_TABLE_HOLDER *table_holder
) {
spider_string *str;
uint length;
char tmp_buf[SPIDER_SQL_INT_LEN + 2];
SPIDER_TABLE_HOLDER *return_table_holder;
- SPIDER_FIELD_HOLDER *field_holder;
- TABLE *table = spider_arg->get_table();
- Field *field;
DBUG_ENTER("spider_fields::add_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider table_count=%u", table_count));
DBUG_PRINT("info",("spider idx_for_direct_join=%u",
spider_arg->idx_for_direct_join));
length = my_sprintf(tmp_buf, (tmp_buf, "t%u",
@@ -893,90 +852,49 @@ SPIDER_TABLE_HOLDER *spider_fields::add_table(
return_table_holder->spider = spider_arg;
return_table_holder->alias = str;
- set_pos_to_first_field_holder();
- while ((field_holder = get_next_field_holder()))
- {
- if (!field_holder->spider)
- {
- field = field_holder->field;
- if (
- field->field_index < table->s->fields &&
- field == table->field[field->field_index]
- ) {
- field_holder->spider = spider_arg;
- field_holder->alias = str;
- }
- }
- }
DBUG_RETURN(return_table_holder);
}
-/**
- Verify that all fields in the query are members of tables that are in the
- query.
-
- @return TRUE All fields in the query are members of tables
- that are in the query.
- FALSE At least one field in the query is not a
- member of a table that is in the query.
-*/
-
-bool spider_fields::all_query_fields_are_query_table_members()
+/* Return the table that field belongs to, or NULL if none exists. */
+SPIDER_TABLE_HOLDER *spider_fields::find_table(Field *field)
{
- SPIDER_FIELD_HOLDER *field_holder;
- DBUG_ENTER("spider_fields::all_query_fields_are_query_table_members");
- DBUG_PRINT("info",("spider this=%p", this));
-
- set_pos_to_first_field_holder();
- while ((field_holder = get_next_field_holder()))
- {
- if (!field_holder->spider)
- {
- DBUG_PRINT("info", ("spider field is not a member of a query table"));
- DBUG_RETURN(FALSE);
- }
- }
+ for (uint i = 0; i < table_count; i++)
+ if (field->table == table_holder[i].table)
+ return &table_holder[i];
+ return NULL;
+}
- DBUG_RETURN(TRUE);
+void spider_fields::set_table_holder(SPIDER_TABLE_HOLDER *table_holder_arg,
+ uint table_count_arg)
+{
+ table_holder= table_holder_arg;
+ table_count= table_count_arg;
}
-int spider_fields::create_table_holder(
+/* Allocate space for table_count_arg table holders. */
+static SPIDER_TABLE_HOLDER *spider_create_table_holder(
uint table_count_arg
) {
- DBUG_ENTER("spider_fields::create_table_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(!table_holder);
+ SPIDER_TABLE_HOLDER* table_holder;
+ DBUG_ENTER("spider_create_table_holder");
+ if (table_count_arg == 0)
+ DBUG_RETURN(0);
table_holder = (SPIDER_TABLE_HOLDER *)
- spider_malloc(spider_current_trx, 249,
+ spider_malloc(spider_current_trx, SPD_MID_CREATE_TABLE_HOLDER_1,
table_count_arg * sizeof(SPIDER_TABLE_HOLDER),
MYF(MY_WME | MY_ZEROFILL));
- if (!table_holder)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- table_count = table_count_arg;
- current_table_num = 0;
- DBUG_RETURN(0);
+ DBUG_RETURN(table_holder);
}
-void spider_fields::set_pos_to_first_table_holder(
-) {
- DBUG_ENTER("spider_fields::set_pos_to_first_table_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- current_table_num = 0;
- DBUG_VOID_RETURN;
-}
-
-SPIDER_TABLE_HOLDER *spider_fields::get_next_table_holder(
-) {
- SPIDER_TABLE_HOLDER *return_table_holder;
- DBUG_ENTER("spider_fields::get_next_table_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- if (current_table_num >= table_count)
- DBUG_RETURN(NULL);
- return_table_holder = &table_holder[current_table_num];
- ++current_table_num;
- DBUG_RETURN(return_table_holder);
+/* Return pointer to the first table holder. */
+SPIDER_TABLE_HOLDER *spider_fields::get_first_table_holder()
+{
+ DBUG_ENTER("spider_fields::get_first_spider");
+ DBUG_RETURN(table_holder);
}
+/* Return the first table holder associated with a given table, or
+NULL if not found. */
SPIDER_TABLE_HOLDER *spider_fields::get_table_holder(TABLE *table)
{
uint table_num;
@@ -996,117 +914,12 @@ uint spider_fields::get_table_count()
DBUG_RETURN(table_count);
}
-int spider_fields::add_field(
- Field *field_arg
-) {
- SPIDER_FIELD_HOLDER *field_holder;
- SPIDER_FIELD_CHAIN *field_chain;
- DBUG_ENTER("spider_fields::add_field");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider field=%p", field_arg));
- if (!first_field_holder)
- {
- field_holder = create_field_holder();
- DBUG_PRINT("info",("spider field_holder=%p", field_holder));
- if (!field_holder)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- field_holder->field = field_arg;
- first_field_holder = field_holder;
- last_field_holder = field_holder;
- } else {
- field_holder = first_field_holder;
- do {
- if (field_holder->field == field_arg)
- break;
- } while ((field_holder = field_holder->next));
- if (!field_holder)
- {
- field_holder = create_field_holder();
- DBUG_PRINT("info",("spider field_holder=%p", field_holder));
- if (!field_holder)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- field_holder->field = field_arg;
- last_field_holder->next = field_holder;
- last_field_holder = field_holder;
- }
- }
- field_chain = create_field_chain();
- DBUG_PRINT("info",("spider field_chain=%p", field_chain));
- if (!field_chain)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- field_chain->field_holder = field_holder;
- if (!first_field_chain)
- {
- first_field_chain = field_chain;
- last_field_chain = field_chain;
- } else {
- last_field_chain->next = field_chain;
- last_field_chain = field_chain;
- }
- DBUG_RETURN(0);
-}
-
-SPIDER_FIELD_HOLDER *spider_fields::create_field_holder(
-) {
- DBUG_ENTER("spider_fields::create_field_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((SPIDER_FIELD_HOLDER *)
- spider_malloc(spider_current_trx, 250, sizeof(SPIDER_FIELD_HOLDER),
- MYF(MY_WME | MY_ZEROFILL)));
-}
-
-void spider_fields::set_pos_to_first_field_holder(
-) {
- DBUG_ENTER("spider_fields::set_pos_to_first_field_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- current_field_holder = first_field_holder;
- DBUG_VOID_RETURN;
-}
-
-SPIDER_FIELD_HOLDER *spider_fields::get_next_field_holder(
-) {
- SPIDER_FIELD_HOLDER *return_field_holder = current_field_holder;
- DBUG_ENTER("spider_fields::get_next_field_holder");
- DBUG_PRINT("info",("spider this=%p", this));
- if (current_field_holder)
- current_field_holder = current_field_holder->next;
- DBUG_RETURN(return_field_holder);
-}
-
-SPIDER_FIELD_CHAIN *spider_fields::create_field_chain(
-) {
- DBUG_ENTER("spider_fields::create_field_chain");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((SPIDER_FIELD_CHAIN *)
- spider_malloc(spider_current_trx, 251, sizeof(SPIDER_FIELD_CHAIN),
- MYF(MY_WME | MY_ZEROFILL)));
-}
-
-void spider_fields::set_pos_to_first_field_chain(
-) {
- DBUG_ENTER("spider_fields::set_pos_to_first_field_chain");
- DBUG_PRINT("info",("spider this=%p", this));
- current_field_chain = first_field_chain;
- DBUG_VOID_RETURN;
-}
-
-SPIDER_FIELD_CHAIN *spider_fields::get_next_field_chain(
-) {
- SPIDER_FIELD_CHAIN *return_field_chain = current_field_chain;
- DBUG_ENTER("spider_fields::get_next_field_chain");
- DBUG_PRINT("info",("spider this=%p", this));
- if (current_field_chain)
- current_field_chain = current_field_chain->next;
- DBUG_RETURN(return_field_chain);
-}
-
void spider_fields::set_field_ptr(
Field **field_arg
) {
DBUG_ENTER("spider_fields::set_field_ptr");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider field_ptr=%p", field_arg));
- first_field_ptr = field_arg;
current_field_ptr = field_arg;
DBUG_VOID_RETURN;
}
@@ -1129,15 +942,13 @@ int spider_fields::ping_table_mon_from_table(
ha_spider *tmp_spider;
SPIDER_SHARE *tmp_share;
int tmp_link_idx;
- SPIDER_TABLE_HOLDER *table_holder;
SPIDER_LINK_IDX_HOLDER *link_idx_holder;
DBUG_ENTER("spider_fields::ping_table_mon_from_table");
set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
- set_pos_to_first_table_holder();
- while ((table_holder = get_next_table_holder()))
+ for (uint i= 0; i < table_count; i++)
{
link_idx_holder = get_next_table_on_link_idx_chain(link_idx_chain);
- tmp_spider = table_holder->spider;
+ tmp_spider = table_holder[i].spider;
tmp_link_idx = link_idx_holder->link_idx;
tmp_share = tmp_spider->share;
if (tmp_share->monitoring_kind[tmp_link_idx])
@@ -1173,9 +984,7 @@ spider_group_by_handler::spider_group_by_handler(
query(*query_arg), fields(fields_arg)
{
DBUG_ENTER("spider_group_by_handler::spider_group_by_handler");
- fields->set_pos_to_first_table_holder();
- SPIDER_TABLE_HOLDER *table_holder = fields->get_next_table_holder();
- spider = table_holder->spider;
+ spider = fields->get_first_table_holder()->spider;
trx = spider->wide_handler->trx;
DBUG_VOID_RETURN;
}
@@ -1183,42 +992,20 @@ spider_group_by_handler::spider_group_by_handler(
spider_group_by_handler::~spider_group_by_handler()
{
DBUG_ENTER("spider_group_by_handler::~spider_group_by_handler");
+ spider_free(spider_current_trx, fields->get_first_table_holder(), MYF(0));
delete fields;
DBUG_VOID_RETURN;
}
-int spider_group_by_handler::init_scan()
+static int spider_prepare_init_scan(
+ const Query& query, spider_fields *fields, ha_spider *spider,
+ SPIDER_TRX *trx, longlong& offset_limit, THD *thd)
{
- int error_num, link_idx;
- uint dbton_id;
- spider_db_handler *dbton_hdl;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
st_select_lex *select_lex;
- longlong select_limit;
- longlong direct_order_limit;
+ longlong select_limit, direct_order_limit;
SPIDER_SHARE *share = spider->share;
- SPIDER_CONN *conn;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- SPIDER_LINK_IDX_CHAIN *link_idx_chain;
- SPIDER_LINK_IDX_HOLDER *link_idx_holder;
- DBUG_ENTER("spider_group_by_handler::init_scan");
- store_error = 0;
-#ifndef DBUG_OFF
- Field **field;
- for (
- field = table->field;
- *field;
- field++
- ) {
- DBUG_PRINT("info",("spider field_name=%s",
- SPIDER_field_name_str(*field)));
- }
-#endif
-
- if (trx->thd->killed)
- {
- my_error(ER_QUERY_INTERRUPTED, MYF(0));
- DBUG_RETURN(ER_QUERY_INTERRUPTED);
- }
+ DBUG_ENTER("spider_prepare_init_scan");
spider->use_fields = TRUE;
spider->fields = fields;
@@ -1264,7 +1051,7 @@ int spider_group_by_handler::init_scan()
}
result_list->semi_split_read_base = 0;
result_list->set_split_read = TRUE;
- if ((error_num = spider_set_conn_bg_param(spider)))
+ if (int error_num = spider_set_conn_bg_param(spider))
DBUG_RETURN(error_num);
DBUG_PRINT("info",("spider result_list.finish_flg = FALSE"));
result_list->finish_flg = FALSE;
@@ -1284,86 +1071,87 @@ int spider_group_by_handler::init_scan()
} else {
offset_limit = 0;
}
+ DBUG_RETURN(0);
+}
+
+static int spider_make_query(const Query& query, spider_fields* fields, ha_spider *spider, TABLE *table)
+{
+ uint dbton_id;
+ spider_db_handler* dbton_hdl;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ int error_num;
+ DBUG_ENTER("spider_make_query");
- /* making a query */
fields->set_pos_to_first_dbton_id();
while ((dbton_id = fields->get_next_dbton_id()) < SPIDER_DBTON_SIZE)
{
dbton_hdl = spider->dbton_handler[dbton_id];
result_list->direct_distinct = query.distinct;
- fields->set_pos_to_first_field_chain();
if ((error_num = dbton_hdl->reset_sql(SPIDER_SQL_TYPE_SELECT_SQL)))
- {
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_select_part(SPIDER_SQL_TYPE_SELECT_SQL)))
- {
DBUG_RETURN(error_num);
- }
fields->set_field_ptr(table->field);
if ((error_num = dbton_hdl->append_list_item_select_part(
- query.select, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.select, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_from_and_tables_part(
- fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if (query.where)
{
if ((error_num =
- dbton_hdl->append_where_part(SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ dbton_hdl->append_where_part(SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_item_type_part(
- query.where, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.where, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
if (query.group_by)
{
if ((error_num = dbton_hdl->append_group_by_part(
- query.group_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.group_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
if (query.having)
{
if ((error_num =
- dbton_hdl->append_having_part(SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ dbton_hdl->append_having_part(SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_item_type_part(
- query.having, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.having, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
if (query.order_by)
{
if ((error_num = dbton_hdl->append_order_by_part(
- query.order_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ query.order_by, NULL, 0, TRUE, fields,
+ SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
- if ((error_num = dbton_hdl->append_limit_part(result_list->internal_offset,
- result_list->limit_num, SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ if ((error_num = dbton_hdl->append_limit_part(
+ result_list->internal_offset, result_list->limit_num,
+ SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
if ((error_num = dbton_hdl->append_select_lock_part(
- SPIDER_SQL_TYPE_SELECT_SQL)))
- {
+ SPIDER_SQL_TYPE_SELECT_SQL)))
DBUG_RETURN(error_num);
- }
}
+ DBUG_RETURN(0);
+}
+
+static int spider_send_query(
+ spider_fields *fields, ha_spider *spider, SPIDER_TRX *trx, TABLE *table,
+ int& store_error)
+{
+ int error_num, link_idx;
+ spider_db_handler *dbton_hdl;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ SPIDER_SHARE *share = spider->share;
+ SPIDER_CONN *conn;
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ DBUG_ENTER("spider_send_query");
fields->set_pos_to_first_link_idx_chain();
while ((link_idx_chain = fields->get_next_link_idx_chain()))
@@ -1382,12 +1170,8 @@ int spider_group_by_handler::init_scan()
dbton_hdl->first_link_idx, TRUE, FALSE,
!fields->is_first_link_ok_chain(link_idx_chain))))
{
- if (
- error_num != HA_ERR_END_OF_FILE &&
- spider->need_mons[link_idx]
- ) {
+ if (error_num != HA_ERR_END_OF_FILE && spider->need_mons[link_idx])
error_num = fields->ping_table_mon_from_table(link_idx_chain);
- }
if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
{
store_error = HA_ERR_END_OF_FILE;
@@ -1395,14 +1179,12 @@ int spider_group_by_handler::init_scan()
}
DBUG_RETURN(error_num);
}
- } else {
+ } else
+ {
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
- if ((error_num =
- dbton_hdl->set_sql_for_exec(SPIDER_SQL_TYPE_SELECT_SQL, link_idx,
- link_idx_chain)))
- {
+ if ((error_num = dbton_hdl->set_sql_for_exec(
+ SPIDER_SQL_TYPE_SELECT_SQL, link_idx, link_idx_chain)))
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];
@@ -1412,6 +1194,7 @@ int spider_group_by_handler::init_scan()
conn->mta_conn_mutex_unlock_later = TRUE;
if ((error_num = spider_db_set_names(spider, conn,
link_idx)))
+ if ((error_num = spider_db_set_names(spider, conn, link_idx)))
{
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
@@ -1419,37 +1202,32 @@ int spider_group_by_handler::init_scan()
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
- if (
- spider->need_mons[link_idx]
- ) {
+ if (spider->need_mons[link_idx])
error_num = fields->ping_table_mon_from_table(link_idx_chain);
- }
- if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ if ((error_num = spider->check_error_mode_eof(error_num)) ==
+ HA_ERR_END_OF_FILE)
{
store_error = HA_ERR_END_OF_FILE;
error_num = 0;
}
DBUG_RETURN(error_num);
}
- spider_conn_set_timeout_from_share(conn, link_idx,
- trx->thd, share);
+ spider_conn_set_timeout_from_share(conn, link_idx, trx->thd, share);
if (dbton_hdl->execute_sql(
SPIDER_SQL_TYPE_SELECT_SQL,
conn,
spider->result_list.quick_mode,
- &spider->need_mons[link_idx])
- ) {
+ &spider->need_mons[link_idx]))
+ {
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
error_num = spider_db_errorno(conn);
- if (
- spider->need_mons[link_idx]
- ) {
+ if (spider->need_mons[link_idx])
error_num = fields->ping_table_mon_from_table(link_idx_chain);
- }
- if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ if ((error_num = spider->check_error_mode_eof(error_num)) ==
+ HA_ERR_END_OF_FILE)
{
store_error = HA_ERR_END_OF_FILE;
error_num = 0;
@@ -1465,13 +1243,10 @@ int spider_group_by_handler::init_scan()
{
if ((error_num = spider_db_store_result(spider, link_idx, table)))
{
- if (
- error_num != HA_ERR_END_OF_FILE &&
- spider->need_mons[link_idx]
- ) {
+ if (error_num != HA_ERR_END_OF_FILE && spider->need_mons[link_idx])
error_num = fields->ping_table_mon_from_table(link_idx_chain);
- }
- if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ if ((error_num = spider->check_error_mode_eof(error_num)) ==
+ HA_ERR_END_OF_FILE)
{
store_error = HA_ERR_END_OF_FILE;
error_num = 0;
@@ -1480,13 +1255,45 @@ int spider_group_by_handler::init_scan()
}
spider->result_link_idx = link_idx;
spider->result_link_idx_chain = link_idx_chain;
- } else {
+ } else
+ {
spider_db_discard_result(spider, link_idx, conn);
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
}
}
+ DBUG_RETURN(0);
+}
+
+/*
+ Prepare and send query to data nodes and store the query results.
+*/
+int spider_group_by_handler::init_scan()
+{
+ int error_num;
+ DBUG_ENTER("spider_group_by_handler::init_scan");
+ store_error = 0;
+#ifndef DBUG_OFF
+ for (Field **field = table->field; *field; field++)
+ DBUG_PRINT("info",("spider field_name=%s", SPIDER_field_name_str(*field)));
+#endif
+
+ if (trx->thd->killed)
+ {
+ my_error(ER_QUERY_INTERRUPTED, MYF(0));
+ DBUG_RETURN(ER_QUERY_INTERRUPTED);
+ }
+
+ if ((error_num = spider_prepare_init_scan(
+ query, fields, spider, trx, offset_limit, thd)))
+ DBUG_RETURN(error_num);
+
+ if ((error_num = spider_make_query(query, fields, spider, table)))
+ DBUG_RETURN(error_num);
+
+ if ((error_num = spider_send_query(fields, spider, trx, table, store_error)))
+ DBUG_RETURN(error_num);
first = TRUE;
DBUG_RETURN(0);
@@ -1595,7 +1402,8 @@ group_by_handler *spider_create_group_by_handler(
bool keep_going;
bool find_dbton = FALSE;
spider_fields *fields = NULL, *fields_arg = NULL;
- uint table_idx, dbton_id;
+ SPIDER_TABLE_HOLDER *table_holder;
+ uint table_idx, dbton_id, table_count= 0;
long tgt_link_status;
DBUG_ENTER("spider_create_group_by_handler");
@@ -1617,8 +1425,7 @@ group_by_handler *spider_create_group_by_handler(
from = query->from;
do {
DBUG_PRINT("info",("spider from=%p", from));
- if (from->table->const_table)
- continue;
+ ++table_count;
if (from->table->part_info)
{
DBUG_PRINT("info",("spider partition handler"));
@@ -1633,17 +1440,11 @@ group_by_handler *spider_create_group_by_handler(
}
} while ((from = from->next_local));
+ if (!(table_holder= spider_create_table_holder(table_count)))
+ DBUG_RETURN(NULL);
+
table_idx = 0;
from = query->from;
- while (from && from->table->const_table)
- {
- from = from->next_local;
- }
- if (!from)
- {
- /* all tables are const_table */
- DBUG_RETURN(NULL);
- }
if (from->table->part_info)
{
partition_info *part_info = from->table->part_info;
@@ -1657,6 +1458,11 @@ group_by_handler *spider_create_group_by_handler(
share = spider->share;
spider->idx_for_direct_join = table_idx;
++table_idx;
+ if (!spider_add_table_holder(spider, table_holder))
+ {
+ DBUG_PRINT("info",("spider can not add a table"));
+ goto skip_free_table_holder;
+ }
memset(dbton_bitmap, 0, spider_bitmap_size(SPIDER_DBTON_SIZE));
for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count)
{
@@ -1670,8 +1476,6 @@ group_by_handler *spider_create_group_by_handler(
}
while ((from = from->next_local))
{
- if (from->table->const_table)
- continue;
if (from->table->part_info)
{
partition_info *part_info = from->table->part_info;
@@ -1685,6 +1489,11 @@ group_by_handler *spider_create_group_by_handler(
share = spider->share;
spider->idx_for_direct_join = table_idx;
++table_idx;
+ if (!spider_add_table_holder(spider, table_holder))
+ {
+ DBUG_PRINT("info",("spider can not add a table"));
+ goto skip_free_table_holder;
+ }
memset(dbton_bitmap_tmp, 0, spider_bitmap_size(SPIDER_DBTON_SIZE));
for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count)
{
@@ -1705,8 +1514,6 @@ group_by_handler *spider_create_group_by_handler(
from = query->from;
do {
- if (from->table->const_table)
- continue;
if (from->table->part_info)
{
partition_info *part_info = from->table->part_info;
@@ -1734,10 +1541,9 @@ group_by_handler *spider_create_group_by_handler(
{
fields_arg = new spider_fields();
if (!fields_arg)
- {
- DBUG_RETURN(NULL);
- }
+ goto skip_free_table_holder;
}
+ fields_arg->set_table_holder(table_holder, table_count);
keep_going = TRUE;
it.init(*query->select);
while ((item = it++))
@@ -1844,21 +1650,9 @@ group_by_handler *spider_create_group_by_handler(
}
}
if (!find_dbton)
- {
- DBUG_RETURN(NULL);
- }
-
- if (fields->create_table_holder(table_idx))
- {
- delete fields;
- DBUG_RETURN(NULL);
- }
+ goto skip_free_table_holder;
from = query->from;
- while (from->table->const_table)
- {
- from = from->next_local;
- }
if (from->table->part_info)
{
partition_info *part_info = from->table->part_info;
@@ -1879,17 +1673,10 @@ group_by_handler *spider_create_group_by_handler(
}
DBUG_PRINT("info",("spider s->db=%s", from->table->s->db.str));
DBUG_PRINT("info",("spider s->table_name=%s", from->table->s->table_name.str));
- if (!fields->add_table(spider))
- {
- DBUG_PRINT("info",("spider can not add a table"));
- delete fields;
- DBUG_RETURN(NULL);
- }
if (spider->dml_init())
{
DBUG_PRINT("info",("spider can not init for dml"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
@@ -1909,8 +1696,7 @@ group_by_handler *spider_create_group_by_handler(
DBUG_PRINT("info",("spider direct_join does not support with lock tables yet"));
if (lock_mode)
{
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
continue;
}
@@ -1918,26 +1704,21 @@ group_by_handler *spider_create_group_by_handler(
share->access_balances[spider->conn_link_idx[roop_count]]))
{
DBUG_PRINT("info",("spider can not create conn_holder"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
if (fields->add_link_idx(conn->conn_holder_for_direct_join, spider, roop_count))
{
DBUG_PRINT("info",("spider can not create link_idx_holder"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
}
if (!fields->has_conn_holder())
{
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
while ((from = from->next_local))
{
- if (from->table->const_table)
- continue;
fields->clear_conn_holder_from_conn();
if (from->table->part_info)
@@ -1951,19 +1732,12 @@ group_by_handler *spider_create_group_by_handler(
spider = (ha_spider *) from->table->file;
}
share = spider->share;
- if (!fields->add_table(spider))
- {
- DBUG_PRINT("info",("spider can not add a table"));
- delete fields;
- DBUG_RETURN(NULL);
- }
DBUG_PRINT("info",("spider s->db=%s", from->table->s->db.str));
DBUG_PRINT("info",("spider s->table_name=%s", from->table->s->table_name.str));
if (spider->dml_init())
{
DBUG_PRINT("info",("spider can not init for dml"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
@@ -1982,17 +1756,13 @@ group_by_handler *spider_create_group_by_handler(
DBUG_PRINT("info",("spider connection %p can not be used for this query with locking",
conn));
if (lock_mode)
- {
- delete fields;
- DBUG_RETURN(NULL);
- }
+ goto skip_free_fields;
continue;
}
if (fields->add_link_idx(conn->conn_holder_for_direct_join, spider, roop_count))
{
DBUG_PRINT("info",("spider can not create link_idx_holder"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
}
@@ -2001,30 +1771,20 @@ group_by_handler *spider_create_group_by_handler(
if (lock_mode)
{
DBUG_PRINT("info",("spider some connections can not be used for this query with locking"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
}
if (!fields->has_conn_holder())
{
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
}
- if (!fields->all_query_fields_are_query_table_members())
- {
- DBUG_PRINT("info", ("spider found a query field that is not a query table member"));
- delete fields;
- DBUG_RETURN(NULL);
- }
-
fields->check_support_dbton(dbton_bitmap);
if (!fields->has_conn_holder())
{
DBUG_PRINT("info",("spider all chosen connections can't match dbton_id"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
/* choose a connection */
@@ -2036,16 +1796,14 @@ group_by_handler *spider_create_group_by_handler(
if (fields->make_link_idx_chain(tgt_link_status))
{
DBUG_PRINT("info",("spider can not create link_idx_chain"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
/* choose link_id */
if (fields->check_link_ok_chain())
{
DBUG_PRINT("info",("spider do not have link ok status"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
fields->set_first_link_idx();
@@ -2053,8 +1811,7 @@ group_by_handler *spider_create_group_by_handler(
if (!(group_by_handler = new spider_group_by_handler(thd, query, fields)))
{
DBUG_PRINT("info",("spider can't create group_by_handler"));
- delete fields;
- DBUG_RETURN(NULL);
+ goto skip_free_fields;
}
query->distinct = FALSE;
query->where = NULL;
@@ -2062,4 +1819,10 @@ group_by_handler *spider_create_group_by_handler(
query->having = NULL;
query->order_by = NULL;
DBUG_RETURN(group_by_handler);
+
+skip_free_fields:
+ delete fields;
+skip_free_table_holder:
+ spider_free(spider_current_trx, table_holder, MYF(0));
+ DBUG_RETURN(NULL);
}
diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h
index 4763cd89..0f61984e 100644
--- a/storage/spider/spd_include.h
+++ b/storage/spider/spd_include.h
@@ -168,6 +168,279 @@ typedef start_new_trans *SPIDER_Open_tables_backup;
#define SPIDER_MEM_CALC_LIST_NUM 314
#define SPIDER_CONN_META_BUF_LEN 64
+/*
+ IDs for spider mem alloc functions, including
+ - spider_alloc_calc_mem_init()
+ - spider_string::init_calc_mem()
+ - spider_malloc()
+ - spider_bulk_alloc_mem()
+ - spider_bulk_malloc()
+ In the format of
+ SPD_MID_<CALLSITE_FUNC_NAME_SANS_SPIDER_PREFIX>_<NO>
+*/
+enum spider_malloc_id {
+ SPD_MID_CHECK_HS_PK_UPDATE_1,
+ SPD_MID_COPY_TABLES_BODY_1,
+ SPD_MID_COPY_TABLES_BODY_2,
+ SPD_MID_COPY_TABLES_BODY_3,
+ SPD_MID_COPY_TABLES_BODY_4,
+ SPD_MID_COPY_TABLES_BODY_5,
+ SPD_MID_CREATE_CONN_1,
+ SPD_MID_CREATE_CONN_2,
+ SPD_MID_CREATE_CONN_3,
+ SPD_MID_CREATE_CONN_4,
+ SPD_MID_CREATE_CONN_5,
+ SPD_MID_CREATE_CONN_6,
+ SPD_MID_CREATE_CONN_KEYS_1,
+ SPD_MID_CREATE_CONN_THREAD_1,
+ SPD_MID_CREATE_LONGLONG_LIST_1,
+ SPD_MID_CREATE_LONG_LIST_1,
+ SPD_MID_CREATE_MON_THREADS_1,
+ SPD_MID_CREATE_MON_THREADS_2,
+ SPD_MID_CREATE_SHARE_1,
+ SPD_MID_CREATE_SHARE_2,
+ SPD_MID_CREATE_SPIDER_OBJECT_FOR_SHARE_1,
+ SPD_MID_CREATE_SPIDER_OBJECT_FOR_SHARE_2,
+ SPD_MID_CREATE_STRING_1,
+ SPD_MID_CREATE_STRING_LIST_1,
+ SPD_MID_CREATE_TABLE_HOLDER_1,
+ SPD_MID_CREATE_TABLE_NAME_STRING_1,
+ SPD_MID_CREATE_TRX_ALTER_TABLE_1,
+ SPD_MID_CREATE_TRX_HA_1,
+ SPD_MID_DB_CONN_QUEUE_ACTION_1,
+ SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_1,
+ SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_2,
+ SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_3,
+ SPD_MID_DB_HANDLERSOCKET_APPEND_REQUEST_KEY_1,
+ SPD_MID_DB_HANDLERSOCKET_EXEC_QUERY_1,
+ SPD_MID_DB_HANDLERSOCKET_INIT_1,
+ SPD_MID_DB_HANDLERSOCKET_RESULT_FETCH_ROW_FROM_TMP_TABLE_1,
+ SPD_MID_DB_HANDLERSOCKET_RESULT_FETCH_ROW_FROM_TMP_TABLE_2,
+ SPD_MID_DB_HANDLERSOCKET_ROW_APPEND_ESCAPED_TO_STR_1,
+ SPD_MID_DB_HANDLERSOCKET_ROW_CLONE_1,
+ SPD_MID_DB_HANDLERSOCKET_ROW_STORE_TO_FIELD_1,
+ SPD_MID_DB_HANDLERSOCKET_UTIL_APPEND_COLUMN_VALUE_1,
+ SPD_MID_DB_HANDLERSOCKET_UTIL_OPEN_ITEM_FUNC_1,
+ SPD_MID_DB_HANDLERSOCKET_UTIL_OPEN_ITEM_FUNC_2,
+ SPD_MID_DB_HANDLERSOCKET_UTIL_OPEN_ITEM_FUNC_3,
+ SPD_MID_DB_HS_STRING_REF_BUFFER_INIT_1,
+ SPD_MID_DB_HS_STR_BUFFER_ADD_1,
+ SPD_MID_DB_HS_STR_BUFFER_ADD_2,
+ SPD_MID_DB_HS_STR_BUFFER_INIT_1,
+ SPD_MID_DB_INIT_1,
+ SPD_MID_DB_INIT_10,
+ SPD_MID_DB_INIT_11,
+ SPD_MID_DB_INIT_12,
+ SPD_MID_DB_INIT_2,
+ SPD_MID_DB_INIT_3,
+ SPD_MID_DB_INIT_4,
+ SPD_MID_DB_INIT_5,
+ SPD_MID_DB_INIT_6,
+ SPD_MID_DB_INIT_7,
+ SPD_MID_DB_INIT_8,
+ SPD_MID_DB_INIT_9,
+ SPD_MID_DB_MARIADB_UTIL_APPEND_COLUMN_VALUE_1,
+ SPD_MID_DB_MARIADB_UTIL_APPEND_COLUMN_VALUE_2,
+ SPD_MID_DB_MBASE_EXEC_QUERY_1,
+ SPD_MID_DB_MBASE_EXEC_QUERY_2,
+ SPD_MID_DB_MBASE_INIT_1,
+ SPD_MID_DB_MBASE_INIT_2,
+ SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_1,
+ SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_2,
+ SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_3,
+ SPD_MID_DB_MBASE_ROW_APPEND_ESCAPED_TO_STR_1,
+ SPD_MID_DB_MBASE_ROW_CLONE_1,
+ SPD_MID_DB_MBASE_SET_LOOP_CHECK_1,
+ SPD_MID_DB_MBASE_SET_SQL_MODE_1,
+ SPD_MID_DB_MBASE_SET_TIME_ZONE_1,
+ SPD_MID_DB_MBASE_SET_WAIT_TIMEOUT_1,
+ SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_1,
+ SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_2,
+ SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_3,
+ SPD_MID_DB_MBASE_XA_COMMIT_1,
+ SPD_MID_DB_MBASE_XA_END_1,
+ SPD_MID_DB_MBASE_XA_PREPARE_1,
+ SPD_MID_DB_MBASE_XA_ROLLBACK_1,
+ SPD_MID_DB_MYSQL_UTIL_APPEND_COLUMN_VALUE_1,
+ SPD_MID_DB_MYSQL_UTIL_APPEND_COLUMN_VALUE_2,
+ SPD_MID_DB_OPEN_ITEM_INT_1,
+ SPD_MID_DB_OPEN_ITEM_STRING_1,
+ SPD_MID_DB_ORACLE_EXEC_QUERY_1,
+ SPD_MID_DB_ORACLE_GET_ERROR_1,
+ SPD_MID_DB_ORACLE_INIT_1,
+ SPD_MID_DB_ORACLE_INIT_2,
+ SPD_MID_DB_ORACLE_RESULT_FETCH_ROW_FROM_TMP_TABLE_1,
+ SPD_MID_DB_ORACLE_RESULT_FETCH_ROW_FROM_TMP_TABLE_2,
+ SPD_MID_DB_ORACLE_RESULT_FETCH_ROW_FROM_TMP_TABLE_3,
+ SPD_MID_DB_ORACLE_ROW_APPEND_ESCAPED_TO_STR_1,
+ SPD_MID_DB_ORACLE_ROW_INIT_1,
+ SPD_MID_DB_ORACLE_ROW_INIT_2,
+ SPD_MID_DB_ORACLE_UTIL_APPEND_COLUMN_VALUE_1,
+ SPD_MID_DB_ORACLE_UTIL_APPEND_COLUMN_VALUE_2,
+ SPD_MID_DB_ORACLE_UTIL_OPEN_ITEM_FUNC_1,
+ SPD_MID_DB_ORACLE_UTIL_OPEN_ITEM_FUNC_2,
+ SPD_MID_DB_ORACLE_UTIL_OPEN_ITEM_FUNC_3,
+ SPD_MID_DB_QUERY_1,
+ SPD_MID_DB_STORE_RESULT_1,
+ SPD_MID_DB_STORE_RESULT_2,
+ SPD_MID_DB_STORE_RESULT_3,
+ SPD_MID_DB_STORE_RESULT_4,
+ SPD_MID_DB_STORE_RESULT_5,
+ SPD_MID_DB_STORE_RESULT_FOR_REUSE_CURSOR_1,
+ SPD_MID_DB_UDF_COPY_TABLES_1,
+ SPD_MID_DB_UDF_PING_TABLE_1,
+ SPD_MID_DB_UDF_PING_TABLE_2,
+ SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_1,
+ SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_2,
+ SPD_MID_DB_UDF_PING_TABLE_MON_NEXT_1,
+ SPD_MID_DIRECT_SQL_BODY_1,
+ SPD_MID_DIRECT_SQL_INIT_BODY_1,
+ SPD_MID_DISCOVER_TABLE_STRUCTURE_1,
+ SPD_MID_FIELDS_CREATE_CONN_HOLDER_1,
+ SPD_MID_FIELDS_CREATE_LINK_IDX_CHAIN_1,
+ SPD_MID_FIELDS_CREATE_LINK_IDX_HOLDER_1,
+ SPD_MID_GET_INIT_ERROR_TABLE_1,
+ SPD_MID_GET_LGTM_TBLHND_SHARE_1,
+ SPD_MID_GET_PING_TABLE_MON_1,
+ SPD_MID_GET_PING_TABLE_TGT_1,
+ SPD_MID_GET_PT_SHARE_1,
+ SPD_MID_GET_PT_SHARE_2,
+ SPD_MID_GET_SHARE_1,
+ SPD_MID_GET_SHARE_2,
+ SPD_MID_GET_TRX_1,
+ SPD_MID_GET_TRX_10,
+ SPD_MID_GET_TRX_2,
+ SPD_MID_GET_TRX_3,
+ SPD_MID_GET_TRX_4,
+ SPD_MID_GET_TRX_5,
+ SPD_MID_GET_TRX_6,
+ SPD_MID_GET_TRX_7,
+ SPD_MID_GET_TRX_8,
+ SPD_MID_GET_TRX_9,
+ SPD_MID_HANDLERSOCKET_HANDLER_INIT_1,
+ SPD_MID_HANDLERSOCKET_HANDLER_INIT_2,
+ SPD_MID_HANDLERSOCKET_HANDLER_SPIDER_HANDLERSOCKET_HANDLER_1,
+ SPD_MID_HANDLERSOCKET_SHARE_CREATE_COLUMN_NAME_STR_1,
+ SPD_MID_HANDLERSOCKET_SHARE_CREATE_TABLE_NAMES_STR_1,
+ SPD_MID_HANDLERSOCKET_SHARE_CREATE_TABLE_NAMES_STR_2,
+ SPD_MID_HANDLERSOCKET_SHARE_CREATE_TABLE_NAMES_STR_3,
+ SPD_MID_HANDLERSOCKET_SHARE_INIT_1,
+ SPD_MID_HANDLERSOCKET_SHARE_SPIDER_HANDLERSOCKET_SHARE_1,
+ SPD_MID_HA_SPIDER_COND_PUSH_1,
+ SPD_MID_HA_SPIDER_CREATE_1,
+ SPD_MID_HA_SPIDER_CREATE_2,
+ SPD_MID_HA_SPIDER_CREATE_BULK_ACCESS_LINK_1,
+ SPD_MID_HA_SPIDER_FT_INIT_EXT_1,
+ SPD_MID_HA_SPIDER_HA_SPIDER_1,
+ SPD_MID_HA_SPIDER_HA_SPIDER_2,
+ SPD_MID_HA_SPIDER_INFO_PUSH_1,
+ SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_1,
+ SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_2,
+ SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_3,
+ SPD_MID_HA_SPIDER_OPEN_1,
+ SPD_MID_HA_SPIDER_OPEN_2,
+ SPD_MID_HA_SPIDER_OPEN_3,
+ SPD_MID_HA_SPIDER_OPEN_4,
+ SPD_MID_HA_SPIDER_OPEN_5,
+ SPD_MID_HA_SPIDER_OPEN_6,
+ SPD_MID_HA_SPIDER_OPEN_7,
+ SPD_MID_INCREASE_LONGLONG_LIST_1,
+ SPD_MID_INCREASE_LONG_LIST_1,
+ SPD_MID_INCREASE_NULL_STRING_LIST_1,
+ SPD_MID_INCREASE_STRING_LIST_1,
+ SPD_MID_MBASE_COPY_TABLE_INIT_1,
+ SPD_MID_MBASE_HANDLER_APPEND_KEY_COLUMN_TYPES_1,
+ SPD_MID_MBASE_HANDLER_APPEND_MATCH_AGAINST_1,
+ SPD_MID_MBASE_HANDLER_APPEND_TMP_TABLE_AND_SQL_FOR_BKA_1,
+ SPD_MID_MBASE_HANDLER_APPEND_UNION_TABLE_AND_SQL_FOR_BKA_1,
+ SPD_MID_MBASE_HANDLER_INIT_1,
+ SPD_MID_MBASE_HANDLER_INIT_2,
+ SPD_MID_MBASE_HANDLER_INIT_3,
+ SPD_MID_MBASE_HANDLER_INIT_4,
+ SPD_MID_MBASE_HANDLER_INIT_5,
+ SPD_MID_MBASE_HANDLER_INIT_6,
+ SPD_MID_MBASE_HANDLER_INIT_7,
+ SPD_MID_MBASE_HANDLER_INIT_8,
+ SPD_MID_MBASE_HANDLER_INIT_9,
+ SPD_MID_MBASE_HANDLER_INIT_UNION_TABLE_NAME_POS_1,
+ SPD_MID_MBASE_HANDLER_SET_SQL_FOR_EXEC_1,
+ SPD_MID_MBASE_HANDLER_SET_UNION_TABLE_NAME_POS_1,
+ SPD_MID_MBASE_HANDLER_SPIDER_MBASE_HANDLER_1,
+ SPD_MID_MBASE_SHARE_APPEND_SHOW_INDEX_1,
+ SPD_MID_MBASE_SHARE_APPEND_SHOW_INDEX_2,
+ SPD_MID_MBASE_SHARE_APPEND_SHOW_RECORDS_1,
+ SPD_MID_MBASE_SHARE_APPEND_SHOW_TABLE_STATUS_1,
+ SPD_MID_MBASE_SHARE_APPEND_SHOW_TABLE_STATUS_2,
+ SPD_MID_MBASE_SHARE_CREATE_COLUMN_NAME_STR_1,
+ SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_1,
+ SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_2,
+ SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_3,
+ SPD_MID_MBASE_SHARE_DISCOVER_TABLE_STRUCTURE_1,
+ SPD_MID_MBASE_SHARE_INIT_1,
+ SPD_MID_MBASE_SHARE_INIT_2,
+ SPD_MID_MBASE_SHARE_INIT_3,
+ SPD_MID_MBASE_SHARE_INIT_4,
+ SPD_MID_MBASE_SHARE_SPIDER_MBASE_SHARE_1,
+ SPD_MID_OPEN_ALL_TABLES_1,
+ SPD_MID_OPEN_SYS_TABLE_1,
+ SPD_MID_ORACLE_COPY_TABLE_COPY_ROWS_1,
+ SPD_MID_ORACLE_COPY_TABLE_COPY_ROWS_2,
+ SPD_MID_ORACLE_COPY_TABLE_COPY_ROWS_3,
+ SPD_MID_ORACLE_COPY_TABLE_COPY_ROWS_4,
+ SPD_MID_ORACLE_COPY_TABLE_INIT_1,
+ SPD_MID_ORACLE_COPY_TABLE_INIT_2,
+ SPD_MID_ORACLE_HANDLER_APPEND_KEY_COLUMN_TYPES_1,
+ SPD_MID_ORACLE_HANDLER_APPEND_MATCH_AGAINST_1,
+ SPD_MID_ORACLE_HANDLER_APPEND_TMP_TABLE_AND_SQL_FOR_BKA_1,
+ SPD_MID_ORACLE_HANDLER_APPEND_UNION_TABLE_AND_SQL_FOR_BKA_1,
+ SPD_MID_ORACLE_HANDLER_INIT_1,
+ SPD_MID_ORACLE_HANDLER_INIT_2,
+ SPD_MID_ORACLE_HANDLER_INIT_3,
+ SPD_MID_ORACLE_HANDLER_INIT_4,
+ SPD_MID_ORACLE_HANDLER_INIT_5,
+ SPD_MID_ORACLE_HANDLER_INIT_6,
+ SPD_MID_ORACLE_HANDLER_INIT_7,
+ SPD_MID_ORACLE_HANDLER_INIT_8,
+ SPD_MID_ORACLE_HANDLER_INIT_9,
+ SPD_MID_ORACLE_HANDLER_INIT_UNION_TABLE_NAME_POS_1,
+ SPD_MID_ORACLE_HANDLER_SET_SQL_FOR_EXEC_1,
+ SPD_MID_ORACLE_HANDLER_SET_UNION_TABLE_NAME_POS_1,
+ SPD_MID_ORACLE_HANDLER_SPIDER_ORACLE_HANDLER_1,
+ SPD_MID_ORACLE_SHARE_APPEND_SHOW_AUTOINC_1,
+ SPD_MID_ORACLE_SHARE_APPEND_SHOW_INDEX_1,
+ SPD_MID_ORACLE_SHARE_APPEND_SHOW_INDEX_2,
+ SPD_MID_ORACLE_SHARE_APPEND_SHOW_LAST_INSERT_ID_1,
+ SPD_MID_ORACLE_SHARE_APPEND_SHOW_LAST_INSERT_ID_2,
+ SPD_MID_ORACLE_SHARE_APPEND_SHOW_RECORDS_1,
+ SPD_MID_ORACLE_SHARE_APPEND_SHOW_TABLE_STATUS_1,
+ SPD_MID_ORACLE_SHARE_APPEND_SHOW_TABLE_STATUS_2,
+ SPD_MID_ORACLE_SHARE_CREATE_COLUMN_NAME_STR_1,
+ SPD_MID_ORACLE_SHARE_CREATE_TABLE_NAMES_STR_1,
+ SPD_MID_ORACLE_SHARE_CREATE_TABLE_NAMES_STR_2,
+ SPD_MID_ORACLE_SHARE_CREATE_TABLE_NAMES_STR_3,
+ SPD_MID_ORACLE_SHARE_INIT_1,
+ SPD_MID_ORACLE_SHARE_INIT_2,
+ SPD_MID_ORACLE_SHARE_INIT_3,
+ SPD_MID_ORACLE_SHARE_INIT_4,
+ SPD_MID_ORACLE_SHARE_SPIDER_ORACLE_SHARE_1,
+ SPD_MID_PARSE_CONNECT_INFO_1,
+ SPD_MID_PING_TABLE_BODY_1,
+ SPD_MID_PING_TABLE_BODY_2,
+ SPD_MID_PING_TABLE_INIT_BODY_1,
+ SPD_MID_PING_TABLE_MON_FROM_TABLE_1,
+ SPD_MID_RELEASE_PING_TABLE_MON_LIST_1,
+ SPD_MID_TRX_ANOTHER_LOCK_TABLES_1,
+ SPD_MID_UDF_COPY_TABLES_CREATE_TABLE_LIST_1,
+ SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_1,
+ SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_2,
+ SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_3,
+ SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_4,
+ SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_KEY_1,
+ SPD_MID_UDF_DIRECT_SQL_CREATE_TABLE_LIST_1,
+ SPD_MID_UDF_DIRECT_SQL_CREATE_TABLE_LIST_2,
+ SPD_MID_UDF_GET_COPY_TGT_TABLES_1
+};
+
#define SPIDER_BACKUP_DASTATUS \
bool da_status; if (thd) da_status = thd->is_error(); else da_status = FALSE;
#define SPIDER_RESTORE_DASTATUS \
@@ -518,7 +791,6 @@ typedef struct st_spider_conn
SPIDER_CONN_LOOP_CHECK *loop_check_ignored_first;
SPIDER_CONN_LOOP_CHECK *loop_check_ignored_last;
SPIDER_CONN_LOOP_CHECK *loop_check_meraged_first;
- SPIDER_CONN_LOOP_CHECK *loop_check_meraged_last;
} SPIDER_CONN;
typedef struct st_spider_lgtm_tblhnd_share
@@ -934,6 +1206,7 @@ typedef struct st_spider_share
uint *tgt_pk_names_lengths;
uint *tgt_sequence_names_lengths;
uint *conn_keys_lengths;
+ /* The index in `spider_dbton' of each data node link. */
uint *sql_dbton_ids;
uint server_names_charlen;
@@ -1003,10 +1276,16 @@ typedef struct st_spider_share
uchar dbton_bitmap[spider_bitmap_size(SPIDER_DBTON_SIZE)];
spider_db_share *dbton_share[SPIDER_DBTON_SIZE];
uint use_dbton_count;
+ /* Actual size is `use_dbton_count'. Values are the indices of item
+ in `spider_dbton'. */
uint use_dbton_ids[SPIDER_DBTON_SIZE];
+ /* Inverse map of `use_dbton_ids'. */
uint dbton_id_to_seq[SPIDER_DBTON_SIZE];
uint use_sql_dbton_count;
+ /* Actual size is `use_sql_dbton_count'. Values are the indices of
+ item in `spider_dbton'. */
uint use_sql_dbton_ids[SPIDER_DBTON_SIZE];
+ /* Inverse map of `use_sql_dbton_ids'. */
uint sql_dbton_id_to_seq[SPIDER_DBTON_SIZE];
SPIDER_ALTER_TABLE alter_table;
diff --git a/storage/spider/spd_init_query.h b/storage/spider/spd_init_query.h
index fdf6b22f..35a250c7 100644
--- a/storage/spider/spd_init_query.h
+++ b/storage/spider/spd_init_query.h
@@ -21,6 +21,9 @@
static LEX_STRING spider_init_queries[] = {
{C_STRING_WITH_LEN(
+ "SET @@SQL_MODE = REPLACE(@@SQL_MODE, 'ORACLE', '');"
+ )},
+ {C_STRING_WITH_LEN(
"create table if not exists mysql.spider_xa("
" format_id int not null default 0,"
" gtrid_length int not null default 0,"
@@ -694,6 +697,46 @@ static LEX_STRING spider_init_queries[] = {
" algorithm=copy, lock=shared;"
)},
{C_STRING_WITH_LEN(
+ "alter table mysql.spider_link_mon_servers"
+ " add column if not exists filedsn text default null after dsn,"
+ " algorithm=copy, lock=shared;"
+ )},
+ {C_STRING_WITH_LEN(
+ "alter table mysql.spider_tables"
+ " add column if not exists filedsn text default null after dsn,"
+ " algorithm=copy, lock=shared;"
+ )},
+ {C_STRING_WITH_LEN(
+ "alter table mysql.spider_xa_failed_log"
+ " add column if not exists filedsn text default null after dsn,"
+ " algorithm=copy, lock=shared;"
+ )},
+ {C_STRING_WITH_LEN(
+ "alter table mysql.spider_xa_member"
+ " add column if not exists filedsn text default null after dsn,"
+ " algorithm=copy, lock=shared;"
+ )},
+ {C_STRING_WITH_LEN(
+ "alter table mysql.spider_link_mon_servers"
+ " add column if not exists driver char(64) default null after filedsn,"
+ " algorithm=copy, lock=shared;"
+ )},
+ {C_STRING_WITH_LEN(
+ "alter table mysql.spider_tables"
+ " add column if not exists driver char(64) default null after filedsn,"
+ " algorithm=copy, lock=shared;"
+ )},
+ {C_STRING_WITH_LEN(
+ "alter table mysql.spider_xa_failed_log"
+ " add column if not exists driver char(64) default null after filedsn,"
+ " algorithm=copy, lock=shared;"
+ )},
+ {C_STRING_WITH_LEN(
+ "alter table mysql.spider_xa_member"
+ " add column if not exists driver char(64) default null after filedsn,"
+ " algorithm=copy, lock=shared;"
+ )},
+ {C_STRING_WITH_LEN(
"set @win_plugin := IF(@@version_compile_os like 'Win%', 1, 0);"
)},
/* Install UDFs. If udf is not initialised, then install by
diff --git a/storage/spider/spd_param.cc b/storage/spider/spd_param.cc
index 2328cce7..d86e8532 100644
--- a/storage/spider/spd_param.cc
+++ b/storage/spider/spd_param.cc
@@ -109,59 +109,61 @@ extern volatile ulonglong spider_mon_table_cache_version_req;
MYSQL_SYSVAR_NAME(param_name).def_val; \
}
-static int spider_direct_update(THD *thd, SHOW_VAR *var, char *buff)
+extern handlerton *spider_hton_ptr;
+static void spider_trx_status_var(THD *thd, SHOW_VAR *var, void *buff,
+ ulonglong SPIDER_TRX::*counter)
{
- int error_num = 0;
- SPIDER_TRX *trx;
DBUG_ENTER("spider_direct_update");
var->type = SHOW_LONGLONG;
- if ((trx = spider_get_trx(thd, TRUE, &error_num)))
- var->value = (char *) &trx->direct_update_count;
- DBUG_RETURN(error_num);
+ var->value= buff;
+ if (thd != current_thd)
+ mysql_mutex_lock(&thd->LOCK_thd_data);
+ SPIDER_TRX *trx = (SPIDER_TRX*)thd_get_ha_data(thd, spider_hton_ptr);
+ *(ulonglong*)buff= trx ? trx->*counter : 0;
+ if (thd != current_thd)
+ mysql_mutex_unlock(&thd->LOCK_thd_data);
+ DBUG_VOID_RETURN;
}
-static int spider_direct_delete(THD *thd, SHOW_VAR *var, char *buff)
+
+static int spider_direct_update(THD *thd, SHOW_VAR *var, void *buff,
+ system_status_var *, enum_var_type)
+{
+ DBUG_ENTER("spider_direct_update");
+ spider_trx_status_var(thd, var, buff, &SPIDER_TRX::direct_update_count);
+ DBUG_RETURN(0);
+}
+
+static int spider_direct_delete(THD *thd, SHOW_VAR *var, void *buff,
+ system_status_var *, enum_var_type)
{
- int error_num = 0;
- SPIDER_TRX *trx;
DBUG_ENTER("spider_direct_delete");
- var->type = SHOW_LONGLONG;
- if ((trx = spider_get_trx(thd, TRUE, &error_num)))
- var->value = (char *) &trx->direct_delete_count;
- DBUG_RETURN(error_num);
+ spider_trx_status_var(thd, var, buff, &SPIDER_TRX::direct_delete_count);
+ DBUG_RETURN(0);
}
-static int spider_direct_order_limit(THD *thd, SHOW_VAR *var, char *buff)
+static int spider_direct_order_limit(THD *thd, SHOW_VAR *var, void *buff,
+ system_status_var *, enum_var_type)
{
- int error_num = 0;
- SPIDER_TRX *trx;
DBUG_ENTER("spider_direct_order_limit");
- var->type = SHOW_LONGLONG;
- if ((trx = spider_get_trx(thd, TRUE, &error_num)))
- var->value = (char *) &trx->direct_order_limit_count;
- DBUG_RETURN(error_num);
+ spider_trx_status_var(thd, var, buff, &SPIDER_TRX::direct_order_limit_count);
+ DBUG_RETURN(0);
}
-static int spider_direct_aggregate(THD *thd, SHOW_VAR *var, char *buff)
+static int spider_direct_aggregate(THD *thd, SHOW_VAR *var, void *buff,
+ system_status_var *, enum_var_type)
{
- int error_num = 0;
- SPIDER_TRX *trx;
DBUG_ENTER("spider_direct_aggregate");
- var->type = SHOW_LONGLONG;
- if ((trx = spider_get_trx(thd, TRUE, &error_num)))
- var->value = (char *) &trx->direct_aggregate_count;
- DBUG_RETURN(error_num);
+ spider_trx_status_var(thd, var, buff, &SPIDER_TRX::direct_aggregate_count);
+ DBUG_RETURN(0);
}
-static int spider_parallel_search(THD *thd, SHOW_VAR *var, char *buff)
+static int spider_parallel_search(THD *thd, SHOW_VAR *var, void *buff,
+ system_status_var *, enum_var_type)
{
- int error_num = 0;
- SPIDER_TRX *trx;
DBUG_ENTER("spider_parallel_search");
- var->type = SHOW_LONGLONG;
- if ((trx = spider_get_trx(thd, TRUE, &error_num)))
- var->value = (char *) &trx->parallel_search_count;
- DBUG_RETURN(error_num);
+ spider_trx_status_var(thd, var, buff, &SPIDER_TRX::parallel_search_count);
+ DBUG_RETURN(0);
}
struct st_mysql_show_var spider_status_variables[] =
@@ -2217,7 +2219,7 @@ static MYSQL_SYSVAR_UINT(
"Static thread count of table sts",
NULL,
NULL,
- 10,
+ 1,
1,
4294967295U,
0
@@ -2236,7 +2238,7 @@ static MYSQL_SYSVAR_UINT(
"Static thread count of table crd",
NULL,
NULL,
- 10,
+ 1,
1,
4294967295U,
0
diff --git a/storage/spider/spd_ping_table.cc b/storage/spider/spd_ping_table.cc
index b331a9fe..722b4cca 100644
--- a/storage/spider/spd_ping_table.cc
+++ b/storage/spider/spd_ping_table.cc
@@ -219,7 +219,7 @@ int spider_release_ping_table_mon_list(
}
spider_string conv_name_str(buf, conv_name_length + link_idx_str_length + 1,
system_charset_info);
- conv_name_str.init_calc_mem(134);
+ conv_name_str.init_calc_mem(SPD_MID_RELEASE_PING_TABLE_MON_LIST_1);
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);
@@ -325,7 +325,7 @@ create_table_mon:
do {
if (!(table_mon = (SPIDER_TABLE_MON *)
- spider_bulk_malloc(spider_current_trx, 35, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_GET_PING_TABLE_MON_1, MYF(MY_WME | MY_ZEROFILL),
&table_mon, (uint) (sizeof(SPIDER_TABLE_MON)),
&tmp_share, (uint) (sizeof(SPIDER_SHARE)),
&tmp_connect_info,
@@ -446,7 +446,7 @@ SPIDER_TABLE_MON_LIST *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),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_GET_PING_TABLE_TGT_1, MYF(MY_WME | MY_ZEROFILL),
&table_mon_list, (uint) (sizeof(SPIDER_TABLE_MON_LIST)),
&tmp_share, (uint) (sizeof(SPIDER_SHARE)),
&tmp_connect_info,
@@ -1024,8 +1024,8 @@ long long spider_ping_table_body(
int static_link_id_length = 0;
bool get_lock = FALSE, status_changed_to_ng = FALSE;
DBUG_ENTER("spider_ping_table_body");
- conv_name.init_calc_mem(135);
- tmp_str.init_calc_mem(247);
+ conv_name.init_calc_mem(SPD_MID_PING_TABLE_BODY_1);
+ tmp_str.init_calc_mem(SPD_MID_PING_TABLE_BODY_2);
conv_name.length(0);
server_id = global_system_variables.server_id;
if (
@@ -1463,7 +1463,7 @@ my_bool spider_ping_table_init_body(
}
if (!(mon_table_result = (SPIDER_MON_TABLE_RESULT *)
- spider_malloc(spider_current_trx, 11, sizeof(SPIDER_MON_TABLE_RESULT),
+ spider_malloc(spider_current_trx, SPD_MID_PING_TABLE_INIT_BODY_1, sizeof(SPIDER_MON_TABLE_RESULT),
MYF(MY_WME | MY_ZEROFILL)))
) {
strcpy(message, "spider_ping_table() out of memory");
@@ -1606,7 +1606,7 @@ int spider_ping_table_mon_from_table(
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);
- conv_name_str.init_calc_mem(136);
+ conv_name_str.init_calc_mem(SPD_MID_PING_TABLE_MON_FROM_TABLE_1);
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);
diff --git a/storage/spider/spd_sys_table.cc b/storage/spider/spd_sys_table.cc
index a0cf104d..912e02a7 100644
--- a/storage/spider/spd_sys_table.cc
+++ b/storage/spider/spd_sys_table.cc
@@ -325,38 +325,6 @@ TABLE *spider_open_sys_table(
}
break;
}
- if (!memcmp(table_name, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR,
- SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN))
- {
- DBUG_PRINT("info",("spider checking for SYS_TABLE_STS"));
- if (table->s->fields != SPIDER_SYS_TABLE_STS_COL_CNT)
- {
- spider_close_sys_table(thd, table, open_tables_backup, need_lock);
- table = NULL;
- my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM,
- ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0),
- SPIDER_SYS_TABLE_STS_TABLE_NAME_STR);
- *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM;
- goto error_col_num_chk;
- }
- break;
- }
- if (!memcmp(table_name, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR,
- SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN))
- {
- DBUG_PRINT("info",("spider checking for SYS_TABLE_CRD"));
- if (table->s->fields != SPIDER_SYS_TABLE_CRD_COL_CNT)
- {
- spider_close_sys_table(thd, table, open_tables_backup, need_lock);
- table = NULL;
- my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM,
- ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0),
- SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR);
- *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM;
- goto error_col_num_chk;
- }
- break;
- }
DBUG_ASSERT(0);
break;
case 20:
@@ -378,24 +346,6 @@ TABLE *spider_open_sys_table(
}
DBUG_ASSERT(0);
break;
- case 21:
- if (!memcmp(table_name, SPIDER_SYS_RW_TBLS_TABLE_NAME_STR,
- SPIDER_SYS_RW_TBLS_TABLE_NAME_LEN))
- {
- DBUG_PRINT("info",("spider checking for SYS_RW_TBLS"));
- if (table->s->fields != SPIDER_SYS_RW_TBLS_COL_CNT)
- {
- spider_close_sys_table(thd, table, open_tables_backup, need_lock);
- table = NULL;
- my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM,
- ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0),
- SPIDER_SYS_RW_TBLS_TABLE_NAME_STR);
- *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM;
- goto error_col_num_chk;
- }
- }
- DBUG_ASSERT(0);
- break;
case 22:
if (!memcmp(table_name, SPIDER_SYS_LINK_FAILED_TABLE_NAME_STR,
SPIDER_SYS_LINK_FAILED_TABLE_NAME_LEN))
@@ -432,60 +382,6 @@ TABLE *spider_open_sys_table(
}
break;
}
- if (!memcmp(table_name, SPIDER_SYS_RWN_TBLS_TABLE_NAME_STR,
- SPIDER_SYS_RWN_TBLS_TABLE_NAME_LEN))
- {
- DBUG_PRINT("info",("spider checking for SYS_RWN_TBLS"));
- if (table->s->fields != SPIDER_SYS_RWN_TBLS_COL_CNT)
- {
- spider_close_sys_table(thd, table, open_tables_backup, need_lock);
- table = NULL;
- my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM,
- ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0),
- SPIDER_SYS_RWN_TBLS_TABLE_NAME_STR);
- *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM;
- goto error_col_num_chk;
- }
- break;
- }
- DBUG_ASSERT(0);
- break;
- case 27:
- if (!memcmp(table_name, SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR,
- SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_LEN))
- {
- DBUG_PRINT("info",("spider checking for SYS_RW_TBL_TBLS"));
- if (table->s->fields != SPIDER_SYS_RW_TBL_TBLS_COL_CNT)
- {
- spider_close_sys_table(thd, table, open_tables_backup, need_lock);
- table = NULL;
- my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM,
- ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0),
- SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR);
- *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM;
- goto error_col_num_chk;
- }
- break;
- }
- DBUG_ASSERT(0);
- break;
- case 31:
- if (!memcmp(table_name, SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR,
- SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_LEN))
- {
- DBUG_PRINT("info",("spider checking for SYS_RW_TBL_PTTS"));
- if (table->s->fields != SPIDER_SYS_RW_TBL_PTTS_COL_CNT)
- {
- spider_close_sys_table(thd, table, open_tables_backup, need_lock);
- table = NULL;
- my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM,
- ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0),
- SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR);
- *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM;
- goto error_col_num_chk;
- }
- break;
- }
DBUG_ASSERT(0);
break;
case 34:
@@ -505,22 +401,6 @@ TABLE *spider_open_sys_table(
}
break;
}
- if (!memcmp(table_name, SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR,
- SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_LEN))
- {
- DBUG_PRINT("info",("spider checking for SYS_RW_TBL_SPTTS"));
- if (table->s->fields != SPIDER_SYS_RW_TBL_SPTTS_COL_CNT)
- {
- spider_close_sys_table(thd, table, open_tables_backup, need_lock);
- table = NULL;
- my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM,
- ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0),
- SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR);
- *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM;
- goto error_col_num_chk;
- }
- break;
- }
DBUG_ASSERT(0);
break;
default:
@@ -1455,52 +1335,6 @@ void spider_store_binlog_pos_gtid(
DBUG_VOID_RETURN;
}
-void spider_store_table_sts_info(
- TABLE *table,
- ha_statistics *stat
-) {
- MYSQL_TIME mysql_time;
- DBUG_ENTER("spider_store_table_sts_info");
- table->field[SPIDER_TABLE_STS_DATA_FILE_LENGTH_POS]->store(
- (longlong) stat->data_file_length, TRUE);
- table->field[SPIDER_TABLE_STS_MAX_DATA_FILE_LENGTH_POS]->store(
- (longlong) stat->max_data_file_length, TRUE);
- table->field[SPIDER_TABLE_STS_INDEX_FILE_LENGTH_POS]->store(
- (longlong) stat->index_file_length, TRUE);
- table->field[SPIDER_TABLE_STS_RECORDS_POS]->store(
- (longlong) stat->records, TRUE);
- table->field[SPIDER_TABLE_STS_MEAN_REC_LENGTH_POS]->store(
- (longlong) stat->mean_rec_length, TRUE);
- spd_tz_system->gmt_sec_to_TIME(&mysql_time, (my_time_t) stat->check_time);
- table->field[SPIDER_TABLE_STS_CHECK_TIME_POS]->store_time(&mysql_time);
- spd_tz_system->gmt_sec_to_TIME(&mysql_time, (my_time_t) stat->create_time);
- table->field[SPIDER_TABLE_STS_CREATE_TIME_POS]->store_time(&mysql_time);
- spd_tz_system->gmt_sec_to_TIME(&mysql_time, (my_time_t) stat->update_time);
- table->field[SPIDER_TABLE_STS_UPDATE_TIME_POS]->store_time(&mysql_time);
- if (stat->checksum_null)
- {
- table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->set_null();
- table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->reset();
- } else {
- table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->set_notnull();
- table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->store(
- (longlong) stat->checksum, TRUE);
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_store_table_crd_info(
- TABLE *table,
- uint *seq,
- longlong *cardinality
-) {
- DBUG_ENTER("spider_store_table_crd_info");
- table->field[SPIDER_TABLE_CRD_KEY_SEQ_POS]->store((longlong) *seq, TRUE);
- table->field[SPIDER_TABLE_CRD_CARDINALITY_POS]->store(
- (longlong) *cardinality, FALSE);
- DBUG_VOID_RETURN;
-}
-
int spider_insert_xa(
TABLE *table,
XID *xid,
@@ -1607,83 +1441,6 @@ int spider_insert_sys_table(
DBUG_RETURN(error_num);
}
-int spider_insert_or_update_table_sts(
- TABLE *table,
- const char *name,
- uint name_length,
- ha_statistics *stat
-) {
- int error_num;
- char table_key[MAX_KEY_LENGTH];
- DBUG_ENTER("spider_insert_or_update_table_sts");
- table->use_all_columns();
- spider_store_tables_name(table, name, name_length);
- spider_store_table_sts_info(
- table,
- stat
- );
-
- if ((error_num = spider_check_sys_table_for_update_all_columns(table, table_key)))
- {
- if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
- {
- table->file->print_error(error_num, MYF(0));
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_write_sys_table_row(table)))
- {
- DBUG_RETURN(error_num);
- }
- } else {
- if ((error_num = spider_update_sys_table_row(table, FALSE)))
- {
- table->file->print_error(error_num, MYF(0));
- DBUG_RETURN(error_num);
- }
- }
-
- DBUG_RETURN(0);
-}
-
-int spider_insert_or_update_table_crd(
- TABLE *table,
- const char *name,
- uint name_length,
- longlong *cardinality,
- uint number_of_keys
-) {
- int error_num;
- uint roop_count;
- char table_key[MAX_KEY_LENGTH];
- DBUG_ENTER("spider_insert_or_update_table_crd");
- table->use_all_columns();
- spider_store_tables_name(table, name, name_length);
-
- for (roop_count = 0; roop_count < number_of_keys; ++roop_count)
- {
- spider_store_table_crd_info(table, &roop_count, &cardinality[roop_count]);
- if ((error_num = spider_check_sys_table_for_update_all_columns(table, table_key)))
- {
- if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
- {
- table->file->print_error(error_num, MYF(0));
- DBUG_RETURN(error_num);
- }
- if ((error_num = spider_write_sys_table_row(table)))
- {
- DBUG_RETURN(error_num);
- }
- } else {
- if ((error_num = spider_update_sys_table_row(table, FALSE)))
- {
- table->file->print_error(error_num, MYF(0));
- DBUG_RETURN(error_num);
- }
- }
- }
- DBUG_RETURN(0);
-}
-
int spider_log_tables_link_failed(
TABLE *table,
char *name,
@@ -2009,6 +1766,16 @@ int spider_delete_xa_member(
DBUG_RETURN(0);
}
+/**
+ Delete a Spider table from mysql.spider_tables.
+
+ @param table The table mysql.spider_tables
+ @param name The name of the Spider table to delete
+ @param old_link_count The number of links in the deleted table
+
+ @retval 0 Success
+ @retval nonzero Failure
+*/
int spider_delete_tables(
TABLE *table,
const char *name,
@@ -2024,10 +1791,20 @@ int spider_delete_tables(
{
spider_store_tables_link_idx(table, roop_count);
if ((error_num = spider_check_sys_table(table, table_key)))
- break;
+ {
+ /* There's a problem with finding the first record for the
+ spider table, likely because it does not exist. Fail */
+ if (roop_count == 0)
+ DBUG_RETURN(error_num);
+ /* At least one row has been deleted for the Spider table.
+ Success */
+ else
+ break;
+ }
else {
if ((error_num = spider_delete_sys_table_row(table)))
{
+ /* There's a problem deleting the row. Fail */
DBUG_RETURN(error_num);
}
}
@@ -2728,64 +2505,6 @@ int spider_get_sys_tables_static_link_id(
DBUG_RETURN(error_num);
}
-void spider_get_sys_table_sts_info(
- TABLE *table,
- ha_statistics *stat
-) {
- MYSQL_TIME mysql_time;
- uint not_used_uint;
- long not_used_long;
- DBUG_ENTER("spider_get_sys_table_sts_info");
- stat->data_file_length = (ulonglong) table->
- field[SPIDER_TABLE_STS_DATA_FILE_LENGTH_POS]->val_int();
- stat->max_data_file_length = (ulonglong) table->
- field[SPIDER_TABLE_STS_MAX_DATA_FILE_LENGTH_POS]->val_int();
- stat->index_file_length = (ulonglong) table->
- field[SPIDER_TABLE_STS_INDEX_FILE_LENGTH_POS]->val_int();
- stat->records = (ha_rows) table->
- field[SPIDER_TABLE_STS_RECORDS_POS]->val_int();
- stat->mean_rec_length = (ulong) table->
- field[SPIDER_TABLE_STS_MEAN_REC_LENGTH_POS]->val_int();
- table->field[SPIDER_TABLE_STS_CHECK_TIME_POS]->get_date(&mysql_time,
- SPIDER_date_mode_t(0));
- stat->check_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_uint);
- table->field[SPIDER_TABLE_STS_CREATE_TIME_POS]->get_date(&mysql_time,
- SPIDER_date_mode_t(0));
- stat->create_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_uint);
- table->field[SPIDER_TABLE_STS_UPDATE_TIME_POS]->get_date(&mysql_time,
- SPIDER_date_mode_t(0));
- stat->update_time = (time_t) my_system_gmt_sec(&mysql_time,
- &not_used_long, &not_used_uint);
- if (table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->is_null())
- {
- stat->checksum_null = TRUE;
- stat->checksum = 0;
- } else {
- stat->checksum_null = FALSE;
- stat->checksum = (ha_checksum) table->
- field[SPIDER_TABLE_STS_CHECKSUM_POS]->val_int();
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_get_sys_table_crd_info(
- TABLE *table,
- longlong *cardinality,
- uint number_of_keys
-) {
- uint seq;
- DBUG_ENTER("spider_get_sys_table_crd_info");
- seq = (uint) table->field[SPIDER_TABLE_CRD_KEY_SEQ_POS]->val_int();
- if (seq < number_of_keys)
- {
- cardinality[seq] = (longlong) table->
- field[SPIDER_TABLE_CRD_CARDINALITY_POS]->val_int();
- }
- DBUG_VOID_RETURN;
-}
-
int spider_sys_update_tables_link_status(
THD *thd,
char *name,
@@ -3226,260 +2945,6 @@ int spider_get_link_statuses(
DBUG_RETURN(0);
}
-int spider_sys_insert_or_update_table_sts(
- THD *thd,
- const char *name,
- uint name_length,
- ha_statistics *stat,
- bool need_lock
-) {
- int error_num;
- TABLE *table_sts = NULL;
- SPIDER_Open_tables_backup open_tables_backup;
- DBUG_ENTER("spider_sys_insert_or_update_table_sts");
- if (
- !(table_sts = spider_open_sys_table(
- thd, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR,
- SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN, TRUE,
- &open_tables_backup, need_lock, &error_num))
- ) {
- goto error;
- }
- if ((error_num = spider_insert_or_update_table_sts(
- table_sts,
- name,
- name_length,
- stat
- )))
- goto error;
- spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
- table_sts = NULL;
- DBUG_RETURN(0);
-
-error:
- if (table_sts)
- spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
- DBUG_RETURN(error_num);
-}
-
-int spider_sys_insert_or_update_table_crd(
- THD *thd,
- const char *name,
- uint name_length,
- longlong *cardinality,
- uint number_of_keys,
- bool need_lock
-) {
- int error_num;
- TABLE *table_crd = NULL;
- SPIDER_Open_tables_backup open_tables_backup;
- DBUG_ENTER("spider_sys_insert_or_update_table_crd");
- if (
- !(table_crd = spider_open_sys_table(
- thd, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR,
- SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN, TRUE,
- &open_tables_backup, need_lock, &error_num))
- ) {
- goto error;
- }
- if ((error_num = spider_insert_or_update_table_crd(
- table_crd,
- name,
- name_length,
- cardinality,
- number_of_keys
- )))
- goto error;
- spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
- table_crd = NULL;
- DBUG_RETURN(0);
-
-error:
- if (table_crd)
- spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
- DBUG_RETURN(error_num);
-}
-
-int spider_sys_delete_table_sts(
- THD *thd,
- const char *name,
- uint name_length,
- bool need_lock
-) {
- int error_num;
- TABLE *table_sts = NULL;
- SPIDER_Open_tables_backup open_tables_backup;
- DBUG_ENTER("spider_sys_delete_table_sts");
- if (
- !(table_sts = spider_open_sys_table(
- thd, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR,
- SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN, TRUE,
- &open_tables_backup, need_lock, &error_num))
- ) {
- goto error;
- }
- if ((error_num = spider_delete_table_sts(
- table_sts,
- name,
- name_length
- )))
- goto error;
- spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
- table_sts = NULL;
- DBUG_RETURN(0);
-
-error:
- if (table_sts)
- spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
- DBUG_RETURN(error_num);
-}
-
-int spider_sys_delete_table_crd(
- THD *thd,
- const char *name,
- uint name_length,
- bool need_lock
-) {
- int error_num;
- TABLE *table_crd = NULL;
- SPIDER_Open_tables_backup open_tables_backup;
- DBUG_ENTER("spider_sys_delete_table_crd");
- if (
- !(table_crd = spider_open_sys_table(
- thd, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR,
- SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN, TRUE,
- &open_tables_backup, need_lock, &error_num))
- ) {
- goto error;
- }
- if ((error_num = spider_delete_table_crd(
- table_crd,
- name,
- name_length
- )))
- goto error;
- spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
- table_crd = NULL;
- DBUG_RETURN(0);
-
-error:
- if (table_crd)
- spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
- DBUG_RETURN(error_num);
-}
-
-int spider_sys_get_table_sts(
- THD *thd,
- const char *name,
- uint name_length,
- ha_statistics *stat,
- bool need_lock
-) {
- int error_num;
- char table_key[MAX_KEY_LENGTH];
- TABLE *table_sts = NULL;
- SPIDER_Open_tables_backup open_tables_backup;
- DBUG_ENTER("spider_sys_get_table_sts");
- if (
- !(table_sts = spider_open_sys_table(
- thd, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR,
- SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN, TRUE,
- &open_tables_backup, need_lock, &error_num))
- ) {
- goto error;
- }
-
- table_sts->use_all_columns();
- spider_store_tables_name(table_sts, name, name_length);
- if ((error_num = spider_check_sys_table(table_sts, table_key)))
- {
- if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
- {
- table_sts->file->print_error(error_num, MYF(0));
- }
- goto error;
- } else {
- spider_get_sys_table_sts_info(
- table_sts,
- stat
- );
- }
-
- spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
- table_sts = NULL;
- DBUG_RETURN(0);
-
-error:
- if (table_sts)
- spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
- DBUG_RETURN(error_num);
-}
-
-int spider_sys_get_table_crd(
- THD *thd,
- const char *name,
- uint name_length,
- longlong *cardinality,
- uint number_of_keys,
- bool need_lock
-) {
- int error_num;
- char table_key[MAX_KEY_LENGTH];
- bool index_inited = FALSE;
- TABLE *table_crd = NULL;
- SPIDER_Open_tables_backup open_tables_backup;
- DBUG_ENTER("spider_sys_get_table_crd");
-
- if (
- !(table_crd = spider_open_sys_table(
- thd, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR,
- SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN, TRUE,
- &open_tables_backup, need_lock, &error_num))
- ) {
- goto error;
- }
-
- table_crd->use_all_columns();
- spider_store_tables_name(table_crd, name, name_length);
- if ((error_num = spider_get_sys_table_by_idx(table_crd, table_key, 0,
- SPIDER_SYS_TABLE_CRD_PK_COL_CNT - 1)))
- {
- if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
- {
- table_crd->file->print_error(error_num, MYF(0));
- }
- goto error;
- } else {
- index_inited = TRUE;
- do {
- spider_get_sys_table_crd_info(
- table_crd,
- cardinality,
- number_of_keys
- );
- error_num = spider_sys_index_next_same(table_crd, table_key);
- } while (error_num == 0);
- }
- index_inited = FALSE;
- if ((error_num = spider_sys_index_end(table_crd)))
- {
- table_crd->file->print_error(error_num, MYF(0));
- goto error;
- }
-
- spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
- table_crd = NULL;
- DBUG_RETURN(0);
-
-error:
- if (index_inited)
- spider_sys_index_end(table_crd);
-
- if (table_crd)
- spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
- DBUG_RETURN(error_num);
-}
-
int spider_sys_replace(
TABLE *table,
bool *modified_non_trans_table
diff --git a/storage/spider/spd_sys_table.h b/storage/spider/spd_sys_table.h
index 36f72375..f1983323 100644
--- a/storage/spider/spd_sys_table.h
+++ b/storage/spider/spd_sys_table.h
@@ -28,20 +28,6 @@
#define SPIDER_SYS_XA_FAILED_TABLE_NAME_LEN 20
#define SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_STR "spider_table_position_for_recovery"
#define SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_LEN 34
-#define SPIDER_SYS_TABLE_STS_TABLE_NAME_STR "spider_table_sts"
-#define SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN 16
-#define SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR "spider_table_crd"
-#define SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN 16
-#define SPIDER_SYS_RW_TBLS_TABLE_NAME_STR "spider_rewrite_tables"
-#define SPIDER_SYS_RW_TBLS_TABLE_NAME_LEN 21
-#define SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR "spider_rewrite_table_tables"
-#define SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_LEN 27
-#define SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR "spider_rewrite_table_partitions"
-#define SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_LEN 31
-#define SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR "spider_rewrite_table_subpartitions"
-#define SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_LEN 34
-#define SPIDER_SYS_RWN_TBLS_TABLE_NAME_STR "spider_rewritten_tables"
-#define SPIDER_SYS_RWN_TBLS_TABLE_NAME_LEN 23
#define SPIDER_SYS_XA_PREPARED_STR "PREPARED"
#define SPIDER_SYS_XA_NOT_YET_STR "NOT YET"
@@ -65,11 +51,6 @@
#define SPIDER_SYS_TABLE_STS_PK_COL_CNT 2
#define SPIDER_SYS_TABLE_CRD_COL_CNT 4
#define SPIDER_SYS_TABLE_CRD_PK_COL_CNT 3
-#define SPIDER_SYS_RW_TBLS_COL_CNT 3
-#define SPIDER_SYS_RW_TBL_TBLS_COL_CNT 8
-#define SPIDER_SYS_RW_TBL_PTTS_COL_CNT 7
-#define SPIDER_SYS_RW_TBL_SPTTS_COL_CNT 8
-#define SPIDER_SYS_RWN_TBLS_COL_CNT 4
#define SPIDER_SYS_LINK_MON_TABLE_DB_NAME_SIZE 64
#define SPIDER_SYS_LINK_MON_TABLE_TABLE_NAME_SIZE 64
@@ -313,21 +294,6 @@ int spider_insert_sys_table(
TABLE *table
);
-int spider_insert_or_update_table_sts(
- TABLE *table,
- const char *name,
- uint name_length,
- ha_statistics *stat
-);
-
-int spider_insert_or_update_table_crd(
- TABLE *table,
- const char *name,
- uint name_length,
- longlong *cardinality,
- uint number_of_keys
-);
-
int spider_log_tables_link_failed(
TABLE *table,
char *name,
@@ -471,17 +437,6 @@ int spider_get_sys_tables_static_link_id(
MEM_ROOT *mem_root
);
-void spider_get_sys_table_sts_info(
- TABLE *table,
- ha_statistics *stat
-);
-
-void spider_get_sys_table_crd_info(
- TABLE *table,
- longlong *cardinality,
- uint number_of_keys
-);
-
int spider_sys_update_tables_link_status(
THD *thd,
char *name,
@@ -533,54 +488,6 @@ int spider_get_link_statuses(
MEM_ROOT *mem_root
);
-int spider_sys_insert_or_update_table_sts(
- THD *thd,
- const char *name,
- uint name_length,
- ha_statistics *stat,
- bool need_lock
-);
-
-int spider_sys_insert_or_update_table_crd(
- THD *thd,
- const char *name,
- uint name_length,
- longlong *cardinality,
- uint number_of_keys,
- bool need_lock
-);
-
-int spider_sys_delete_table_sts(
- THD *thd,
- const char *name,
- uint name_length,
- bool need_lock
-);
-
-int spider_sys_delete_table_crd(
- THD *thd,
- const char *name,
- uint name_length,
- bool need_lock
-);
-
-int spider_sys_get_table_sts(
- THD *thd,
- const char *name,
- uint name_length,
- ha_statistics *stat,
- bool need_lock
-);
-
-int spider_sys_get_table_crd(
- THD *thd,
- const char *name,
- uint name_length,
- longlong *cardinality,
- uint number_of_keys,
- bool need_lock
-);
-
int spider_sys_replace(
TABLE *table,
bool *modified_non_trans_table
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index bf101858..208b804f 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -1032,7 +1032,7 @@ int spider_create_string_list(
}
if (!(*string_list = (char**)
- spider_bulk_malloc(spider_current_trx, 37, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_STRING_LIST_1, MYF(MY_WME | MY_ZEROFILL),
string_list, (uint) (sizeof(char*) * (*list_length)),
string_length_list, (uint) (sizeof(int) * (*list_length)),
NullS))
@@ -1226,7 +1226,7 @@ int spider_create_long_list(
}
if (!(*long_list = (long*)
- spider_bulk_malloc(spider_current_trx, 38, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_LONG_LIST_1, MYF(MY_WME | MY_ZEROFILL),
long_list, (uint) (sizeof(long) * (*list_length)),
NullS))
) {
@@ -1305,7 +1305,7 @@ int spider_create_longlong_list(
}
if (!(*longlong_list = (longlong *)
- spider_bulk_malloc(spider_current_trx, 39, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_LONGLONG_LIST_1, MYF(MY_WME | MY_ZEROFILL),
longlong_list, (uint) (sizeof(longlong) * (*list_length)),
NullS))
) {
@@ -1373,7 +1373,7 @@ int spider_increase_string_list(
}
if (!(tmp_str_list = (char**)
- spider_bulk_malloc(spider_current_trx, 40, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_INCREASE_STRING_LIST_1, MYF(MY_WME | MY_ZEROFILL),
&tmp_str_list, (uint) (sizeof(char*) * link_count),
&tmp_length_list, (uint) (sizeof(uint) * link_count),
NullS))
@@ -1436,7 +1436,7 @@ int spider_increase_null_string_list(
DBUG_RETURN(0);
if (!(tmp_str_list = (char**)
- spider_bulk_malloc(spider_current_trx, 247, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_INCREASE_NULL_STRING_LIST_1, MYF(MY_WME | MY_ZEROFILL),
&tmp_str_list, (uint) (sizeof(char*) * link_count),
&tmp_length_list, (uint) (sizeof(uint) * link_count),
NullS))
@@ -1494,7 +1494,7 @@ int spider_increase_long_list(
tmp_long = -1;
if (!(tmp_long_list = (long*)
- spider_bulk_malloc(spider_current_trx, 41, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_INCREASE_LONG_LIST_1, MYF(MY_WME | MY_ZEROFILL),
&tmp_long_list, (uint) (sizeof(long) * link_count),
NullS))
) {
@@ -1539,7 +1539,7 @@ int spider_increase_longlong_list(
tmp_longlong = -1;
if (!(tmp_longlong_list = (longlong*)
- spider_bulk_malloc(spider_current_trx, 42, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_INCREASE_LONGLONG_LIST_1, MYF(MY_WME | MY_ZEROFILL),
&tmp_longlong_list, (uint) (sizeof(longlong) * link_count),
NullS))
) {
@@ -2880,7 +2880,7 @@ int spider_parse_connect_info(
share_alter = &share->alter_table;
share_alter->all_link_count = share->all_link_count;
if (!(share_alter->tmp_server_names = (char **)
- spider_bulk_malloc(spider_current_trx, 43, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_PARSE_CONNECT_INFO_1, MYF(MY_WME | MY_ZEROFILL),
&share_alter->tmp_server_names,
(uint) (sizeof(char *) * share->all_link_count),
&share_alter->tmp_tgt_table_names,
@@ -4025,7 +4025,7 @@ int spider_create_conn_keys(
share->conn_keys_charlen += conn_keys_lengths[roop_count] + 2;
}
if (!(share->conn_keys = (char **)
- spider_bulk_alloc_mem(spider_current_trx, 45,
+ spider_bulk_alloc_mem(spider_current_trx, SPD_MID_CREATE_CONN_KEYS_1,
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
&share->conn_keys, sizeof(char *) * share->all_link_count,
&share->conn_keys_lengths, length_base,
@@ -4218,7 +4218,7 @@ SPIDER_SHARE *spider_create_share(
length = (uint) strlen(table_name);
bitmap_size = spider_bitmap_size(table_share->fields);
if (!(share = (SPIDER_SHARE *)
- spider_bulk_malloc(spider_current_trx, 46, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_SHARE_1, MYF(MY_WME | MY_ZEROFILL),
&share, (uint) (sizeof(*share)),
&tmp_name, (uint) (length + 1),
&tmp_static_key_cardinality,
@@ -4263,7 +4263,7 @@ SPIDER_SHARE *spider_create_share(
goto error_init_hint_string;
}
for (roop_count = 0; roop_count < (int) table_share->keys; roop_count++)
- share->key_hint[roop_count].init_calc_mem(95);
+ share->key_hint[roop_count].init_calc_mem(SPD_MID_CREATE_SHARE_2);
DBUG_PRINT("info",("spider share->key_hint=%p", share->key_hint));
if ((*error_num = spider_parse_connect_info(share, table_share,
@@ -4450,7 +4450,7 @@ SPIDER_SHARE *spider_get_share(
((char *) lex_str.str)[lex_str.length] = '\0';
DBUG_PRINT("info",("spider loop check param name=%s", lex_str.str));
loop_check = get_variable(&thd->user_vars, &lex_str, FALSE);
- if (loop_check && loop_check->type == STRING_RESULT)
+ if (loop_check && loop_check->type_handler()->result_type() == STRING_RESULT)
{
lex_str.length = top_share->path.length + spider_unique_id.length + 1;
lex_str.str = loop_check_buf + buf_sz - top_share->path.length -
@@ -4685,7 +4685,7 @@ SPIDER_SHARE *spider_get_share(
}
if (!(spider->conn_keys = (char **)
- spider_bulk_alloc_mem(spider_current_trx, 47,
+ spider_bulk_alloc_mem(spider_current_trx, SPD_MID_GET_SHARE_1,
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
&spider->conn_keys, sizeof(char *) * share->link_count,
&tmp_name, sizeof(char) * share->conn_keys_charlen,
@@ -5140,7 +5140,7 @@ SPIDER_SHARE *spider_get_share(
}
if (!(spider->conn_keys = (char **)
- spider_bulk_alloc_mem(spider_current_trx, 49,
+ spider_bulk_alloc_mem(spider_current_trx, SPD_MID_GET_SHARE_2,
__func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
&spider->conn_keys, sizeof(char *) * share->link_count,
&tmp_name, sizeof(char) * share->conn_keys_charlen,
@@ -5443,8 +5443,6 @@ int spider_free_share(
) {
DBUG_ENTER("spider_free_share");
pthread_mutex_lock(&spider_tbl_mutex);
- bool do_delete_thd = false;
- THD *thd = current_thd;
if (!--share->use_count)
{
spider_free_sts_thread(share);
@@ -5460,49 +5458,6 @@ int spider_free_share(
spider_table_remove_share_from_crd_thread(share);
spider_free_spider_object_for_share(&share->crd_spider);
}
- if (
- share->sts_init &&
- share->table_share->tmp_table == NO_TMP_TABLE &&
- spider_param_store_last_sts(share->store_last_sts)
- ) {
- if (!thd)
- {
- /* Create a thread for Spider system table update */
- thd = spider_create_thd();
- if (!thd)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- do_delete_thd = TRUE;
- }
- spider_sys_insert_or_update_table_sts(
- thd,
- share->lgtm_tblhnd_share->table_name,
- share->lgtm_tblhnd_share->table_name_length,
- &share->stat,
- FALSE
- );
- }
- if (
- share->crd_init &&
- share->table_share->tmp_table == NO_TMP_TABLE &&
- spider_param_store_last_crd(share->store_last_crd)
- ) {
- if (!thd)
- {
- /* Create a thread for Spider system table update */
- thd = spider_create_thd();
- if (!thd)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- do_delete_thd = TRUE;
- }
- spider_sys_insert_or_update_table_crd(
- thd,
- share->lgtm_tblhnd_share->table_name,
- share->lgtm_tblhnd_share->table_name_length,
- share->cardinality,
- share->table_share->fields,
- FALSE
- );
- }
spider_free_share_alloc(share);
my_hash_delete(&spider_open_tables, (uchar*) share);
pthread_mutex_destroy(&share->crd_mutex);
@@ -5511,8 +5466,6 @@ int spider_free_share(
free_root(&share->mem_root, MYF(0));
spider_free(spider_current_trx, share, MYF(0));
}
- if (do_delete_thd)
- spider_destroy_thd(thd);
pthread_mutex_unlock(&spider_tbl_mutex);
DBUG_RETURN(0);
}
@@ -5568,7 +5521,7 @@ SPIDER_LGTM_TBLHND_SHARE *spider_get_lgtm_tblhnd_share(
{
DBUG_PRINT("info",("spider create new lgtm tblhnd share"));
if (!(lgtm_tblhnd_share = (SPIDER_LGTM_TBLHND_SHARE *)
- spider_bulk_malloc(spider_current_trx, 244, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_GET_LGTM_TBLHND_SHARE_1, MYF(MY_WME | MY_ZEROFILL),
&lgtm_tblhnd_share, (uint) (sizeof(*lgtm_tblhnd_share)),
&tmp_name, (uint) (table_name_length + 1),
NullS))
@@ -5654,7 +5607,7 @@ SPIDER_WIDE_SHARE *spider_get_wide_share(
{
DBUG_PRINT("info",("spider create new wide share"));
if (!(wide_share = (SPIDER_WIDE_SHARE *)
- spider_bulk_malloc(spider_current_trx, 51, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_GET_PT_SHARE_1, MYF(MY_WME | MY_ZEROFILL),
&wide_share, sizeof(SPIDER_WIDE_SHARE),
&tmp_name, (uint) (table_share->path.length + 1),
&tmp_cardinality,
@@ -5946,7 +5899,7 @@ int spider_open_all_tables(
spider->wide_handler->lock_type = TL_READ_NO_INSERT;
if (!(share = (SPIDER_SHARE *)
- spider_bulk_malloc(spider_current_trx, 52, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_OPEN_ALL_TABLES_1, MYF(MY_WME | MY_ZEROFILL),
&share, (uint) (sizeof(*share)),
&connect_info,
(uint) (sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT),
@@ -6162,26 +6115,13 @@ int spider_db_done(
void *p
) {
int roop_count;
- bool do_delete_thd;
- THD *thd = current_thd, *tmp_thd;
+ THD *tmp_thd;
SPIDER_CONN *conn;
SPIDER_INIT_ERROR_TABLE *spider_init_error_table;
SPIDER_TABLE_MON_LIST *table_mon_list;
SPIDER_LGTM_TBLHND_SHARE *lgtm_tblhnd_share;
DBUG_ENTER("spider_db_done");
- /* Begin Spider plugin deinit */
- if (thd)
- do_delete_thd = FALSE;
- else
- {
- /* Create a thread for Spider plugin deinit */
- thd = spider_create_thd();
- if (!thd)
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- do_delete_thd = TRUE;
- }
-
for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--)
{
if (spider_dbton[roop_count].deinit)
@@ -6331,13 +6271,6 @@ int spider_db_done(
));
}
- /* End Spider plugin deinit */
- if (do_delete_thd)
- spider_destroy_thd(thd);
-
-/*
-DBUG_ASSERT(0);
-*/
DBUG_RETURN(0);
}
@@ -6393,6 +6326,17 @@ bool spider_init_system_tables()
DBUG_RETURN(FALSE);
}
+
+/*
+ Spider is typically loaded before ddl_recovery, but DDL statements
+ cannot be executed before ddl_recovery, so we delay system table creation.
+*/
+static int spider_after_ddl_recovery(handlerton *)
+{
+ DBUG_EXECUTE_IF("fail_spider_ddl_recovery_done", return 1;);
+ return spider_init_system_tables();
+}
+
int spider_db_init(
void *p
) {
@@ -6412,17 +6356,8 @@ int spider_db_init(
#ifdef HTON_CAN_READ_CONNECT_STRING_IN_PARTITION
spider_hton->flags |= HTON_CAN_READ_CONNECT_STRING_IN_PARTITION;
#endif
- /* spider_hton->db_type = DB_TYPE_SPIDER; */
- /*
- spider_hton->savepoint_offset;
- spider_hton->savepoint_set = spider_savepoint_set;
- spider_hton->savepoint_rollback = spider_savepoint_rollback;
- spider_hton->savepoint_release = spider_savepoint_release;
- spider_hton->create_cursor_read_view = spider_create_cursor_read_view;
- spider_hton->set_cursor_read_view = spider_set_cursor_read_view;
- spider_hton->close_cursor_read_view = spider_close_cursor_read_view;
- */
spider_hton->panic = spider_panic;
+ spider_hton->signal_ddl_recovery_done= spider_after_ddl_recovery;
spider_hton->close_connection = spider_close_connection;
spider_hton->start_consistent_snapshot = spider_start_consistent_snapshot;
spider_hton->flush_logs = spider_flush_logs;
@@ -6478,10 +6413,6 @@ int spider_db_init(
if (pthread_attr_init(&spider_pt_attr))
goto error_pt_attr_init;
-/*
- if (pthread_attr_setdetachstate(&spider_pt_attr, PTHREAD_CREATE_DETACHED))
- goto error_pt_attr_setstate;
-*/
if (mysql_mutex_init(spd_key_mutex_tbl,
&spider_tbl_mutex, MY_MUTEX_INIT_FAST))
@@ -6535,7 +6466,7 @@ int spider_db_init(
(my_hash_get_key) spider_tbl_get_key, 0, 0))
goto error_open_tables_hash_init;
- spider_alloc_calc_mem_init(spider_open_tables, 143);
+ spider_alloc_calc_mem_init(spider_open_tables, SPD_MID_DB_INIT_1);
spider_alloc_calc_mem(NULL,
spider_open_tables,
spider_open_tables.array.max_element *
@@ -6544,7 +6475,7 @@ int spider_db_init(
(my_hash_get_key) spider_tbl_get_key, 0, 0))
goto error_init_error_tables_hash_init;
- spider_alloc_calc_mem_init(spider_init_error_tables, 144);
+ spider_alloc_calc_mem_init(spider_init_error_tables, SPD_MID_DB_INIT_2);
spider_alloc_calc_mem(NULL,
spider_init_error_tables,
spider_init_error_tables.array.max_element *
@@ -6555,7 +6486,7 @@ int spider_db_init(
)
goto error_open_wide_share_hash_init;
- spider_alloc_calc_mem_init(spider_open_wide_share, 145);
+ spider_alloc_calc_mem_init(spider_open_wide_share, SPD_MID_DB_INIT_3);
spider_alloc_calc_mem(NULL,
spider_open_wide_share,
spider_open_wide_share.array.max_element *
@@ -6565,7 +6496,7 @@ int spider_db_init(
(my_hash_get_key) spider_lgtm_tblhnd_share_hash_get_key, 0, 0))
goto error_lgtm_tblhnd_share_hash_init;
- spider_alloc_calc_mem_init(spider_lgtm_tblhnd_share_hash, 245);
+ spider_alloc_calc_mem_init(spider_lgtm_tblhnd_share_hash, SPD_MID_DB_INIT_4);
spider_alloc_calc_mem(NULL,
spider_lgtm_tblhnd_share_hash,
spider_lgtm_tblhnd_share_hash.array.max_element *
@@ -6579,7 +6510,7 @@ int spider_db_init(
spider_free_ipport_conn, 0))
goto error_ipport_conn__hash_init;
- spider_alloc_calc_mem_init(spider_open_connections, 146);
+ spider_alloc_calc_mem_init(spider_open_connections, SPD_MID_DB_INIT_5);
spider_alloc_calc_mem(NULL,
spider_open_connections,
spider_open_connections.array.max_element *
@@ -6588,7 +6519,7 @@ int spider_db_init(
(my_hash_get_key) spider_allocated_thds_get_key, 0, 0))
goto error_allocated_thds_hash_init;
- spider_alloc_calc_mem_init(spider_allocated_thds, 149);
+ spider_alloc_calc_mem_init(spider_allocated_thds, SPD_MID_DB_INIT_8);
spider_alloc_calc_mem(NULL,
spider_allocated_thds,
spider_allocated_thds.array.max_element *
@@ -6598,14 +6529,14 @@ int spider_db_init(
NULL, 64, 64, MYF(MY_WME)))
goto error_mon_table_cache_array_init;
- spider_alloc_calc_mem_init(spider_mon_table_cache, 165);
+ spider_alloc_calc_mem_init(spider_mon_table_cache, SPD_MID_DB_INIT_9);
spider_alloc_calc_mem(NULL,
spider_mon_table_cache,
spider_mon_table_cache.max_element *
spider_mon_table_cache.size_of_element);
if (!(spider_udf_table_mon_mutexes = (pthread_mutex_t *)
- spider_bulk_malloc(NULL, 53, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(NULL, SPD_MID_DB_INIT_10, MYF(MY_WME | MY_ZEROFILL),
&spider_udf_table_mon_mutexes, (uint) (sizeof(pthread_mutex_t) *
spider_udf_table_mon_mutex_count),
&spider_udf_table_mon_conds, (uint) (sizeof(pthread_cond_t) *
@@ -6641,7 +6572,7 @@ int spider_db_init(
(my_hash_get_key) spider_udf_tbl_mon_list_key, 0, 0))
goto error_init_udf_table_mon_list_hash;
- spider_alloc_calc_mem_init(spider_udf_table_mon_list_hash, 150);
+ spider_alloc_calc_mem_init(spider_udf_table_mon_list_hash, SPD_MID_DB_INIT_11);
spider_alloc_calc_mem(NULL,
spider_udf_table_mon_list_hash,
spider_udf_table_mon_list_hash[roop_count].array.max_element *
@@ -6654,7 +6585,7 @@ int spider_db_init(
}
if (!(spider_table_sts_threads = (SPIDER_THREAD *)
- spider_bulk_malloc(NULL, 256, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(NULL, SPD_MID_DB_INIT_12, MYF(MY_WME | MY_ZEROFILL),
&spider_table_sts_threads, (uint) (sizeof(SPIDER_THREAD) *
spider_param_table_sts_thread_count()),
&spider_table_crd_threads, (uint) (sizeof(SPIDER_THREAD) *
@@ -6826,7 +6757,7 @@ char *spider_create_string(
) {
char *res;
DBUG_ENTER("spider_create_string");
- if (!(res = (char*) spider_malloc(spider_current_trx, 13, length + 1,
+ if (!(res = (char*) spider_malloc(spider_current_trx, SPD_MID_CREATE_STRING_1, length + 1,
MYF(MY_WME))))
DBUG_RETURN(NULL);
memcpy(res, str, length);
@@ -6848,7 +6779,7 @@ char *spider_create_table_name_string(
if (sub_name)
length += sizeof("#SP#") - 1 + strlen(sub_name);
}
- if (!(res = (char*) spider_malloc(spider_current_trx, 14, length + 1,
+ if (!(res = (char*) spider_malloc(spider_current_trx, SPD_MID_CREATE_TABLE_NAME_STRING_1, length + 1,
MYF(MY_WME))))
DBUG_RETURN(NULL);
tmp = strmov(res, table_name);
@@ -6968,7 +6899,6 @@ int spider_get_sts(
) {
int get_type;
int error_num = 0;
- bool need_to_get = TRUE;
DBUG_ENTER("spider_get_sts");
if (
@@ -7004,34 +6934,10 @@ int spider_get_sts(
/* copy */
get_type = 0;
}
- if (
- !share->sts_init &&
- share->table_share->tmp_table == NO_TMP_TABLE &&
- spider_param_load_sts_at_startup(share->load_sts_at_startup) &&
- (!share->init || share->init_error)
- ) {
- error_num = spider_sys_get_table_sts(
- current_thd,
- share->lgtm_tblhnd_share->table_name,
- share->lgtm_tblhnd_share->table_name_length,
- &share->stat,
- FALSE
- );
- if (
- !error_num ||
- (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
- )
- need_to_get = FALSE;
- }
-
- if (need_to_get)
- {
- if (get_type == 0)
- spider_copy_sts_to_share(share, share->wide_share);
- else {
- error_num = spider_db_show_table_status(spider, link_idx, sts_mode, flag);
- }
- }
+ if (get_type == 0)
+ spider_copy_sts_to_share(share, share->wide_share);
+ else
+ error_num = spider_db_show_table_status(spider, link_idx, sts_mode, flag);
if (get_type >= 2)
pthread_mutex_unlock(&share->wide_share->sts_mutex);
if (error_num)
@@ -7103,7 +7009,6 @@ int spider_get_crd(
) {
int get_type;
int error_num = 0;
- bool need_to_get = TRUE;
DBUG_ENTER("spider_get_crd");
if (
@@ -7139,35 +7044,6 @@ int spider_get_crd(
/* copy */
get_type = 0;
}
- if (
- !share->crd_init &&
- share->table_share->tmp_table == NO_TMP_TABLE &&
- spider_param_load_sts_at_startup(share->load_crd_at_startup)
- ) {
- error_num = spider_sys_get_table_crd(
- current_thd,
- share->lgtm_tblhnd_share->table_name,
- share->lgtm_tblhnd_share->table_name_length,
- share->cardinality,
- table->s->fields,
- FALSE
- );
- if (
- !error_num ||
- (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
- )
- need_to_get = FALSE;
- }
-
- if (need_to_get)
- {
- if (get_type == 0)
- spider_copy_crd_to_share(share, share->wide_share,
- table->s->fields);
- else {
- error_num = spider_db_show_index(spider, link_idx, table, crd_mode);
- }
- }
if (get_type >= 2)
pthread_mutex_unlock(&share->wide_share->crd_mutex);
if (error_num)
@@ -7284,7 +7160,7 @@ SPIDER_INIT_ERROR_TABLE *spider_get_init_error_table(
DBUG_RETURN(NULL);
}
if (!(spider_init_error_table = (SPIDER_INIT_ERROR_TABLE *)
- spider_bulk_malloc(spider_current_trx, 54, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_GET_INIT_ERROR_TABLE_1, MYF(MY_WME | MY_ZEROFILL),
&spider_init_error_table, (uint) (sizeof(*spider_init_error_table)),
&tmp_name, (uint) (share->table_name_length + 1),
NullS))
@@ -8345,7 +8221,7 @@ int spider_discover_table_structure(
char buf[MAX_FIELD_WIDTH];
spider_string str(buf, sizeof(buf), system_charset_info);
DBUG_ENTER("spider_discover_table_structure");
- str.init_calc_mem(229);
+ str.init_calc_mem(SPD_MID_DISCOVER_TABLE_STRUCTURE_1);
str.length(0);
if (str.reserve(
SPIDER_SQL_CREATE_TABLE_LEN + share->db.length +
@@ -8676,7 +8552,7 @@ int spider_create_spider_object_for_share(
}
DBUG_PRINT("info",("spider spider=%p", (*spider)));
if (!(need_mons = (int *)
- spider_bulk_malloc(spider_current_trx, 255, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_SPIDER_OBJECT_FOR_SHARE_2, MYF(MY_WME | MY_ZEROFILL),
&need_mons, (uint) (sizeof(int) * share->link_count),
&conns, (uint) (sizeof(SPIDER_CONN *) * share->link_count),
&conn_link_idx, (uint) (sizeof(uint) * share->link_count),
diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc
index c689e40d..ebf9a777 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -166,7 +166,7 @@ int spider_trx_another_lock_tables(
spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info);
DBUG_ENTER("spider_trx_another_lock_tables");
SPIDER_BACKUP_DASTATUS;
- sql_str.init_calc_mem(188);
+ sql_str.init_calc_mem(SPD_MID_TRX_ANOTHER_LOCK_TABLES_1);
sql_str.length(0);
memset((void*)&tmp_spider, 0, sizeof(ha_spider));
memset((void*)&tmp_share, 0, sizeof(SPIDER_SHARE));
@@ -482,7 +482,7 @@ int spider_create_trx_alter_table(
share_alter = &share->alter_table;
if (!(alter_table = (SPIDER_ALTER_TABLE *)
- spider_bulk_malloc(spider_current_trx, 55, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_TRX_ALTER_TABLE_1, MYF(MY_WME | MY_ZEROFILL),
&alter_table, (uint) (sizeof(*alter_table)),
&tmp_name, (uint) (sizeof(char) * (share->table_name_length + 1)),
@@ -1142,7 +1142,7 @@ SPIDER_TRX *spider_get_trx(
) {
DBUG_PRINT("info",("spider create new trx"));
if (!(trx = (SPIDER_TRX *)
- spider_bulk_malloc(NULL, 56, MYF(MY_WME | MY_ZEROFILL),
+ spider_bulk_malloc(NULL, SPD_MID_GET_TRX_1, MYF(MY_WME | MY_ZEROFILL),
&trx, (uint) (sizeof(*trx)),
&tmp_share, (uint) (sizeof(SPIDER_SHARE)),
&tmp_wide_handler, (uint) sizeof(SPIDER_WIDE_HANDLER),
@@ -1171,7 +1171,7 @@ SPIDER_TRX *spider_get_trx(
spider_conn_get_key, 0, 0)
)
goto error_init_hash;
- spider_alloc_calc_mem_init(trx->trx_conn_hash, 151);
+ spider_alloc_calc_mem_init(trx->trx_conn_hash, SPD_MID_GET_TRX_2);
spider_alloc_calc_mem(
thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
trx->trx_conn_hash,
@@ -1184,7 +1184,7 @@ SPIDER_TRX *spider_get_trx(
spider_conn_get_key, 0, 0)
)
goto error_init_another_hash;
- spider_alloc_calc_mem_init(trx->trx_another_conn_hash, 152);
+ spider_alloc_calc_mem_init(trx->trx_another_conn_hash, SPD_MID_GET_TRX_3);
spider_alloc_calc_mem(
thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
trx->trx_another_conn_hash,
@@ -1197,7 +1197,7 @@ SPIDER_TRX *spider_get_trx(
spider_alter_tbl_get_key, 0, 0)
)
goto error_init_alter_hash;
- spider_alloc_calc_mem_init(trx->trx_alter_table_hash, 157);
+ spider_alloc_calc_mem_init(trx->trx_alter_table_hash, SPD_MID_GET_TRX_8);
spider_alloc_calc_mem(
thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
trx->trx_alter_table_hash,
@@ -1210,7 +1210,7 @@ SPIDER_TRX *spider_get_trx(
spider_trx_ha_get_key, 0, 0)
)
goto error_init_trx_ha_hash;
- spider_alloc_calc_mem_init(trx->trx_ha_hash, 158);
+ spider_alloc_calc_mem_init(trx->trx_ha_hash, SPD_MID_GET_TRX_9);
spider_alloc_calc_mem(
thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
trx->trx_ha_hash,
@@ -1262,7 +1262,7 @@ SPIDER_TRX *spider_get_trx(
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].init_calc_mem(SPD_MID_GET_TRX_10);
trx->tmp_spider->result_list.sqls[roop_count2].set_charset(
trx->tmp_share->access_charset);
}
@@ -3164,6 +3164,14 @@ int spider_rollback(
DBUG_RETURN(0); /* transaction is not started */
+ /* In case the rollback happens due to failure of LOCK TABLE, we
+ need to clear the list of tables to lock. */
+ for (uint i= 0; i < trx->trx_conn_hash.records; i++)
+ {
+ conn= (SPIDER_CONN *) my_hash_element(&trx->trx_conn_hash, i);
+ conn->db_conn->reset_lock_table_hash();
+ }
+
if (all || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)))
{
if (trx->trx_start)
@@ -3695,7 +3703,7 @@ int spider_create_trx_ha(
if (need_create)
{
if (!(trx_ha = (SPIDER_TRX_HA *)
- spider_bulk_malloc(spider_current_trx, 58, MYF(MY_WME),
+ spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_TRX_HA_1, MYF(MY_WME),
&trx_ha, (uint) (sizeof(SPIDER_TRX_HA)),
&tmp_name, (uint) (sizeof(char *) * (share->table_name_length + 1)),
&conn_link_idx, (uint) (sizeof(uint) * share->link_count),