diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_31463.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_31463.result new file mode 100644 index 00000000000..78503c66cbb --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_31463.result @@ -0,0 +1,27 @@ +# +# MDEV-31463 SIGSEGV in server_mysql_send_query | server_mysql_real_query +# +for master_1 +for child2 +for child3 +CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +SET @old_wait_timeout = @@global.wait_timeout; +SET GLOBAL wait_timeout=1; +CREATE TABLE t (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv_mdev_31463"'; +XA START 'a'; +INSERT INTO t VALUES (0,0,0,0); +ERROR 21S01: Column count doesn't match value count at row 1 +SELECT SLEEP (1); +SLEEP (1) +0 +INSERT INTO t VALUES (1,2,3),(4,5,6),(7,8,9); +ERROR 08S01: Got an error writing communication packets +SELECT * FROM information_schema.key_column_usage; +XA END 'a'; +XA PREPARE 'a'; +XA COMMIT 'a'; +SET GLOBAL wait_timeout=@old_wait_timeout; +drop table t; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_31463.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_31463.test new file mode 100644 index 00000000000..4722cf06f2a --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_31463.test @@ -0,0 +1,37 @@ +--echo # +--echo # MDEV-31463 SIGSEGV in server_mysql_send_query | server_mysql_real_query +--echo # + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--let $srv=srv_mdev_31463 +evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +SET @old_wait_timeout = @@global.wait_timeout; +SET GLOBAL wait_timeout=1; +eval CREATE TABLE t (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "$srv"'; +XA START 'a'; +--error ER_WRONG_VALUE_COUNT_ON_ROW +INSERT INTO t VALUES (0,0,0,0); +SELECT SLEEP (1); +--error ER_NET_ERROR_ON_WRITE +INSERT INTO t VALUES (1,2,3),(4,5,6),(7,8,9); +--disable_result_log +SELECT * FROM information_schema.key_column_usage; +--enable_result_log + +XA END 'a'; +XA PREPARE 'a'; +XA COMMIT 'a'; +SET GLOBAL wait_timeout=@old_wait_timeout; +drop table t; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 555ab33d777..b7d686a9d55 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -13444,18 +13444,19 @@ int spider_mbase_handler::sts_mode_exchange( } /** Set the session lock wait time out */ -int spider_db_mbase::set_lock_wait_timeout(uint timeout) +static int spider_set_lock_wait_timeout(uint seconds, SPIDER_CONN *conn, + int *need_mon) { - String query(0); + char query[512];; int error_num; DBUG_ENTER("spider_db_set_lock_wait_timeout"); - query.append(STRING_WITH_LEN( - "set @old_lock_wait_timeout=@@session.lock_wait_timeout;" - "set session lock_wait_timeout=")); - query.append_ulonglong(timeout); - query.append(STRING_WITH_LEN(";")); - if ((error_num = exec_query(query.c_ptr(), query.length(), -1))) - DBUG_RETURN(error_num); + size_t query_len = + my_snprintf(query, sizeof(query), + "set @old_lock_wait_timeout=@@session.lock_wait_timeout;" + "set session lock_wait_timeout=%d;", + seconds); + if (spider_db_query(conn, query, query_len, -1, need_mon)) + DBUG_RETURN(spider_db_errorno(conn)); spider_db_result *result; do { st_spider_db_request_key request_key= {1, 1, NULL, 1, NULL}; @@ -13543,9 +13544,10 @@ int spider_mbase_handler::show_table_status( spider_setup_for_query(spider, conn, link_idx); spider_conn_set_timeout_from_share( conn, link_idx, spider->wide_handler->trx->thd, share); + if ((error_num = spider_db_set_names(spider, conn, link_idx)) || - (error_num = - ((spider_db_mbase *) conn->db_conn)->set_lock_wait_timeout(1)) || + (error_num = spider_set_lock_wait_timeout( + 1, conn, &spider->need_mons[link_idx])) || /* Executes the `show table status` query */ (spider_db_query( conn, @@ -13567,7 +13569,7 @@ int spider_mbase_handler::show_table_status( spider->wide_handler->trx->thd, share); if ((error_num = - ((spider_db_mbase *) conn->db_conn)->set_lock_wait_timeout(1))) + spider_set_lock_wait_timeout(1, conn, &spider->need_mons[link_idx]))) DBUG_RETURN(spider_teardown_after_query(conn, error_num, true)); if (spider_db_query( conn, @@ -13701,7 +13703,7 @@ int spider_mbase_handler::show_index( spider->wide_handler->trx->thd, share); if ((error_num = spider_db_set_names(spider, conn, link_idx)) || (error_num = - ((spider_db_mbase *) conn->db_conn)->set_lock_wait_timeout(1)) || + spider_set_lock_wait_timeout(1, conn, &spider->need_mons[link_idx])) || (spider_db_query( conn, mysql_share->show_index[pos].ptr(), @@ -13722,7 +13724,7 @@ int spider_mbase_handler::show_index( spider->wide_handler->trx->thd, share); if ((error_num = - ((spider_db_mbase *) conn->db_conn)->set_lock_wait_timeout(1))) + spider_set_lock_wait_timeout(1, conn, &spider->need_mons[link_idx]))) DBUG_RETURN(spider_teardown_after_query(conn, error_num, true)); if (spider_db_query( conn, diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h index 35f4f8392d9..8cab31a1226 100644 --- a/storage/spider/spd_db_mysql.h +++ b/storage/spider/spd_db_mysql.h @@ -514,8 +514,6 @@ public: int *need_mon ); - /** Set the global lock wait time out */ - int set_lock_wait_timeout(uint timeout); /** Reset the global lock wait time out */ int reset_lock_wait_timeout();