diff options
-rw-r--r-- | Docs/manual.texi | 14 | ||||
-rw-r--r-- | myisam/mi_check.c | 75 | ||||
-rw-r--r-- | myisam/mi_open.c | 5 | ||||
-rw-r--r-- | myisam/mi_packrec.c | 9 | ||||
-rw-r--r-- | myisam/myisamchk.c | 2 | ||||
-rw-r--r-- | myisam/myisamdef.h | 1 |
6 files changed, 70 insertions, 36 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index a779c39a1d0..07959fd2602 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46838,12 +46838,22 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.45 @itemize @bullet @item +@code{(UPDATE|DELETE) ...WHERE MATCH} bugfix +@item +shutdown should now work on Darwin (Mac OS X). +@item +Fixed core-dump when repairing corrupted packed MyISAM files. +@item @code{--core-file} now works on Solaris. @item Fix a bug which could cause InnoDB to complain if it cannot find free blocks from the buffer cache during recovery. @item -Fixed a bug in InnoDB insert buffer B-tree handling that could cause crashes. +Fixed bug in InnoDB insert buffer B-tree handling that could cause crashes. +@item +Fixed bug in InnoDB lock timeout handling. +@item +Fixed core dump bug in @code{ALTER TABLE} on a @code{TEMPORARY} InnoDB table. @item Fixed bug in @code{OPTIMIZE TABLE} that reset index cardinality if it was up to date. @@ -46856,8 +46866,6 @@ Fixed bug with BDB tables and keys on @code{BLOB}'s. Fixed bug in @code{MERGE} tables on OS with 32 bit file pointers. @item Fixed bug in @code{TIME_TO_SEC()} when using negative values. -@item -Fixed core dump bug in @code{ALTER TABLE} on a @code{TEMPORARY} InnoDB table. @end itemize @node News-3.23.44, News-3.23.43, News-3.23.45, News-3.23.x diff --git a/myisam/mi_check.c b/myisam/mi_check.c index 93598ce2d76..45a335b68c8 100644 --- a/myisam/mi_check.c +++ b/myisam/mi_check.c @@ -41,7 +41,8 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo, ha_checksum *key_checksum, uint level); static uint isam_key_length(MI_INFO *info,MI_KEYDEF *keyinfo); static ha_checksum calc_checksum(ha_rows count); -static int writekeys(MI_INFO *info,byte *buff,my_off_t filepos); +static int writekeys(MI_CHECK *param, MI_INFO *info,byte *buff, + my_off_t filepos); static int sort_one_index(MI_CHECK *param, MI_INFO *info,MI_KEYDEF *keyinfo, my_off_t pagepos, File new_file); static int sort_key_read(SORT_INFO *sort_info,void *key); @@ -61,7 +62,8 @@ static void update_key_parts(MI_KEYDEF *keyinfo, ulonglong *unique, ulonglong records); static ha_checksum mi_byte_checksum(const byte *buf, uint length); - +static void set_data_file_type(MI_CHECK *param, SORT_INFO *info, + MYISAM_SHARE *share); #ifdef __WIN__ static double ulonglong2double(ulonglong value) @@ -1179,15 +1181,8 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info, sort_info->dupp=0; sort_info->fix_datafile= (my_bool) (! rep_quick); sort_info->max_records= ~(ha_rows) 0; - if ((sort_info->new_data_file_type=share->data_file_type) == - COMPRESSED_RECORD && param->testflag & T_UNPACK) - { - if (share->options & HA_OPTION_PACK_RECORD) - sort_info->new_data_file_type = DYNAMIC_RECORD; - else - sort_info->new_data_file_type = STATIC_RECORD; - } + set_data_file_type(param, sort_info, share); del=info->state->del; info->state->records=info->state->del=share->state.split=0; info->state->empty=0; @@ -1215,9 +1210,10 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info, lock_memory(param); /* Everything is alloced */ while (!(error=sort_get_next_record(sort_info))) { - if (writekeys(info,(byte*) sort_info->record,sort_info->filepos)) + if (writekeys(param, info,(byte*) sort_info->record,sort_info->filepos)) { - if (my_errno != HA_ERR_FOUND_DUPP_KEY) goto err; + if (my_errno != HA_ERR_FOUND_DUPP_KEY) + goto err; DBUG_DUMP("record",(byte*) sort_info->record,share->base.pack_reclength); mi_check_print_info(param,"Duplicate key %2d for record at %10s against new record at %10s", info->errkey+1, @@ -1356,7 +1352,8 @@ err: /* Uppate keyfile when doing repair */ -static int writekeys(register MI_INFO *info,byte *buff,my_off_t filepos) +static int writekeys(MI_CHECK *param, register MI_INFO *info, byte *buff, + my_off_t filepos) { register uint i; uchar *key; @@ -1369,12 +1366,14 @@ static int writekeys(register MI_INFO *info,byte *buff,my_off_t filepos) { if (info->s->keyinfo[i].flag & HA_FULLTEXT ) { - if (_mi_ft_add(info,i,(char*) key,buff,filepos)) goto err; + if (_mi_ft_add(info,i,(char*) key,buff,filepos)) + goto err; } else { uint key_length=_mi_make_key(info,i,key,buff,filepos); - if (_mi_ck_write(info,i,key,key_length)) goto err; + if (_mi_ck_write(info,i,key,key_length)) + goto err; } } } @@ -1390,16 +1389,21 @@ static int writekeys(register MI_INFO *info,byte *buff,my_off_t filepos) { if (info->s->keyinfo[i].flag & HA_FULLTEXT) { - if (_mi_ft_del(info,i,(char*) key,buff,filepos)) break; + if (_mi_ft_del(info,i,(char*) key,buff,filepos)) + break; } else { uint key_length=_mi_make_key(info,i,key,buff,filepos); - if (_mi_ck_delete(info,i,key,key_length)) break; + if (_mi_ck_delete(info,i,key,key_length)) + break; } } } } + /* Remove checksum that was added to glob_crc in sort_get_next_record */ + if (param->calc_checksum) + param->glob_crc-= info->checksum; DBUG_PRINT("error",("errno: %d",my_errno)); DBUG_RETURN(-1); } /* writekeys */ @@ -1840,15 +1844,7 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info, sort_info->info=info; sort_info->param = param; - if ((sort_info->new_data_file_type=share->data_file_type) == - COMPRESSED_RECORD && param->testflag & T_UNPACK) - { - if (share->options & HA_OPTION_PACK_RECORD) - sort_info->new_data_file_type = DYNAMIC_RECORD; - else - sort_info->new_data_file_type = STATIC_RECORD; - } - + set_data_file_type(param, sort_info, share); sort_info->filepos=new_header_length; sort_info->dupp=0; sort_info->buff=0; @@ -2129,7 +2125,8 @@ static int sort_get_next_record(SORT_INFO *sort_info) if (*sort_info->record) { if (param->calc_checksum) - param->glob_crc+= mi_static_checksum(info,sort_info->record); + param->glob_crc+= (info->checksum= + mi_static_checksum(info,sort_info->record)); DBUG_RETURN(0); } if (!sort_info->fix_datafile) @@ -2582,7 +2579,7 @@ static int sort_key_write(SORT_INFO *sort_info, const void *a) sort_info->key_block-> lastkey), llbuff2)); - param->error_printed=param->retry_without_quick=1; + param->retry_without_quick=1; if (sort_info->param->testflag & T_VERBOSE) _mi_print_key(stdout,sort_info->keyseg,(uchar*) a, USE_WHOLE_KEY); return (sort_delete_record(param)); @@ -3235,3 +3232,25 @@ my_bool mi_test_if_sort_rep(MI_INFO *info, ha_rows rows, } return TRUE; } + + +static void +set_data_file_type(MI_CHECK *param, SORT_INFO *sort_info, MYISAM_SHARE *share) +{ + if ((sort_info->new_data_file_type=share->data_file_type) == + COMPRESSED_RECORD && param->testflag & T_UNPACK) + { + MYISAM_SHARE tmp; + + if (share->options & HA_OPTION_PACK_RECORD) + sort_info->new_data_file_type = DYNAMIC_RECORD; + else + sort_info->new_data_file_type = STATIC_RECORD; + + /* Set delete_function for sort_delete_record() */ + memcpy((char*) &tmp, share, sizeof(*share)); + tmp.options= ~HA_OPTION_COMPRESS_RECORD; + mi_setup_functions(&tmp); + share->delete_record=tmp.delete_record; + } +} diff --git a/myisam/mi_open.c b/myisam/mi_open.c index 626d51d18b7..617b1cd8d90 100644 --- a/myisam/mi_open.c +++ b/myisam/mi_open.c @@ -30,7 +30,6 @@ #include "static.c" #endif -static void setup_functions(MYISAM_SHARE *info); static void setup_key_functions(MI_KEYDEF *keyinfo); #define get_next_element(to,pos,size) { memcpy((char*) to,pos,(size_t) size); \ pos+=size;} @@ -392,7 +391,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) else if (share->options & HA_OPTION_PACK_RECORD) share->data_file_type = DYNAMIC_RECORD; my_afree((gptr) disk_cache); - setup_functions(share); + mi_setup_functions(share); #ifdef THREAD thr_lock_init(&share->lock); VOID(pthread_mutex_init(&share->intern_lock,MY_MUTEX_INIT_FAST)); @@ -566,7 +565,7 @@ ulonglong mi_safe_mul(ulonglong a, ulonglong b) /* Set up functions in structs */ -static void setup_functions(register MYISAM_SHARE *share) +void mi_setup_functions(register MYISAM_SHARE *share) { if (share->options & HA_OPTION_COMPRESS_RECORD) { diff --git a/myisam/mi_packrec.c b/myisam/mi_packrec.c index 68d546b2010..242883a2c4a 100644 --- a/myisam/mi_packrec.c +++ b/myisam/mi_packrec.c @@ -785,7 +785,10 @@ static void decode_bytes(MI_COLUMNDEF *rec,MI_BIT_BUFF *bit_buff,uchar *to, if (bits <= 32) { if (bit_buff->pos > bit_buff->end+4) + { + bit_buff->error=1; return; /* Can't be right */ + } bit_buff->current_byte= (bit_buff->current_byte << 32) + ((((uint) bit_buff->pos[3])) + (((uint) bit_buff->pos[2]) << 8) + @@ -829,7 +832,8 @@ static void decode_bytes(MI_COLUMNDEF *rec,MI_BIT_BUFF *bit_buff,uchar *to, #else -static void decode_bytes(MI_COLUMNDEF *rec, MI_BIT_BUFF *bit_buff, uchar *to, uchar *end) +static void decode_bytes(MI_COLUMNDEF *rec, MI_BIT_BUFF *bit_buff, uchar *to, + uchar *end) { reg1 uint bits,low_byte; reg3 uint16 *pos; @@ -846,7 +850,10 @@ static void decode_bytes(MI_COLUMNDEF *rec, MI_BIT_BUFF *bit_buff, uchar *to, uc if (bits < table_bits) { if (bit_buff->pos > bit_buff->end+1) + { + bit_buff->error=1; return; /* Can't be right */ + } #if BITS_SAVED == 32 bit_buff->current_byte= (bit_buff->current_byte << 24) + (((uint) ((uchar) bit_buff->pos[2]))) + diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c index d8d57863a11..cb321f8fda3 100644 --- a/myisam/myisamchk.c +++ b/myisam/myisamchk.c @@ -204,7 +204,7 @@ static struct option long_options[] = static void print_version(void) { - printf("%s Ver 1.51 for %s at %s\n",my_progname,SYSTEM_TYPE, + printf("%s Ver 1.53 for %s at %s\n",my_progname,SYSTEM_TYPE, MACHINE_TYPE); } diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h index 33fd1b6946f..260e9665b31 100644 --- a/myisam/myisamdef.h +++ b/myisam/myisamdef.h @@ -635,6 +635,7 @@ void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows); my_bool check_table_is_closed(const char *name, const char *where); int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share); int mi_open_keyfile(MYISAM_SHARE *share); +void mi_setup_functions(register MYISAM_SHARE *share); /* Functions needed by mi_check */ void mi_check_print_error _VARARGS((MI_CHECK *param, const char *fmt,...)); |