mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
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.
This commit is contained in:
parent
c2a77aa181
commit
4bf11aacd0
1 changed files with 30 additions and 8 deletions
|
@ -111,6 +111,8 @@ typedef struct st_isam_mrg {
|
|||
uint ref_length;
|
||||
uint max_blob_length;
|
||||
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;
|
||||
|
||||
|
||||
|
@ -413,9 +415,16 @@ static bool open_isam_files(PACK_MRG_INFO *mrg,char **names,uint count)
|
|||
mrg->current=0;
|
||||
mrg->file=(MI_INFO**) my_malloc(sizeof(MI_INFO*)*count,MYF(MY_FAE));
|
||||
mrg->free_file=1;
|
||||
mrg->src_file_has_indexes_disabled= 0;
|
||||
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;
|
||||
}
|
||||
/* 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,
|
|||
share->state.dellink= HA_OFFSET_ERROR;
|
||||
share->state.split=(ha_rows) mrg->records;
|
||||
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
|
||||
so "myisamchk -rq" can use this value (this is necessary because index
|
||||
size cannot be easily calculated for fulltext keys)
|
||||
Some indexes are disabled, cannot use current key_file_length value
|
||||
as an estimate of upper bound of index file size. Use packed data file
|
||||
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++)
|
||||
share->state.key_root[key]= HA_OFFSET_ERROR;
|
||||
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,
|
|||
share->changed=1; /* Force write of header */
|
||||
share->state.open_count=0;
|
||||
share->global_changed=0;
|
||||
VOID(my_chsize(share->kfile, share->state.state.key_file_length, 0,
|
||||
MYF(0)));
|
||||
VOID(my_chsize(share->kfile, share->base.keystart, 0, MYF(0)));
|
||||
if (share->base.keys)
|
||||
isamchk_neaded=1;
|
||||
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,
|
|||
state.state.del=0;
|
||||
state.state.empty=0;
|
||||
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.version=(ulong) time((time_t*) 0);
|
||||
state.key_map=0;
|
||||
|
|
Loading…
Reference in a new issue