diff options
author | unknown <monty@hundin.mysql.fi> | 2001-09-17 17:53:27 +0300 |
---|---|---|
committer | unknown <monty@hundin.mysql.fi> | 2001-09-17 17:53:27 +0300 |
commit | 28097f40d3d13a1d42ef7a98b2ebc3330fd41a83 (patch) | |
tree | 0bf9a91a591cb8a20364f84c6e12048a66a548f5 /myisam | |
parent | 3324d0a7ffb4c1d7ec2335c3e423bcbfaa963bce (diff) | |
download | mariadb-git-28097f40d3d13a1d42ef7a98b2ebc3330fd41a83.tar.gz |
Fixed locking problem when using bulk insert
Fixed array overrun when using drop_db
Portability fixes
BitKeeper/etc/ignore:
Added libmysqld/examples/completion_hash.cc libmysqld/examples/completion_hash.h libmysqld/examples/my_readline.h libmysqld/examples/mysql.cc libmysqld/examples/mysqltest.c libmysqld/examples/readline.cc libmysqld/examples/sql_string.cc libmysqld/examples/sql_string.h to the ignore list
acinclude.m4:
Fixed reference to top_builddir
myisam/mi_write.c:
Fixed locking problem when using bulk insert
sql/sql_db.cc:
Fixed array overrun when using drop_db
Diffstat (limited to 'myisam')
-rw-r--r-- | myisam/mi_write.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/myisam/mi_write.c b/myisam/mi_write.c index 81064dd1d6a..5b3e8d541c7 100644 --- a/myisam/mi_write.c +++ b/myisam/mi_write.c @@ -44,11 +44,12 @@ int _mi_ck_write_btree(register MI_INFO *info, uint keynr, uchar *key, int mi_write(MI_INFO *info, byte *record) { + MYISAM_SHARE *share=info->s; uint i; int save_errno; my_off_t filepos; uchar *buff; - MYISAM_SHARE *share=info->s; + my_bool lock_tree= share->concurrent_insert; DBUG_ENTER("mi_write"); DBUG_PRINT("enter",("isam: %d data: %d",info->s->kfile,info->dfile)); @@ -99,7 +100,10 @@ int mi_write(MI_INFO *info, byte *record) { if (((ulonglong) 1 << i) & share->state.key_map) { - if (share->concurrent_insert && ! info->bulk_insert) + bool local_lock_tree= (lock_tree && + !(info->bulk_insert && + is_tree_inited(& info->bulk_insert[i]))); + if (local_lock_tree) { rw_wrlock(&share->key_root_lock[i]); share->keyinfo[i].version++; @@ -108,7 +112,7 @@ int mi_write(MI_INFO *info, byte *record) { if (_mi_ft_add(info,i,(char*) buff,record,filepos)) { - if (share->concurrent_insert) + if (local_lock_tree) rw_unlock(&share->key_root_lock[i]); DBUG_PRINT("error",("Got error: %d on write",my_errno)); goto err; @@ -119,13 +123,13 @@ int mi_write(MI_INFO *info, byte *record) uint key_length=_mi_make_key(info,i,buff,record,filepos); if (_mi_ck_write(info,i,buff,key_length)) { - if (share->concurrent_insert && ! info->bulk_insert) + if (local_lock_tree) rw_unlock(&share->key_root_lock[i]); DBUG_PRINT("error",("Got error: %d on write",my_errno)); goto err; } } - if (share->concurrent_insert) + if (local_lock_tree) rw_unlock(&share->key_root_lock[i]); } } @@ -157,13 +161,16 @@ err: { if (((ulonglong) 1 << i) & share->state.key_map) { - if (share->concurrent_insert) + bool local_lock_tree= (lock_tree && + !(info->bulk_insert && + is_tree_inited(& info->bulk_insert[i]))); + if (local_lock_tree) rw_wrlock(&share->key_root_lock[i]); if (share->keyinfo[i].flag & HA_FULLTEXT) { if (_mi_ft_del(info,i,(char*) buff,record,filepos)) { - if (share->concurrent_insert) + if (local_lock_tree) rw_unlock(&share->key_root_lock[i]); break; } @@ -173,12 +180,12 @@ err: uint key_length=_mi_make_key(info,i,buff,record,filepos); if (_mi_ck_delete(info,i,buff,key_length)) { - if (share->concurrent_insert) + if (local_lock_tree) rw_unlock(&share->key_root_lock[i]); break; } } - if (share->concurrent_insert) + if (local_lock_tree) rw_unlock(&share->key_root_lock[i]); } } @@ -212,6 +219,7 @@ int _mi_ck_write(MI_INFO *info, uint keynr, uchar *key, uint key_length) } } /* _mi_ck_write */ + /********************************************************************** * Normal insert code * **********************************************************************/ @@ -724,6 +732,7 @@ int _mi_ck_write_tree(register MI_INFO *info, uint keynr, uchar *key, DBUG_RETURN(error); } /* _mi_ck_write_tree */ + /* typeof(_mi_keys_compare)=qsort_cmp2 */ static int keys_compare(bulk_insert_param *param, uchar *key1, uchar *key2) { @@ -732,6 +741,7 @@ static int keys_compare(bulk_insert_param *param, uchar *key1, uchar *key2) key1, key2, USE_WHOLE_KEY, SEARCH_SAME, ¬_used); } + static int keys_free(uchar *key, TREE_FREE mode, bulk_insert_param *param) { /* probably I can use info->lastkey here, but I'm not sure, |