diff options
author | Daniel Black <daniel@mariadb.org> | 2021-02-25 20:05:35 +1100 |
---|---|---|
committer | Daniel Black <daniel@mariadb.org> | 2021-02-26 13:23:13 +1100 |
commit | 86d60fc9e7d903d06a4f5a5623b5d980f770d982 (patch) | |
tree | 096ebf076aeb1ad4d2663199e5e16c3ba4c24b8a /sql/wsrep_schema.cc | |
parent | e0ba68ba34f5623cfa3c61e2e1966971703297f5 (diff) | |
parent | ef96ec3b51998066790082f4028fec1c390ef36d (diff) | |
download | mariadb-git-86d60fc9e7d903d06a4f5a5623b5d980f770d982.tar.gz |
Merge remote-tracking branch 'origin/10.4' into 10.5
Diffstat (limited to 'sql/wsrep_schema.cc')
-rw-r--r-- | sql/wsrep_schema.cc | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc index 1054c9e11bc..43ddcb93abb 100644 --- a/sql/wsrep_schema.cc +++ b/sql/wsrep_schema.cc @@ -584,14 +584,24 @@ static int end_index_scan(TABLE* table) { return 0; } -static void make_key(TABLE* table, uchar* key, key_part_map* map, int parts) { +static void make_key(TABLE* table, uchar** key, key_part_map* map, int parts) { uint prefix_length= 0; KEY_PART_INFO* key_part= table->key_info->key_part; + for (int i=0; i < parts; i++) prefix_length += key_part[i].store_length; + *map= make_prev_keypart_map(parts); - key_copy(key, table->record[0], table->key_info, prefix_length); + + if (!(*key= (uchar *) my_malloc(PSI_NOT_INSTRUMENTED, prefix_length + 1, MYF(MY_WME)))) + { + WSREP_ERROR("Failed to allocate memory for key prefix_length %u", prefix_length); + assert(0); + } + + key_copy(*key, table->record[0], table->key_info, prefix_length); } + } /* namespace Wsrep_schema_impl */ @@ -976,7 +986,7 @@ int Wsrep_schema::update_fragment_meta(THD* thd, Wsrep_schema_impl::binlog_off binlog_off(thd); int error; - uchar key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH]; + uchar *key=NULL; key_part_map key_map= 0; TABLE* frag_table= 0; @@ -991,7 +1001,7 @@ int Wsrep_schema::update_fragment_meta(THD* thd, Wsrep_schema_impl::store(frag_table, 0, ws_meta.server_id()); Wsrep_schema_impl::store(frag_table, 1, ws_meta.transaction_id().get()); Wsrep_schema_impl::store(frag_table, 2, -1); - Wsrep_schema_impl::make_key(frag_table, key, &key_map, 3); + Wsrep_schema_impl::make_key(frag_table, &key, &key_map, 3); if ((error= Wsrep_schema_impl::init_for_index_scan(frag_table, key, key_map))) @@ -1005,9 +1015,11 @@ int Wsrep_schema::update_fragment_meta(THD* thd, } Wsrep_schema_impl::finish_stmt(thd); thd->lex->restore_backup_query_tables_list(&query_tables_list_backup); + my_free(key); DBUG_RETURN(1); } + my_free(key); /* Copy the original record to frag_table->record[1] */ store_record(frag_table, record[1]); @@ -1042,7 +1054,7 @@ static int remove_fragment(THD* thd, seqno.get()); int ret= 0; int error; - uchar key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH]; + uchar *key= NULL; key_part_map key_map= 0; DBUG_ASSERT(server_id.is_undefined() == false); @@ -1056,7 +1068,7 @@ static int remove_fragment(THD* thd, Wsrep_schema_impl::store(frag_table, 0, server_id); Wsrep_schema_impl::store(frag_table, 1, transaction_id.get()); Wsrep_schema_impl::store(frag_table, 2, seqno.get()); - Wsrep_schema_impl::make_key(frag_table, key, &key_map, 3); + Wsrep_schema_impl::make_key(frag_table, &key, &key_map, 3); if ((error= Wsrep_schema_impl::init_for_index_scan(frag_table, key, @@ -1078,6 +1090,8 @@ static int remove_fragment(THD* thd, ret= 1; } + if (key) + my_free(key); Wsrep_schema_impl::end_index_scan(frag_table); return ret; } @@ -1168,7 +1182,7 @@ int Wsrep_schema::replay_transaction(THD* orig_thd, int ret= 1; int error; TABLE* frag_table= 0; - uchar key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH]; + uchar *key=NULL; key_part_map key_map= 0; for (std::vector<wsrep::seqno>::const_iterator i= fragments.begin(); @@ -1185,7 +1199,7 @@ int Wsrep_schema::replay_transaction(THD* orig_thd, Wsrep_schema_impl::store(frag_table, 0, ws_meta.server_id()); Wsrep_schema_impl::store(frag_table, 1, ws_meta.transaction_id().get()); Wsrep_schema_impl::store(frag_table, 2, i->get()); - Wsrep_schema_impl::make_key(frag_table, key, &key_map, 3); + Wsrep_schema_impl::make_key(frag_table, &key, &key_map, 3); int error= Wsrep_schema_impl::init_for_index_scan(frag_table, key, @@ -1232,6 +1246,7 @@ int Wsrep_schema::replay_transaction(THD* orig_thd, Wsrep_schema_impl::finish_stmt(&thd); DBUG_RETURN(1); } + error= Wsrep_schema_impl::init_for_index_scan(frag_table, key, key_map); @@ -1245,6 +1260,7 @@ int Wsrep_schema::replay_transaction(THD* orig_thd, } error= Wsrep_schema_impl::delete_row(frag_table); + if (error) { WSREP_WARN("Could not delete row from streaming log table: %d", error); @@ -1254,8 +1270,12 @@ int Wsrep_schema::replay_transaction(THD* orig_thd, } Wsrep_schema_impl::end_index_scan(frag_table); Wsrep_schema_impl::finish_stmt(&thd); + my_free(key); + key= NULL; } + if (key) + my_free(key); DBUG_RETURN(ret); } |