diff options
Diffstat (limited to 'storage/maria/ma_write.c')
-rw-r--r-- | storage/maria/ma_write.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/storage/maria/ma_write.c b/storage/maria/ma_write.c index 126554fffdb..faf47929973 100644 --- a/storage/maria/ma_write.c +++ b/storage/maria/ma_write.c @@ -88,7 +88,7 @@ int maria_write(MARIA_HA *info, uchar *record) MARIA_SHARE *share= info->s; uint i; int save_errno; - MARIA_RECORD_POS filepos; + MARIA_RECORD_POS filepos, oldpos= info->cur_row.lastpos; uchar *buff; my_bool lock_tree= share->lock_key_trees; my_bool fatal_error; @@ -302,7 +302,7 @@ int maria_write(MARIA_HA *info, uchar *record) share->state.changed|= STATE_NOT_MOVABLE | STATE_NOT_ZEROFILLED; info->state->changed= 1; - info->cur_row.lastpos= filepos; + info->cur_row.lastpos= oldpos; _ma_writeinfo(info, WRITEINFO_UPDATE_KEYFILE); if (info->invalidator != 0) { @@ -1676,7 +1676,7 @@ static int keys_compare(bulk_insert_param *param, uchar *key1, uchar *key2) } -static void keys_free(void* key_arg, TREE_FREE mode, void *param_arg) +static int keys_free(void* key_arg, TREE_FREE mode, void *param_arg) { /* Probably I can use info->lastkey here, but I'm not sure, @@ -1696,7 +1696,7 @@ static void keys_free(void* key_arg, TREE_FREE mode, void *param_arg) mysql_rwlock_wrlock(&keyinfo->root_lock); keyinfo->version++; } - return; + return 0; case free_free: /* Note: keylen doesn't contain transid lengths */ keylen= _ma_keylength(keyinfo, key); @@ -1712,13 +1712,13 @@ static void keys_free(void* key_arg, TREE_FREE mode, void *param_arg) */ memcpy(lastkey, key, tmp_key.data_length + tmp_key.ref_length); _ma_ck_write_btree(param->info, &tmp_key); - return; + return 0; case free_end: if (share->lock_key_trees) mysql_rwlock_unlock(&keyinfo->root_lock); - return; + return 0; } - return; + return 0; } @@ -1792,8 +1792,10 @@ void maria_flush_bulk_insert(MARIA_HA *info, uint inx) } } -void maria_end_bulk_insert(MARIA_HA *info) + +int maria_end_bulk_insert(MARIA_HA *info, my_bool abort) { + int first_error= 0; DBUG_ENTER("maria_end_bulk_insert"); if (info->bulk_insert) { @@ -1802,15 +1804,20 @@ void maria_end_bulk_insert(MARIA_HA *info) { if (is_tree_inited(&info->bulk_insert[i])) { + int error; if (info->s->deleting) reset_free_element(&info->bulk_insert[i]); - delete_tree(&info->bulk_insert[i]); + if ((error= delete_tree(&info->bulk_insert[i], abort))) + { + first_error= first_error ? first_error : error; + abort= 1; + } } } my_free(info->bulk_insert); info->bulk_insert= 0; } - DBUG_VOID_RETURN; + DBUG_RETURN(first_error); } |