Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/usr/home/ram/work/4.1.b4214 myisam/mi_check.c: Auto merged myisam/myisampack.c: Auto merged
This commit is contained in:
commit
43b0448081
@ -3193,9 +3193,11 @@ int sort_write_record(MI_SORT_PARAM *sort_param)
|
|||||||
break;
|
break;
|
||||||
case COMPRESSED_RECORD:
|
case COMPRESSED_RECORD:
|
||||||
reclength=info->packed_length;
|
reclength=info->packed_length;
|
||||||
length=save_pack_length(block_buff,reclength);
|
length= save_pack_length((uint) share->pack.version, block_buff,
|
||||||
|
reclength);
|
||||||
if (info->s->base.blobs)
|
if (info->s->base.blobs)
|
||||||
length+=save_pack_length(block_buff+length,info->blob_length);
|
length+= save_pack_length((uint) share->pack.version,
|
||||||
|
block_buff + length, info->blob_length);
|
||||||
if (my_b_write(&info->rec_cache,block_buff,length) ||
|
if (my_b_write(&info->rec_cache,block_buff,length) ||
|
||||||
my_b_write(&info->rec_cache,(byte*) sort_param->rec_buff,reclength))
|
my_b_write(&info->rec_cache,(byte*) sort_param->rec_buff,reclength))
|
||||||
{
|
{
|
||||||
|
@ -149,11 +149,12 @@ my_bool _mi_read_pack_info(MI_INFO *info, pbool fix_keys)
|
|||||||
my_errno=HA_ERR_END_OF_FILE;
|
my_errno=HA_ERR_END_OF_FILE;
|
||||||
goto err0;
|
goto err0;
|
||||||
}
|
}
|
||||||
if (memcmp((byte*) header,(byte*) myisam_pack_file_magic,4))
|
if (memcmp((byte*) header, (byte*) myisam_pack_file_magic, 3))
|
||||||
{
|
{
|
||||||
my_errno=HA_ERR_WRONG_IN_RECORD;
|
my_errno=HA_ERR_WRONG_IN_RECORD;
|
||||||
goto err0;
|
goto err0;
|
||||||
}
|
}
|
||||||
|
share->pack.version= header[3];
|
||||||
share->pack.header_length= uint4korr(header+4);
|
share->pack.header_length= uint4korr(header+4);
|
||||||
share->min_pack_length=(uint) uint4korr(header+8);
|
share->min_pack_length=(uint) uint4korr(header+8);
|
||||||
share->max_pack_length=(uint) uint4korr(header+12);
|
share->max_pack_length=(uint) uint4korr(header+12);
|
||||||
@ -1040,38 +1041,12 @@ uint _mi_pack_get_block_info(MI_INFO *myisam, MI_BLOCK_INFO *info, File file,
|
|||||||
return BLOCK_FATAL_ERROR;
|
return BLOCK_FATAL_ERROR;
|
||||||
DBUG_DUMP("header",(byte*) header,ref_length);
|
DBUG_DUMP("header",(byte*) header,ref_length);
|
||||||
}
|
}
|
||||||
if (header[0] < 254)
|
head_length= read_pack_length((uint) myisam->s->pack.version, header,
|
||||||
{
|
&info->rec_len);
|
||||||
info->rec_len=header[0];
|
|
||||||
head_length=1;
|
|
||||||
}
|
|
||||||
else if (header[0] == 254)
|
|
||||||
{
|
|
||||||
info->rec_len=uint2korr(header+1);
|
|
||||||
head_length=3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->rec_len=uint3korr(header+1);
|
|
||||||
head_length=4;
|
|
||||||
}
|
|
||||||
if (myisam->s->base.blobs)
|
if (myisam->s->base.blobs)
|
||||||
{
|
{
|
||||||
if (header[head_length] < 254)
|
head_length+= read_pack_length((uint) myisam->s->pack.version,
|
||||||
{
|
header + head_length, &info->blob_len);
|
||||||
info->blob_len=header[head_length];
|
|
||||||
head_length++;
|
|
||||||
}
|
|
||||||
else if (header[head_length] == 254)
|
|
||||||
{
|
|
||||||
info->blob_len=uint2korr(header+head_length+1);
|
|
||||||
head_length+=3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->blob_len=uint3korr(header+head_length+1);
|
|
||||||
head_length+=4;
|
|
||||||
}
|
|
||||||
if (!(mi_alloc_rec_buff(myisam,info->rec_len + info->blob_len,
|
if (!(mi_alloc_rec_buff(myisam,info->rec_len + info->blob_len,
|
||||||
&myisam->rec_buff)))
|
&myisam->rec_buff)))
|
||||||
return BLOCK_FATAL_ERROR; /* not enough memory */
|
return BLOCK_FATAL_ERROR; /* not enough memory */
|
||||||
@ -1220,34 +1195,12 @@ void _mi_unmap_file(MI_INFO *info)
|
|||||||
static uchar *_mi_mempack_get_block_info(MI_INFO *myisam,MI_BLOCK_INFO *info,
|
static uchar *_mi_mempack_get_block_info(MI_INFO *myisam,MI_BLOCK_INFO *info,
|
||||||
uchar *header)
|
uchar *header)
|
||||||
{
|
{
|
||||||
if (header[0] < 254)
|
header+= read_pack_length((uint) myisam->s->pack.version, header,
|
||||||
info->rec_len= *header++;
|
&info->rec_len);
|
||||||
else if (header[0] == 254)
|
|
||||||
{
|
|
||||||
info->rec_len=uint2korr(header+1);
|
|
||||||
header+=3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->rec_len=uint3korr(header+1);
|
|
||||||
header+=4;
|
|
||||||
}
|
|
||||||
if (myisam->s->base.blobs)
|
if (myisam->s->base.blobs)
|
||||||
{
|
{
|
||||||
if (header[0] < 254)
|
header+= read_pack_length((uint) myisam->s->pack.version, header,
|
||||||
{
|
&info->blob_len);
|
||||||
info->blob_len= *header++;
|
|
||||||
}
|
|
||||||
else if (header[0] == 254)
|
|
||||||
{
|
|
||||||
info->blob_len=uint2korr(header+1);
|
|
||||||
header+=3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->blob_len=uint3korr(header+1);
|
|
||||||
header+=4;
|
|
||||||
}
|
|
||||||
/* mi_alloc_rec_buff sets my_errno on error */
|
/* mi_alloc_rec_buff sets my_errno on error */
|
||||||
if (!(mi_alloc_rec_buff(myisam, info->blob_len,
|
if (!(mi_alloc_rec_buff(myisam, info->blob_len,
|
||||||
&myisam->rec_buff)))
|
&myisam->rec_buff)))
|
||||||
@ -1319,7 +1272,7 @@ static int _mi_read_rnd_mempack_record(MI_INFO *info, byte *buf,
|
|||||||
|
|
||||||
/* Save length of row */
|
/* Save length of row */
|
||||||
|
|
||||||
uint save_pack_length(byte *block_buff,ulong length)
|
uint save_pack_length(uint version, byte *block_buff, ulong length)
|
||||||
{
|
{
|
||||||
if (length < 254)
|
if (length < 254)
|
||||||
{
|
{
|
||||||
@ -1333,6 +1286,46 @@ uint save_pack_length(byte *block_buff,ulong length)
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
*(uchar*) block_buff=255;
|
*(uchar*) block_buff=255;
|
||||||
int3store(block_buff+1,(ulong) length);
|
if (version == 1) /* old format */
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(length <= 0xFFFFFF);
|
||||||
|
int3store(block_buff + 1, (ulong) length);
|
||||||
return 4;
|
return 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int4store(block_buff + 1, (ulong) length);
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint read_pack_length(uint version, const uchar *buf, ulong *length)
|
||||||
|
{
|
||||||
|
if (buf[0] < 254)
|
||||||
|
{
|
||||||
|
*length= buf[0];
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (buf[0] == 254)
|
||||||
|
{
|
||||||
|
*length= uint2korr(buf + 1);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
if (version == 1) /* old format */
|
||||||
|
{
|
||||||
|
*length= uint3korr(buf + 1);
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*length= uint4korr(buf + 1);
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint calc_pack_length(uint version, ulong length)
|
||||||
|
{
|
||||||
|
return (length < 254) ? 1 : (length < 65536) ? 3 : (version == 1) ? 4 : 5;
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ LIST *myisam_open_list=0;
|
|||||||
uchar NEAR myisam_file_magic[]=
|
uchar NEAR myisam_file_magic[]=
|
||||||
{ (uchar) 254, (uchar) 254,'\007', '\001', };
|
{ (uchar) 254, (uchar) 254,'\007', '\001', };
|
||||||
uchar NEAR myisam_pack_file_magic[]=
|
uchar NEAR myisam_pack_file_magic[]=
|
||||||
{ (uchar) 254, (uchar) 254,'\010', '\001', };
|
{ (uchar) 254, (uchar) 254,'\010', '\002', };
|
||||||
my_string myisam_log_filename=(char*) "myisam.log";
|
my_string myisam_log_filename=(char*) "myisam.log";
|
||||||
File myisam_log_file= -1;
|
File myisam_log_file= -1;
|
||||||
uint myisam_quick_table_bits=9;
|
uint myisam_quick_table_bits=9;
|
||||||
|
@ -149,6 +149,7 @@ typedef struct st_mi_blob /* Info of record */
|
|||||||
typedef struct st_mi_isam_pack {
|
typedef struct st_mi_isam_pack {
|
||||||
ulong header_length;
|
ulong header_length;
|
||||||
uint ref_length;
|
uint ref_length;
|
||||||
|
uchar version;
|
||||||
} MI_PACK;
|
} MI_PACK;
|
||||||
|
|
||||||
|
|
||||||
@ -669,7 +670,9 @@ extern void _myisam_log_record(enum myisam_log_commands command,MI_INFO *info,
|
|||||||
int result);
|
int result);
|
||||||
extern my_bool _mi_memmap_file(MI_INFO *info);
|
extern my_bool _mi_memmap_file(MI_INFO *info);
|
||||||
extern void _mi_unmap_file(MI_INFO *info);
|
extern void _mi_unmap_file(MI_INFO *info);
|
||||||
extern uint save_pack_length(byte *block_buff,ulong length);
|
extern uint save_pack_length(uint version, byte *block_buff, ulong length);
|
||||||
|
extern uint read_pack_length(uint version, const uchar *buf, ulong *length);
|
||||||
|
extern uint calc_pack_length(uint version, ulong length);
|
||||||
|
|
||||||
uint mi_state_info_write(File file, MI_STATE_INFO *state, uint pWrite);
|
uint mi_state_info_write(File file, MI_STATE_INFO *state, uint pWrite);
|
||||||
char *mi_state_info_read(char *ptr, MI_STATE_INFO *state);
|
char *mi_state_info_read(char *ptr, MI_STATE_INFO *state);
|
||||||
|
@ -1675,6 +1675,7 @@ static int compress_isam_file(PACK_MRG_INFO *mrg, HUFF_COUNTS *huff_counts)
|
|||||||
HUFF_COUNTS *count,*end_count;
|
HUFF_COUNTS *count,*end_count;
|
||||||
HUFF_TREE *tree;
|
HUFF_TREE *tree;
|
||||||
MI_INFO *isam_file=mrg->file[0];
|
MI_INFO *isam_file=mrg->file[0];
|
||||||
|
uint pack_version= (uint) isam_file->s->pack.version;
|
||||||
DBUG_ENTER("compress_isam_file");
|
DBUG_ENTER("compress_isam_file");
|
||||||
|
|
||||||
if (!(record=(byte*) my_alloca(isam_file->s->base.reclength)))
|
if (!(record=(byte*) my_alloca(isam_file->s->base.reclength)))
|
||||||
@ -1702,23 +1703,10 @@ static int compress_isam_file(PACK_MRG_INFO *mrg, HUFF_COUNTS *huff_counts)
|
|||||||
huff_counts[i].tree->height+huff_counts[i].length_bits;
|
huff_counts[i].tree->height+huff_counts[i].length_bits;
|
||||||
}
|
}
|
||||||
max_calc_length/=8;
|
max_calc_length/=8;
|
||||||
if (max_calc_length < 254)
|
pack_ref_length= calc_pack_length(pack_version, max_calc_length);
|
||||||
pack_ref_length=1;
|
|
||||||
else if (max_calc_length <= 65535)
|
|
||||||
pack_ref_length=3;
|
|
||||||
else
|
|
||||||
pack_ref_length=4;
|
|
||||||
record_count=0;
|
record_count=0;
|
||||||
pack_blob_length=0;
|
pack_blob_length= isam_file->s->base.blobs ?
|
||||||
if (isam_file->s->base.blobs)
|
calc_pack_length(pack_version, mrg->max_blob_length) : 0;
|
||||||
{
|
|
||||||
if (mrg->max_blob_length < 254)
|
|
||||||
pack_blob_length=1;
|
|
||||||
else if (mrg->max_blob_length <= 65535)
|
|
||||||
pack_blob_length=3;
|
|
||||||
else
|
|
||||||
pack_blob_length=4;
|
|
||||||
}
|
|
||||||
max_pack_length=pack_ref_length+pack_blob_length;
|
max_pack_length=pack_ref_length+pack_blob_length;
|
||||||
|
|
||||||
mrg_reset(mrg);
|
mrg_reset(mrg);
|
||||||
@ -1874,9 +1862,10 @@ static int compress_isam_file(PACK_MRG_INFO *mrg, HUFF_COUNTS *huff_counts)
|
|||||||
}
|
}
|
||||||
flush_bits();
|
flush_bits();
|
||||||
length=(ulong) (file_buffer.pos-record_pos)-max_pack_length;
|
length=(ulong) (file_buffer.pos-record_pos)-max_pack_length;
|
||||||
pack_length=save_pack_length(record_pos,length);
|
pack_length= save_pack_length(pack_version, record_pos, length);
|
||||||
if (pack_blob_length)
|
if (pack_blob_length)
|
||||||
pack_length+=save_pack_length(record_pos+pack_length,tot_blob_length);
|
pack_length+= save_pack_length(pack_version, record_pos + pack_length,
|
||||||
|
tot_blob_length);
|
||||||
|
|
||||||
/* Correct file buffer if the header was smaller */
|
/* Correct file buffer if the header was smaller */
|
||||||
if (pack_length != max_pack_length)
|
if (pack_length != max_pack_length)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user