Commit df267c6c authored by sergefp@mysql.com's avatar sergefp@mysql.com

Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-4.0

into mysql.com:/mnt/tmp/mysql-4.0-bug-myisampack
parents 87a8e833 6e0ba8e6
...@@ -96,6 +96,7 @@ typedef struct st_mi_create_info ...@@ -96,6 +96,7 @@ typedef struct st_mi_create_info
ha_rows reloc_rows; ha_rows reloc_rows;
ulonglong auto_increment; ulonglong auto_increment;
ulonglong data_file_length; ulonglong data_file_length;
ulonglong key_file_length;
uint raid_type,raid_chunks; uint raid_type,raid_chunks;
ulong raid_chunksize; ulong raid_chunksize;
uint old_options; uint old_options;
......
...@@ -3520,7 +3520,7 @@ int recreate_table(MI_CHECK *param, MI_INFO **org_info, char *filename) ...@@ -3520,7 +3520,7 @@ int recreate_table(MI_CHECK *param, MI_INFO **org_info, char *filename)
create_info.raid_chunksize= share.base.raid_chunksize; create_info.raid_chunksize= share.base.raid_chunksize;
create_info.language = (param->language ? param->language : create_info.language = (param->language ? param->language :
share.state.header.language); share.state.header.language);
create_info.key_file_length= status_info.key_file_length;
/* We don't have to handle symlinks here because we are using /* We don't have to handle symlinks here because we are using
HA_DONT_TOUCH_DATA */ HA_DONT_TOUCH_DATA */
if (mi_create(filename, if (mi_create(filename,
......
...@@ -46,7 +46,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, ...@@ -46,7 +46,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
ulong reclength, real_reclength,min_pack_length; ulong reclength, real_reclength,min_pack_length;
char filename[FN_REFLEN],linkname[FN_REFLEN], *linkname_ptr; char filename[FN_REFLEN],linkname[FN_REFLEN], *linkname_ptr;
ulong pack_reclength; ulong pack_reclength;
ulonglong tot_length,max_rows; ulonglong tot_length,max_rows, tmp;
enum en_fieldtype type; enum en_fieldtype type;
MYISAM_SHARE share; MYISAM_SHARE share;
MI_KEYDEF *keydef,tmp_keydef; MI_KEYDEF *keydef,tmp_keydef;
...@@ -442,10 +442,15 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, ...@@ -442,10 +442,15 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
share.state.auto_increment=ci->auto_increment; share.state.auto_increment=ci->auto_increment;
share.options=options; share.options=options;
share.base.rec_reflength=pointer; share.base.rec_reflength=pointer;
/* Get estimate for index file length (this may be wrong for FT keys) */
tmp= (tot_length + max_key_block_length * keys *
MI_INDEX_BLOCK_MARGIN) / MI_MIN_KEY_BLOCK_LENGTH;
/*
use maximum of key_file_length we calculated and key_file_length value we
got from MYI file header (see also myisampack.c:save_state)
*/
share.base.key_reflength= share.base.key_reflength=
mi_get_pointer_length((tot_length + max_key_block_length * keys * mi_get_pointer_length(max(ci->key_file_length,tmp),3);
MI_INDEX_BLOCK_MARGIN) / MI_MIN_KEY_BLOCK_LENGTH,
3);
share.base.keys= share.state.header.keys = keys; share.base.keys= share.state.header.keys = keys;
share.state.header.uniques= uniques; share.state.header.uniques= uniques;
mi_int2store(share.state.header.key_parts,key_segs); mi_int2store(share.state.header.key_parts,key_segs);
......
...@@ -2041,7 +2041,11 @@ static int save_state(MI_INFO *isam_file,PACK_MRG_INFO *mrg,my_off_t new_length, ...@@ -2041,7 +2041,11 @@ static int save_state(MI_INFO *isam_file,PACK_MRG_INFO *mrg,my_off_t new_length,
share->state.split=(ha_rows) mrg->records; share->state.split=(ha_rows) mrg->records;
share->state.version=(ulong) time((time_t*) 0); share->state.version=(ulong) time((time_t*) 0);
share->state.key_map=0; share->state.key_map=0;
share->state.state.key_file_length=share->base.keystart; /*
Don't save key_file_length here, keep key_file_length of original file
so "myisamchk -rq" can use this value (this is necessary because index
size cannot be easily calculated for fulltext keys)
*/
for (key=0 ; key < share->base.keys ; key++) for (key=0 ; key < share->base.keys ; key++)
share->state.key_root[key]= HA_OFFSET_ERROR; share->state.key_root[key]= HA_OFFSET_ERROR;
for (key=0 ; key < share->state.header.max_block_size ; key++) for (key=0 ; key < share->state.header.max_block_size ; key++)
......
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