summaryrefslogtreecommitdiff
path: root/storage/spider
diff options
context:
space:
mode:
authorKentoku SHIBA <kentokushiba@gmail.com>2013-09-30 05:11:44 +0900
committerKentoku SHIBA <kentokushiba@gmail.com>2013-09-30 05:11:44 +0900
commit0b914b39ef07cf519fdb95ad528ab5bdf07e129a (patch)
treeb08e8607bea9b4c533a481687e8038faf1c64c49 /storage/spider
parente980797da35449feaa425e1830f86ba10d70e19b (diff)
downloadmariadb-git-0b914b39ef07cf519fdb95ad528ab5bdf07e129a.tar.gz
fix MEDV-4736 Assertion `! is_set()' fails in Diagnostics_area::set_ok_status on UPDATE which violates constraint on a remote table
Diffstat (limited to 'storage/spider')
-rw-r--r--storage/spider/ha_spider.cc42
-rw-r--r--storage/spider/mysql-test/spider/oracle/r/direct_update.result8
-rw-r--r--storage/spider/mysql-test/spider/oracle/r/direct_update_part.result8
-rw-r--r--storage/spider/mysql-test/spider/oracle2/r/direct_update.result8
-rw-r--r--storage/spider/mysql-test/spider/oracle2/r/direct_update_part.result8
-rw-r--r--storage/spider/spd_db_conn.cc10
-rw-r--r--storage/spider/spd_include.h6
-rw-r--r--storage/spider/spd_table.cc99
-rw-r--r--storage/spider/spd_trx.cc2
9 files changed, 166 insertions, 25 deletions
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc
index 841b48000f1..134ae372c8a 100644
--- a/storage/spider/ha_spider.cc
+++ b/storage/spider/ha_spider.cc
@@ -1878,8 +1878,9 @@ int ha_spider::index_init(
if (result_list.lock_type == F_WRLCK)
{
pk_update = FALSE;
+/*
check_and_start_bulk_update(SPD_BU_START_BY_INDEX_OR_RND_INIT);
-
+*/
if (
update_request &&
share->have_recovery_link &&
@@ -1941,6 +1942,7 @@ int ha_spider::index_end()
}
#endif
active_index = MAX_KEY;
+/*
#ifdef INFO_KIND_FORCE_LIMIT_BEGIN
info_limit = 9223372036854775807LL;
#endif
@@ -1951,6 +1953,9 @@ int ha_spider::index_end()
(error_num = spider_trx_check_link_idx_failed(this))
)
DBUG_RETURN(check_error_mode(error_num));
+*/
+ if ((error_num = drop_tmp_tables()))
+ DBUG_RETURN(check_error_mode(error_num));
result_list.use_union = FALSE;
DBUG_RETURN(0);
}
@@ -6942,9 +6947,10 @@ int ha_spider::rnd_init(
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider scan=%s", scan ? "TRUE" : "FALSE"));
pushed_pos = NULL;
+/*
if (result_list.lock_type == F_WRLCK)
check_and_start_bulk_update(SPD_BU_START_BY_INDEX_OR_RND_INIT);
-
+*/
rnd_scan_and_first = scan;
if (
scan &&
@@ -7054,10 +7060,13 @@ int ha_spider::pre_rnd_init(
int ha_spider::rnd_end()
{
+/*
int error_num;
backup_error_status();
+*/
DBUG_ENTER("ha_spider::rnd_end");
DBUG_PRINT("info",("spider this=%p", this));
+/*
#ifdef INFO_KIND_FORCE_LIMIT_BEGIN
info_limit = 9223372036854775807LL;
#endif
@@ -7067,6 +7076,7 @@ int ha_spider::rnd_end()
(error_num = spider_trx_check_link_idx_failed(this))
)
DBUG_RETURN(check_error_mode(error_num));
+*/
DBUG_RETURN(0);
}
@@ -8666,6 +8676,12 @@ ulonglong ha_spider::table_flags() const
SPIDER_CAN_BG_SEARCH |
SPIDER_CAN_BG_INSERT |
SPIDER_CAN_BG_UPDATE |
+#ifdef HA_CAN_FORCE_BULK_UPDATE
+ (share && share->force_bulk_update ? HA_CAN_FORCE_BULK_UPDATE : 0) |
+#endif
+#ifdef HA_CAN_FORCE_BULK_DELETE
+ (share && share->force_bulk_delete ? HA_CAN_FORCE_BULK_DELETE : 0) |
+#endif
(share ? share->additional_table_flags : 0)
;
DBUG_RETURN(flags);
@@ -11094,27 +11110,43 @@ bool ha_spider::check_and_start_bulk_update(
THD *thd = ha_thd();
int bulk_update_mode = spider_param_bulk_update_mode(thd,
share->bulk_update_mode);
+/*
longlong split_read = spider_split_read_param(this);
+*/
result_list.bulk_update_size = spider_param_bulk_update_size(thd,
share->bulk_update_size);
+/*
#ifndef WITHOUT_SPIDER_BG_SEARCH
int bgs_mode = spider_param_bgs_mode(thd, share->bgs_mode);
#endif
+*/
if (!support_bulk_update_sql())
{
result_list.bulk_update_mode = 0;
+ DBUG_PRINT("info",("spider result_list.bulk_update_mode=%d 1",
+ result_list.bulk_update_mode));
+/*
} else if (
#ifndef WITHOUT_SPIDER_BG_SEARCH
bgs_mode ||
#endif
split_read != 9223372036854775807LL
- )
+ ) {
result_list.bulk_update_mode = 2;
- else {
+ DBUG_PRINT("info",("spider result_list.bulk_update_mode=%d 2",
+ result_list.bulk_update_mode));
+*/
+ } else {
if (result_list.bulk_update_start == SPD_BU_NOT_START)
+ {
result_list.bulk_update_mode = bulk_update_mode;
- else
+ DBUG_PRINT("info",("spider result_list.bulk_update_mode=%d 3",
+ result_list.bulk_update_mode));
+ } else {
result_list.bulk_update_mode = 1;
+ DBUG_PRINT("info",("spider result_list.bulk_update_mode=%d 4",
+ result_list.bulk_update_mode));
+ }
}
result_list.bulk_update_start = bulk_upd_start;
DBUG_RETURN(FALSE);
diff --git a/storage/spider/mysql-test/spider/oracle/r/direct_update.result b/storage/spider/mysql-test/spider/oracle/r/direct_update.result
index eaaef4b2f23..3dc39d5f630 100644
--- a/storage/spider/mysql-test/spider/oracle/r/direct_update.result
+++ b/storage/spider/mysql-test/spider/oracle/r/direct_update.result
@@ -89,8 +89,8 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-2 b 2000-01-03 00:00:00
-3 x 2011-10-17 00:00:00
+2 b 2000-01-02 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
5 c 2002-01-01 23:59:59
delete by primary key with order and limit
@@ -100,7 +100,7 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-3 x 2011-10-17 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
5 c 2002-01-01 23:59:59
delete by a column without index
@@ -110,7 +110,7 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-3 x 2011-10-17 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
delete by primary key
DELETE FROM ta_l WHERE a = 3;
diff --git a/storage/spider/mysql-test/spider/oracle/r/direct_update_part.result b/storage/spider/mysql-test/spider/oracle/r/direct_update_part.result
index 08dd0eb05ed..8a22c40a0da 100644
--- a/storage/spider/mysql-test/spider/oracle/r/direct_update_part.result
+++ b/storage/spider/mysql-test/spider/oracle/r/direct_update_part.result
@@ -80,8 +80,8 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-2 b 2000-01-03 00:00:00
-3 x 2011-10-17 00:00:00
+2 b 2000-01-02 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
5 c 2002-01-01 23:59:59
delete by primary key with order and limit
@@ -91,7 +91,7 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-3 x 2011-10-17 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
5 c 2002-01-01 23:59:59
delete by a column without index
@@ -101,7 +101,7 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-3 x 2011-10-17 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
delete by primary key
DELETE FROM ta_l2 WHERE a = 3;
diff --git a/storage/spider/mysql-test/spider/oracle2/r/direct_update.result b/storage/spider/mysql-test/spider/oracle2/r/direct_update.result
index eaaef4b2f23..3dc39d5f630 100644
--- a/storage/spider/mysql-test/spider/oracle2/r/direct_update.result
+++ b/storage/spider/mysql-test/spider/oracle2/r/direct_update.result
@@ -89,8 +89,8 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-2 b 2000-01-03 00:00:00
-3 x 2011-10-17 00:00:00
+2 b 2000-01-02 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
5 c 2002-01-01 23:59:59
delete by primary key with order and limit
@@ -100,7 +100,7 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-3 x 2011-10-17 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
5 c 2002-01-01 23:59:59
delete by a column without index
@@ -110,7 +110,7 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-3 x 2011-10-17 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
delete by primary key
DELETE FROM ta_l WHERE a = 3;
diff --git a/storage/spider/mysql-test/spider/oracle2/r/direct_update_part.result b/storage/spider/mysql-test/spider/oracle2/r/direct_update_part.result
index 08dd0eb05ed..8a22c40a0da 100644
--- a/storage/spider/mysql-test/spider/oracle2/r/direct_update_part.result
+++ b/storage/spider/mysql-test/spider/oracle2/r/direct_update_part.result
@@ -80,8 +80,8 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-2 b 2000-01-03 00:00:00
-3 x 2011-10-17 00:00:00
+2 b 2000-01-02 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
5 c 2002-01-01 23:59:59
delete by primary key with order and limit
@@ -91,7 +91,7 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-3 x 2011-10-17 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
5 c 2002-01-01 23:59:59
delete by a column without index
@@ -101,7 +101,7 @@ Variable_name Value
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
-3 x 2011-10-17 00:00:00
+3 x 2011-10-18 00:00:00
4 d 2003-12-01 05:01:03
delete by primary key
DELETE FROM ta_l2 WHERE a = 3;
diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc
index e08935c8daf..48c4b6ce4c6 100644
--- a/storage/spider/spd_db_conn.cc
+++ b/storage/spider/spd_db_conn.cc
@@ -1038,11 +1038,15 @@ int spider_db_query_for_bulk_update(
);
}
if (
- error_num == ER_DUP_ENTRY ||
- error_num == ER_DUP_KEY ||
- error_num == HA_ERR_FOUND_DUPP_KEY
+ spider->ignore_dup_key &&
+ (
+ error_num == ER_DUP_ENTRY ||
+ error_num == ER_DUP_KEY ||
+ error_num == HA_ERR_FOUND_DUPP_KEY
+ )
) {
++(*dup_key_found);
+ spider->trx->thd->clear_error();
DBUG_RETURN(0);
}
DBUG_RETURN(error_num);
diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h
index 9eaeeb99139..aafaf7f51db 100644
--- a/storage/spider/spd_include.h
+++ b/storage/spider/spd_include.h
@@ -728,6 +728,12 @@ typedef struct st_spider_share
#ifdef HA_CAN_BULK_ACCESS
int bulk_access_free;
#endif
+#ifdef HA_CAN_FORCE_BULK_UPDATE
+ int force_bulk_update;
+#endif
+#ifdef HA_CAN_FORCE_BULK_DELETE
+ int force_bulk_delete;
+#endif
int bka_mode;
char *bka_engine;
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index 0e66bf275c9..3f313982ad6 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -1783,6 +1783,12 @@ int spider_parse_connect_info(
#ifdef HA_CAN_BULK_ACCESS
share->bulk_access_free = -1;
#endif
+#ifdef HA_CAN_FORCE_BULK_UPDATE
+ share->force_bulk_update = -1;
+#endif
+#ifdef HA_CAN_FORCE_BULK_DELETE
+ share->force_bulk_delete = -1;
+#endif
#ifdef WITH_PARTITION_STORAGE_ENGINE
for (roop_count = 4; roop_count > 0; roop_count--)
@@ -1925,6 +1931,12 @@ int spider_parse_connect_info(
SPIDER_PARAM_LONGLONG("dol", direct_order_limit, 0);
SPIDER_PARAM_INT_WITH_MAX("erm", error_read_mode, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("ewm", error_write_mode, 0, 1);
+#ifdef HA_CAN_FORCE_BULK_DELETE
+ SPIDER_PARAM_INT_WITH_MAX("fbd", force_bulk_delete, 0, 1);
+#endif
+#ifdef HA_CAN_FORCE_BULK_UPDATE
+ SPIDER_PARAM_INT_WITH_MAX("fbu", force_bulk_update, 0, 1);
+#endif
SPIDER_PARAM_LONGLONG("frd", first_read, 0);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
SPIDER_PARAM_LONGLONG("hrf", hs_result_free_size, 0);
@@ -2205,6 +2217,14 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT("active_link_count", active_link_count, 1);
SPIDER_PARAM_LONG_LIST_WITH_MAX("net_write_timeout",
net_write_timeouts, 0, 2147483647);
+#ifdef HA_CAN_FORCE_BULK_DELETE
+ SPIDER_PARAM_INT_WITH_MAX(
+ "force_bulk_delete", force_bulk_delete, 0, 1);
+#endif
+#ifdef HA_CAN_FORCE_BULK_UPDATE
+ SPIDER_PARAM_INT_WITH_MAX(
+ "force_bulk_update", force_bulk_update, 0, 1);
+#endif
error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
MYF(0), tmp_ptr);
@@ -3405,6 +3425,14 @@ int spider_set_connect_info_default(
if (share->bulk_access_free == -1)
share->bulk_access_free = 0;
#endif
+#ifdef HA_CAN_FORCE_BULK_UPDATE
+ if (share->force_bulk_update == -1)
+ share->force_bulk_update = 0;
+#endif
+#ifdef HA_CAN_FORCE_BULK_DELETE
+ if (share->force_bulk_delete == -1)
+ share->force_bulk_delete = 0;
+#endif
if (share->bka_mode == -1)
share->bka_mode = 1;
if (!share->bka_engine)
@@ -7398,6 +7426,77 @@ longlong spider_split_read_param(
spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
if (!result_list->set_split_read)
{
+ int bulk_update_mode = spider_param_bulk_update_mode(thd,
+ share->bulk_update_mode);
+ DBUG_PRINT("info",("spider sql_command=%u", spider->sql_command));
+ DBUG_PRINT("info",("spider bulk_update_mode=%d", bulk_update_mode));
+ DBUG_PRINT("info",("spider support_bulk_update_sql=%s",
+ spider->support_bulk_update_sql() ? "TRUE" : "FALSE"));
+ bool updating =
+ (
+#ifdef HS_HAS_SQLCOM
+ spider->sql_command == SQLCOM_HS_UPDATE ||
+#endif
+ spider->sql_command == SQLCOM_UPDATE ||
+ spider->sql_command == SQLCOM_UPDATE_MULTI
+ );
+ bool deleting =
+ (
+#ifdef HS_HAS_SQLCOM
+ spider->sql_command == SQLCOM_HS_DELETE ||
+#endif
+ spider->sql_command == SQLCOM_DELETE ||
+ spider->sql_command == SQLCOM_DELETE_MULTI
+ );
+ bool replacing =
+ (
+ spider->sql_command == SQLCOM_REPLACE ||
+ spider->sql_command == SQLCOM_REPLACE_SELECT
+ );
+ DBUG_PRINT("info",("spider updating=%s", updating ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider deleting=%s", deleting ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info",("spider replacing=%s", replacing ? "TRUE" : "FALSE"));
+ TABLE *table = spider->get_table();
+ if (
+ replacing ||
+ (
+ (
+ updating ||
+ deleting
+ ) &&
+ (
+ bulk_update_mode != 2 ||
+ !spider->support_bulk_update_sql() ||
+ (
+ updating &&
+ table->triggers &&
+#ifdef HA_CAN_FORCE_BULK_UPDATE
+ !(table->file->ha_table_flags() & HA_CAN_FORCE_BULK_UPDATE) &&
+#endif
+ table->triggers->has_triggers(TRG_EVENT_UPDATE, TRG_ACTION_AFTER)
+ ) ||
+ (
+ deleting &&
+ table->triggers &&
+#ifdef HA_CAN_FORCE_BULK_DELETE
+ !(table->file->ha_table_flags() & HA_CAN_FORCE_BULK_DELETE) &&
+#endif
+ table->triggers->has_triggers(TRG_EVENT_DELETE, TRG_ACTION_AFTER)
+ )
+ )
+ )
+ ) {
+ /* This case must select by one shot */
+ DBUG_PRINT("info",("spider cancel split read"));
+ result_list->split_read_base = 9223372036854775807LL;
+ result_list->semi_split_read = 9223372036854775807LL;
+ result_list->semi_split_read_limit = 9223372036854775807LL;
+ result_list->first_read = 9223372036854775807LL;
+ result_list->second_read = 9223372036854775807LL;
+ result_list->semi_split_read_base = 0;
+ result_list->set_split_read = TRUE;
+ DBUG_RETURN(9223372036854775807LL);
+ }
result_list->split_read_base =
spider_param_split_read(thd, share->split_read);
result_list->semi_split_read =
diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc
index f3ca117d1ce..cf3fe3580c7 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -3979,7 +3979,7 @@ int spider_trx_check_link_idx_failed(
uint *conn_link_idx = spider->conn_link_idx;
int link_count = share->link_count;
uchar *conn_can_fo = spider->conn_can_fo;
- DBUG_ENTER("spider_trx_set_link_idx_for_all");
+ DBUG_ENTER("spider_trx_check_link_idx_failed");
for (roop_count = 0; roop_count < link_count; roop_count++)
{
if (