Commit 02808985 authored by unknown's avatar unknown

Proposed bugfix for #712

Monty revoked any locks for temporary tables in
ha_myisam::external_lock()
But further code bans using write cache on nonlocked tables
this makes operations much slower


myisam/mi_locking.c:
  Handling of MI_TEMPORARY_TABLE lock
myisam/myisamdef.h:
  defining of MI_TEMPORARY_TABLE
sql/ha_myisam.cc:
  now we lock temporary tables using MI_TEMPORARY_TABLE lock
parent c4381bb0
...@@ -39,6 +39,14 @@ int mi_lock_database(MI_INFO *info, int lock_type) ...@@ -39,6 +39,14 @@ int mi_lock_database(MI_INFO *info, int lock_type)
if (share->options & HA_OPTION_READ_ONLY_DATA || if (share->options & HA_OPTION_READ_ONLY_DATA ||
info->lock_type == lock_type) info->lock_type == lock_type)
DBUG_RETURN(0); 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; flag=error=0;
pthread_mutex_lock(&share->intern_lock); pthread_mutex_lock(&share->intern_lock);
if (share->kfile >= 0) /* May only be false on windows */ if (share->kfile >= 0) /* May only be false on windows */
......
...@@ -101,6 +101,7 @@ typedef struct st_mi_state_info ...@@ -101,6 +101,7 @@ typedef struct st_mi_state_info
#define MI_COLUMNDEF_SIZE (2*3+1) #define MI_COLUMNDEF_SIZE (2*3+1)
#define MI_BASE_INFO_SIZE (5*8 + 8*4 + 4 + 4*2 + 16) #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_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 typedef struct st_mi_base_info
{ {
......
...@@ -559,7 +559,8 @@ int ha_myisam::repair(THD *thd, MI_CHECK &param, bool optimize) ...@@ -559,7 +559,8 @@ int ha_myisam::repair(THD *thd, MI_CHECK &param, bool optimize)
strmov(fixed_name,file->filename); strmov(fixed_name,file->filename);
// Don't lock tables if we have used LOCK TABLE // 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(&param,ER(ER_CANT_LOCK),my_errno); mi_check_print_error(&param,ER(ER_CANT_LOCK),my_errno);
DBUG_RETURN(HA_ADMIN_FAILED); DBUG_RETURN(HA_ADMIN_FAILED);
...@@ -999,9 +1000,9 @@ int ha_myisam::delete_table(const char *name) ...@@ -999,9 +1000,9 @@ int ha_myisam::delete_table(const char *name)
int ha_myisam::external_lock(THD *thd, int lock_type) int ha_myisam::external_lock(THD *thd, int lock_type)
{ {
if (!table->tmp_table) return mi_lock_database(file, !table->tmp_table ?
return mi_lock_database(file,lock_type); lock_type : ((lock_type == F_UNLCK) ?
return 0; F_UNLCK : MI_TEMPORARY_TABLE));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment