summaryrefslogtreecommitdiff
path: root/storage/maria/ma_write.c
diff options
context:
space:
mode:
Diffstat (limited to 'storage/maria/ma_write.c')
-rw-r--r--storage/maria/ma_write.c27
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);
}