diff options
-rw-r--r-- | Docs/manual.texi | 3 | ||||
-rw-r--r-- | include/my_pthread.h | 1 | ||||
-rw-r--r-- | include/myisammrg.h | 2 | ||||
-rw-r--r-- | myisam/ft_stopwords.c | 1 | ||||
-rw-r--r-- | myisammrg/myrg_open.c | 14 | ||||
-rw-r--r-- | myisammrg/myrg_queue.c | 31 | ||||
-rw-r--r-- | myisammrg/myrg_rfirst.c | 2 | ||||
-rw-r--r-- | myisammrg/myrg_rkey.c | 2 | ||||
-rw-r--r-- | mysys/my_thr_init.c | 7 | ||||
-rw-r--r-- | mysys/my_winthread.c | 10 | ||||
-rw-r--r-- | mysys/thr_mutex.c | 14 | ||||
-rw-r--r-- | sql/ha_myisammrg.cc | 2 | ||||
-rw-r--r-- | sql/mysqld.cc | 2 |
13 files changed, 62 insertions, 29 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index 722cf0356c0..f72c8c30d5a 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -40860,6 +40860,9 @@ Fixed @code{DISTINCT} with calculated columns. @itemize @bullet @item +@code{mysqldump} on a @code{MERGE} table doesn't include the current +mapped tables. +@item For the moment @code{MATCH} only works with @code{SELECT} statements. @item You cannot build in another directory when using diff --git a/include/my_pthread.h b/include/my_pthread.h index 71ad5e42bf2..69d472bf266 100644 --- a/include/my_pthread.h +++ b/include/my_pthread.h @@ -60,6 +60,7 @@ typedef int pthread_mutexattr_t; #define pthread_handler_decl(A,B) unsigned __cdecl A(void *B) typedef unsigned (__cdecl *pthread_handler)(void *); +void win_pthread_init(void); int win_pthread_setspecific(void *A,void *B,uint length); int pthread_create(pthread_t *,pthread_attr_t *,pthread_handler,void *); int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); diff --git a/include/myisammrg.h b/include/myisammrg.h index 6b1124fa180..a797c954614 100644 --- a/include/myisammrg.h +++ b/include/myisammrg.h @@ -59,7 +59,7 @@ typedef struct st_myrg_info ulonglong records; /* records in tables */ ulonglong del; /* Removed records */ ulonglong data_file_length; - uint tables,options,reclength; + uint tables,options,reclength,keys; my_bool cache_in_use; LIST open_list; QUEUE by_key; diff --git a/myisam/ft_stopwords.c b/myisam/ft_stopwords.c index ce08fee9e1e..d796b87ed71 100644 --- a/myisam/ft_stopwords.c +++ b/myisam/ft_stopwords.c @@ -72,6 +72,7 @@ void ft_free_stopwords() if (stopwords3) { delete_tree(stopwords3); /* purecov: inspected */ + my_free((char*) stopwords3,MYF(0)); stopwords3=0; } } diff --git a/myisammrg/myrg_open.c b/myisammrg/myrg_open.c index 7f80a88dddc..9159b4edb0f 100644 --- a/myisammrg/myrg_open.c +++ b/myisammrg/myrg_open.c @@ -86,6 +86,7 @@ int handle_locking; *m_info=info; m_info->open_tables=(MYRG_TABLE *) (m_info+1); m_info->tables=files; + errpos=2; for (i=files ; i-- > 0 ; ) { @@ -104,16 +105,21 @@ int handle_locking; m_info->open_tables[i].file_offset=(my_off_t) file_offset; file_offset+=m_info->open_tables[i].table->state->data_file_length; } - errpos=2; if (sizeof(my_off_t) == 4 && file_offset > (ulonglong) (ulong) ~0L) { my_errno=HA_ERR_RECORD_FILE_FULL; goto err; } /* Allocate memory for queue */ - if (m_info->open_tables->table->s->base.keys && - _myrg_init_queue(m_info,0,HA_READ_KEY_EXACT)) - goto err; + m_info->keys=0; + if (files) + { + if ((m_info->keys=m_info->open_tables->table->s->base.keys) && + _myrg_init_queue(m_info,0,HA_READ_KEY_EXACT)) + goto err; + } + else + bzero((char*) &m_info->by_key,sizeof(m_info->by_key)); m_info->end_table=m_info->open_tables+files; m_info->last_used_table=m_info->open_tables; diff --git a/myisammrg/myrg_queue.c b/myisammrg/myrg_queue.c index 4d94f984722..d6f831db48c 100644 --- a/myisammrg/myrg_queue.c +++ b/myisammrg/myrg_queue.c @@ -34,21 +34,24 @@ int _myrg_init_queue(MYRG_INFO *info,int inx,enum ha_rkey_function search_flag) int error=0; QUEUE *q= &(info->by_key); - if (!is_queue_inited(q)) + if (inx < (int) info->keys) { - if (init_queue(q,info->tables, 0, - (myisam_readnext_vec[search_flag] == SEARCH_SMALLER), - queue_key_cmp, - info->open_tables->table->s->keyinfo[inx].seg)) - error=my_errno; - } - else - { - if (reinit_queue(q,info->tables, 0, - (myisam_readnext_vec[search_flag] == SEARCH_SMALLER), - queue_key_cmp, - info->open_tables->table->s->keyinfo[inx].seg)) - error=my_errno; + if (!is_queue_inited(q)) + { + if (init_queue(q,info->tables, 0, + (myisam_readnext_vec[search_flag] == SEARCH_SMALLER), + queue_key_cmp, + info->open_tables->table->s->keyinfo[inx].seg)) + error=my_errno; + } + else + { + if (reinit_queue(q,info->tables, 0, + (myisam_readnext_vec[search_flag] == SEARCH_SMALLER), + queue_key_cmp, + info->open_tables->table->s->keyinfo[inx].seg)) + error=my_errno; + } } return error; } diff --git a/myisammrg/myrg_rfirst.c b/myisammrg/myrg_rfirst.c index 3f29414f076..0625e848660 100644 --- a/myisammrg/myrg_rfirst.c +++ b/myisammrg/myrg_rfirst.c @@ -27,7 +27,7 @@ int myrg_rfirst(MYRG_INFO *info, byte *buf, int inx) if (_myrg_init_queue(info,inx,HA_READ_KEY_OR_NEXT)) return my_errno; - for (table=info->open_tables ; table < info->end_table ; table++) + for (table=info->open_tables ; table != info->end_table ; table++) { if ((err=mi_rfirst(table->table,NULL,inx))) { diff --git a/myisammrg/myrg_rkey.c b/myisammrg/myrg_rkey.c index 465d61ce3c6..d66d5ec3fe7 100644 --- a/myisammrg/myrg_rkey.c +++ b/myisammrg/myrg_rkey.c @@ -49,7 +49,7 @@ int myrg_rkey(MYRG_INFO *info,byte *record,int inx, const byte *key, if (_myrg_init_queue(info,inx,search_flag)) return my_errno; - for (table=info->open_tables ; table < info->end_table ; table++) + for (table=info->open_tables ; table != info->end_table ; table++) { mi=table->table; diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c index 6b75444f3fc..f24c8393ba9 100644 --- a/mysys/my_thr_init.c +++ b/mysys/my_thr_init.c @@ -35,9 +35,6 @@ pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_keycache, #ifndef HAVE_LOCALTIME_R pthread_mutex_t LOCK_localtime_r; #endif -#ifdef __WIN__ -pthread_mutex_t THR_LOCK_thread; -#endif /* FIXME Note. TlsAlloc does not set an auto destructor, so the function my_thread_global_free must be called from @@ -60,7 +57,7 @@ my_bool my_thread_global_init(void) pthread_mutex_init(&THR_LOCK_net,NULL); pthread_mutex_init(&THR_LOCK_charset,NULL); #ifdef __WIN__ - pthread_mutex_init(&THR_LOCK_thread,NULL); + win_pthread_init(); #endif #ifndef HAVE_LOCALTIME_R pthread_mutex_init(&LOCK_localtime_r,NULL); @@ -78,7 +75,7 @@ void my_thread_global_end(void) static long thread_id=0; /* - We can't use mutex_locks here if we re using windows as + We can't use mutex_locks here if we are using windows as we may have compiled the program with SAFE_MUTEX, in which case the checking of mutex_locks will not work until the pthread_self thread specific variable is initialized. diff --git a/mysys/my_winthread.c b/mysys/my_winthread.c index e410121af98..6a99fa0bb02 100644 --- a/mysys/my_winthread.c +++ b/mysys/my_winthread.c @@ -19,13 +19,16 @@ ** Simulation of posix threads calls for WIN95 and NT *****************************************************************************/ +/* SAFE_MUTEX will not work until the thread structure is up to date */ +#undef SAFE_MUTEX + #include "mysys_priv.h" #if defined(THREAD) && defined(__WIN__) #include <m_string.h> #undef getpid #include <process.h> -extern pthread_mutex_t THR_LOCK_thread; +static pthread_mutex_t THR_LOCK_thread; struct pthread_map { @@ -34,6 +37,11 @@ struct pthread_map void *param; }; +void win_pthread_init(void) +{ + pthread_mutex_init(&THR_LOCK_thread,NULL); +} + /* ** We have tried to use '_beginthreadex' instead of '_beginthread' here ** but in this case the program leaks about 512 characters for each diff --git a/mysys/thr_mutex.c b/mysys/thr_mutex.c index 73d1d24d9a4..149a30a4b24 100644 --- a/mysys/thr_mutex.c +++ b/mysys/thr_mutex.c @@ -67,6 +67,7 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line) { fprintf(stderr,"safe_mutex: Trying to lock mutex at %s, line %d, when the mutex was already locked at %s, line %d\n", file,line,mp->file,mp->line); + fflush(stderr); abort(); } pthread_mutex_unlock(&mp->global); @@ -75,11 +76,13 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line) { fprintf(stderr,"Got error %d when trying to lock mutex at %s, line %d\n", error, file, line); + fflush(stderr); abort(); } if (mp->count++) { fprintf(stderr,"safe_mutex: Error in thread libray: Got mutex at %s, line %d more than 1 time\n", file,line); + fflush(stderr); abort(); } mp->thread=pthread_self(); @@ -98,12 +101,14 @@ int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line) { fprintf(stderr,"safe_mutex: Trying to unlock mutex that wasn't locked at %s, line %d\n Last used at %s, line: %d\n", file,line,mp->file ? mp->file : "",mp->line); + fflush(stderr); abort(); } if (!pthread_equal(pthread_self(),mp->thread)) { fprintf(stderr,"safe_mutex: Trying to unlock mutex at %s, line %d that was locked by another thread at: %s, line: %d\n", file,line,mp->file,mp->line); + fflush(stderr); abort(); } mp->count--; @@ -115,6 +120,7 @@ int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line) if (error) { fprintf(stderr,"safe_mutex: Got error: %d when trying to unlock mutex at %s, line %d\n", error, file, line); + fflush(stderr); abort(); } #endif /* __WIN__ */ @@ -131,12 +137,14 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file, if (mp->count == 0) { fprintf(stderr,"safe_mutex: Trying to cond_wait on a unlocked mutex at %s, line %d\n",file,line); + fflush(stderr); abort(); } if (!pthread_equal(pthread_self(),mp->thread)) { fprintf(stderr,"safe_mutex: Trying to cond_wait on a mutex at %s, line %d that was locked by another thread at: %s, line: %d\n", file,line,mp->file,mp->line); + fflush(stderr); abort(); } @@ -144,6 +152,7 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file, { fprintf(stderr,"safe_mutex: Count was %d on locked mutex at %s, line %d\n", mp->count+1, file, line); + fflush(stderr); abort(); } pthread_mutex_unlock(&mp->global); @@ -152,6 +161,7 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file, if (error) { fprintf(stderr,"safe_mutex: Got error: %d when doing a safe_mutex_wait at %s, line %d\n", error, file, line); + fflush(stderr); abort(); } if (mp->count++) @@ -159,6 +169,7 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file, fprintf(stderr, "safe_mutex: Count was %d in thread %lx when locking mutex at %s, line %d\n", mp->count-1, my_thread_id(), file, line); + fflush(stderr); abort(); } mp->thread=pthread_self(); @@ -178,6 +189,7 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp, if (mp->count != 1 || !pthread_equal(pthread_self(),mp->thread)) { fprintf(stderr,"safe_mutex: Trying to cond_wait at %s, line %d on a not hold mutex\n",file,line); + fflush(stderr); abort(); } mp->count--; /* Mutex will be released */ @@ -195,6 +207,7 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp, fprintf(stderr, "safe_mutex: Count was %d in thread %lx when locking mutex at %s, line %d (error: %d)\n", mp->count-1, my_thread_id(), file, line, error); + fflush(stderr); abort(); } mp->thread=pthread_self(); @@ -211,6 +224,7 @@ int safe_mutex_destroy(safe_mutex_t *mp, const char *file, uint line) { fprintf(stderr,"safe_mutex: Trying to destroy a mutex that was locked at %s, line %d at %s, line %d\n", mp->file,mp->line, file, line); + fflush(stderr); abort(); } #ifdef __WIN__ diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc index 45822444527..b0043f3f828 100644 --- a/sql/ha_myisammrg.cc +++ b/sql/ha_myisammrg.cc @@ -48,7 +48,7 @@ int ha_myisammrg::open(const char *name, int mode, int test_if_locked) info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST); if (!(test_if_locked & HA_OPEN_WAIT_IF_LOCKED)) myrg_extra(file,HA_EXTRA_WAIT_LOCK); - if (table->reclength != mean_rec_length) + if (table->reclength != mean_rec_length && mean_rec_length) { DBUG_PRINT("error",("reclength: %d mean_rec_length: %d", table->reclength, mean_rec_length)); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 9cb5644fe7b..90b68f074e5 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2400,7 +2400,7 @@ struct show_var_st init_vars[]= { {"interactive_timeout", (char*) &net_interactive_timeout, SHOW_LONG}, {"key_buffer_size", (char*) &keybuff_size, SHOW_LONG}, {"language", language, SHOW_CHAR}, -#ifdef HAVE_MEMLOCKALL +#ifdef HAVE_MLOCKALL {"locked_in_memory", (char*) &locked_in_memory, SHOW_BOOL}, #endif {"log", (char*) &opt_log, SHOW_BOOL}, |