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

Fix for BUG#4785 part two:

* If at least one of indexes is disabled, use data file size as an estimate 
  for key file size.
* Added handling for joined tables.
parent df267c6c
...@@ -111,6 +111,8 @@ typedef struct st_isam_mrg { ...@@ -111,6 +111,8 @@ typedef struct st_isam_mrg {
uint ref_length; uint ref_length;
uint max_blob_length; uint max_blob_length;
my_off_t records; my_off_t records;
/* true if at least one source file has at least one disabled index */
my_bool src_file_has_indexes_disabled;
} PACK_MRG_INFO; } PACK_MRG_INFO;
...@@ -413,9 +415,16 @@ static bool open_isam_files(PACK_MRG_INFO *mrg,char **names,uint count) ...@@ -413,9 +415,16 @@ static bool open_isam_files(PACK_MRG_INFO *mrg,char **names,uint count)
mrg->current=0; mrg->current=0;
mrg->file=(MI_INFO**) my_malloc(sizeof(MI_INFO*)*count,MYF(MY_FAE)); mrg->file=(MI_INFO**) my_malloc(sizeof(MI_INFO*)*count,MYF(MY_FAE));
mrg->free_file=1; mrg->free_file=1;
mrg->src_file_has_indexes_disabled= 0;
for (i=0; i < count ; i++) for (i=0; i < count ; i++)
{ {
if (!(mrg->file[i]=open_isam_file(names[i],O_RDONLY))) if ((mrg->file[i]=open_isam_file(names[i],O_RDONLY)))
{
mrg->src_file_has_indexes_disabled |=
(mrg->file[i]->s->state.key_map !=
(1ULL << mrg->file[i]->s->base.keys) - 1);
}
else
goto error; goto error;
} }
/* Check that files are identical */ /* Check that files are identical */
...@@ -2040,12 +2049,21 @@ static int save_state(MI_INFO *isam_file,PACK_MRG_INFO *mrg,my_off_t new_length, ...@@ -2040,12 +2049,21 @@ static int save_state(MI_INFO *isam_file,PACK_MRG_INFO *mrg,my_off_t new_length,
share->state.dellink= HA_OFFSET_ERROR; share->state.dellink= HA_OFFSET_ERROR;
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; if (share->state.key_map != (1ULL << share->base.keys) - 1)
{
/* /*
Don't save key_file_length here, keep key_file_length of original file Some indexes are disabled, cannot use current key_file_length value
so "myisamchk -rq" can use this value (this is necessary because index as an estimate of upper bound of index file size. Use packed data file
size cannot be easily calculated for fulltext keys) size instead.
*/ */
share->state.state.key_file_length= new_length;
}
/*
If there are no disabled indexes, keep key_file_length value from
original file so "myisamchk -rq" can use this value (this is necessary
because index size cannot be easily calculated for fulltext keys)
*/
share->state.key_map=0;
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++)
...@@ -2054,8 +2072,7 @@ static int save_state(MI_INFO *isam_file,PACK_MRG_INFO *mrg,my_off_t new_length, ...@@ -2054,8 +2072,7 @@ static int save_state(MI_INFO *isam_file,PACK_MRG_INFO *mrg,my_off_t new_length,
share->changed=1; /* Force write of header */ share->changed=1; /* Force write of header */
share->state.open_count=0; share->state.open_count=0;
share->global_changed=0; share->global_changed=0;
VOID(my_chsize(share->kfile, share->state.state.key_file_length, 0, VOID(my_chsize(share->kfile, share->base.keystart, 0, MYF(0)));
MYF(0)));
if (share->base.keys) if (share->base.keys)
isamchk_neaded=1; isamchk_neaded=1;
DBUG_RETURN(mi_state_info_write(share->kfile,&share->state,1+2)); DBUG_RETURN(mi_state_info_write(share->kfile,&share->state,1+2));
...@@ -2078,7 +2095,12 @@ static int save_state_mrg(File file,PACK_MRG_INFO *mrg,my_off_t new_length, ...@@ -2078,7 +2095,12 @@ static int save_state_mrg(File file,PACK_MRG_INFO *mrg,my_off_t new_length,
state.state.del=0; state.state.del=0;
state.state.empty=0; state.state.empty=0;
state.state.records=state.split=(ha_rows) mrg->records; state.state.records=state.split=(ha_rows) mrg->records;
state.state.key_file_length=isam_file->s->base.keystart; /* See comment above in save_state about key_file_length handling. */
if (mrg->src_file_has_indexes_disabled)
{
isam_file->s->state.state.key_file_length=
max(isam_file->s->state.state.key_file_length, new_length);
}
state.dellink= HA_OFFSET_ERROR; state.dellink= HA_OFFSET_ERROR;
state.version=(ulong) time((time_t*) 0); state.version=(ulong) time((time_t*) 0);
state.key_map=0; state.key_map=0;
......
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