diff options
author | unknown <hf@deer.(none)> | 2003-07-19 13:51:15 +0500 |
---|---|---|
committer | unknown <hf@deer.(none)> | 2003-07-19 13:51:15 +0500 |
commit | 0fd6f4049de2f4ba2a4f4197a7ef596ec0598eb6 (patch) | |
tree | d65486ebb8885f46d6e3dea736cfb2fffb4b80f7 | |
parent | 906dc7df753ea5107957c7470f43405f92a71ed0 (diff) | |
parent | 02808985ddbd3102a51fe7a008d9f31a3ed169e2 (diff) | |
download | mariadb-git-0fd6f4049de2f4ba2a4f4197a7ef596ec0598eb6.tar.gz |
Merge abotchkov@bk-internal.mysql.com:/home/bk/mysql-4.0
into deer.(none):/home/hf/work/mysql-4.0
-rw-r--r-- | myisam/mi_locking.c | 8 | ||||
-rw-r--r-- | myisam/myisamdef.h | 1 | ||||
-rw-r--r-- | sql/ha_myisam.cc | 9 |
3 files changed, 14 insertions, 4 deletions
diff --git a/myisam/mi_locking.c b/myisam/mi_locking.c index cbde05d31f5..648c447ae30 100644 --- a/myisam/mi_locking.c +++ b/myisam/mi_locking.c @@ -39,6 +39,14 @@ int mi_lock_database(MI_INFO *info, int lock_type) if (share->options & HA_OPTION_READ_ONLY_DATA || info->lock_type == lock_type) DBUG_RETURN(0); + if (lock_type == MI_TEMPORARY_TABLE) + { + ++share->w_locks; + ++share->tot_locks; + info->lock_type= lock_type; + DBUG_RETURN(0); + } + flag=error=0; pthread_mutex_lock(&share->intern_lock); if (share->kfile >= 0) /* May only be false on windows */ diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h index 7631b245b9b..9c2f34990ed 100644 --- a/myisam/myisamdef.h +++ b/myisam/myisamdef.h @@ -101,6 +101,7 @@ typedef struct st_mi_state_info #define MI_COLUMNDEF_SIZE (2*3+1) #define MI_BASE_INFO_SIZE (5*8 + 8*4 + 4 + 4*2 + 16) #define MI_INDEX_BLOCK_MARGIN 16 /* Safety margin for .MYI tables */ +#define MI_TEMPORARY_TABLE ((1 & ~F_RDLCK) | (2 & ~F_WRLCK) | (4 & ~F_UNLCK)) typedef struct st_mi_base_info { diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 595123f7ac1..969fa3232c3 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -559,7 +559,8 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool optimize) strmov(fixed_name,file->filename); // Don't lock tables if we have used LOCK TABLE - if (!thd->locked_tables && mi_lock_database(file,F_WRLCK)) + if (!thd->locked_tables && + mi_lock_database(file, table->tmp_table ? MI_TEMPORARY_TABLE : F_WRLCK)) { mi_check_print_error(¶m,ER(ER_CANT_LOCK),my_errno); DBUG_RETURN(HA_ADMIN_FAILED); @@ -999,9 +1000,9 @@ int ha_myisam::delete_table(const char *name) int ha_myisam::external_lock(THD *thd, int lock_type) { - if (!table->tmp_table) - return mi_lock_database(file,lock_type); - return 0; + return mi_lock_database(file, !table->tmp_table ? + lock_type : ((lock_type == F_UNLCK) ? + F_UNLCK : MI_TEMPORARY_TABLE)); } |