summaryrefslogtreecommitdiff
path: root/sql/wsrep_schema.cc
diff options
context:
space:
mode:
authorDaniel Black <daniel@mariadb.org>2021-02-25 20:05:35 +1100
committerDaniel Black <daniel@mariadb.org>2021-02-26 13:23:13 +1100
commit86d60fc9e7d903d06a4f5a5623b5d980f770d982 (patch)
tree096ebf076aeb1ad4d2663199e5e16c3ba4c24b8a /sql/wsrep_schema.cc
parente0ba68ba34f5623cfa3c61e2e1966971703297f5 (diff)
parentef96ec3b51998066790082f4028fec1c390ef36d (diff)
downloadmariadb-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.cc36
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);
}