diff options
author | Nirbhay Choubey <nirbhay@mariadb.com> | 2016-11-18 20:01:31 -0500 |
---|---|---|
committer | Nirbhay Choubey <nirbhay@mariadb.com> | 2016-11-18 20:01:31 -0500 |
commit | d47d0d5095c8ab5df1dc181c35f9567fda8cc211 (patch) | |
tree | 0d729667a39457bb8eb9394b77d00672378d2fc7 | |
parent | af05becb4c78d843f34328931704d82faaa8f213 (diff) | |
download | mariadb-git-d47d0d5095c8ab5df1dc181c35f9567fda8cc211.tar.gz |
Refs: MW-317bb-10.1-galera-ctas
* Adding table level key for CTAS
* Skipping row key appending for CTAS
(Author : sjaakola <seppo.jaakola@iki.fi>)
-rw-r--r-- | sql/sql_insert.cc | 26 | ||||
-rw-r--r-- | sql/wsrep_mysqld.cc | 22 | ||||
-rw-r--r-- | sql/wsrep_mysqld.h | 13 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 1 | ||||
-rw-r--r-- | storage/xtradb/handler/ha_innodb.cc | 1 |
5 files changed, 47 insertions, 16 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index ac7fd93f0c0..11d000a4f68 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -4367,6 +4367,32 @@ bool select_create::send_eof() */ if (!table->s->tmp_table) { +#ifdef WITH_WSREP + /* + Append table level exclusive key for CTAS. + */ + wsrep_key_arr_t key_arr= {0, 0}; + wsrep_prepare_keys_for_isolation(thd, + create_table->db, + create_table->table_name, + table_list, + &key_arr); + int rcode = wsrep->append_key( + wsrep, + &thd->wsrep_ws_handle, + key_arr.keys, //&wkey, + key_arr.keys_len, + WSREP_KEY_EXCLUSIVE, + false); + wsrep_keys_free(&key_arr); + if (rcode) { + DBUG_PRINT("wsrep", ("row key failed: %d", rcode)); + WSREP_ERROR("Appending table key for CTAS failed: %s, %d", + thd->query() ? thd->query() : "void", rcode); + abort_result_set(); + DBUG_RETURN(true); + } +#endif /* WITH_WSREP */ trans_commit_stmt(thd); if (!(thd->variables.option_bits & OPTION_GTID_BEGIN)) trans_commit_implicit(thd); diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 0deb19dfc77..59dd988bd33 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1005,17 +1005,7 @@ bool wsrep_sync_wait (THD* thd, uint mask) return false; } -/* - * Helpers to deal with TOI key arrays - */ -typedef struct wsrep_key_arr -{ - wsrep_key_t* keys; - size_t keys_len; -} wsrep_key_arr_t; - - -static void wsrep_keys_free(wsrep_key_arr_t* key_arr) +void wsrep_keys_free(wsrep_key_arr_t* key_arr) { for (size_t i= 0; i < key_arr->keys_len; ++i) { @@ -1080,11 +1070,11 @@ static bool wsrep_prepare_key_for_isolation(const char* db, } /* Prepare key list from db/table and table_list */ -static bool wsrep_prepare_keys_for_isolation(THD* thd, - const char* db, - const char* table, - const TABLE_LIST* table_list, - wsrep_key_arr_t* ka) +bool wsrep_prepare_keys_for_isolation(THD* thd, + const char* db, + const char* table, + const TABLE_LIST* table_list, + wsrep_key_arr_t* ka) { ka->keys= 0; ka->keys_len= 0; diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index 04ccc1a7e45..2453d77394d 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -316,6 +316,19 @@ bool wsrep_create_like_table(THD* thd, TABLE_LIST* table, bool wsrep_node_is_donor(); bool wsrep_node_is_synced(); +typedef struct wsrep_key_arr +{ + wsrep_key_t* keys; + size_t keys_len; +} wsrep_key_arr_t; + +bool wsrep_prepare_keys_for_isolation(THD* thd, + const char* db, + const char* table, + const TABLE_LIST* table_list, + wsrep_key_arr_t* ka); +void wsrep_keys_free(wsrep_key_arr_t* key_arr); + #else /* WITH_WSREP */ #define WSREP(T) (0) diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 79d8ae0dc81..c88db8d2353 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -8328,6 +8328,7 @@ report_error: wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd) && !wsrep_consistency_check(user_thd) && + (sql_command != SQLCOM_CREATE_TABLE) && !wsrep_thd_ignore_table(user_thd)) { if (wsrep_append_keys(user_thd, false, record, NULL)) diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 01014a553ec..3d3b84d1668 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -9142,6 +9142,7 @@ report_error: wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && wsrep_on(user_thd) && !wsrep_consistency_check(user_thd) && + (sql_command != SQLCOM_CREATE_TABLE) && !wsrep_thd_ignore_table(user_thd)) { if (wsrep_append_keys(user_thd, false, record, NULL)) |