summaryrefslogtreecommitdiff
path: root/storage/myisam/mi_open.c
diff options
context:
space:
mode:
Diffstat (limited to 'storage/myisam/mi_open.c')
-rw-r--r--storage/myisam/mi_open.c52
1 files changed, 24 insertions, 28 deletions
diff --git a/storage/myisam/mi_open.c b/storage/myisam/mi_open.c
index c1bf4f15ccb..ce028f3440d 100644
--- a/storage/myisam/mi_open.c
+++ b/storage/myisam/mi_open.c
@@ -346,21 +346,22 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
strmov(share->index_file_name, index_name);
strmov(share->data_file_name, data_name);
+ share->vreclength= share->base.reclength;
share->blocksize=MY_MIN(IO_SIZE,myisam_block_size);
{
HA_KEYSEG *pos=share->keyparts;
uint32 ftkey_nr= 1;
for (i=0 ; i < keys ; i++)
{
- share->keyinfo[i].share= share;
- disk_pos=mi_keydef_read(disk_pos, &share->keyinfo[i]);
- disk_pos_assert(disk_pos + share->keyinfo[i].keysegs * HA_KEYSEG_SIZE,
- end_pos);
- if (share->keyinfo[i].key_alg == HA_KEY_ALG_RTREE)
+ MI_KEYDEF *keyinfo= share->keyinfo + i;
+ keyinfo->share= share;
+ disk_pos=mi_keydef_read(disk_pos, keyinfo);
+ disk_pos_assert(disk_pos + keyinfo->keysegs * HA_KEYSEG_SIZE, end_pos);
+ if (keyinfo->key_alg == HA_KEY_ALG_RTREE)
have_rtree=1;
- set_if_smaller(share->blocksize,share->keyinfo[i].block_length);
- share->keyinfo[i].seg=pos;
- for (j=0 ; j < share->keyinfo[i].keysegs; j++,pos++)
+ set_if_smaller(share->blocksize, keyinfo->block_length);
+ keyinfo->seg= pos;
+ for (j=0 ; j < keyinfo->keysegs; j++,pos++)
{
disk_pos=mi_keyseg_read(disk_pos, pos);
if (pos->flag & HA_BLOB_PART &&
@@ -384,35 +385,30 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
}
else if (pos->type == HA_KEYTYPE_BINARY)
pos->charset= &my_charset_bin;
- if (!(share->keyinfo[i].flag & HA_SPATIAL) &&
- pos->start > share->base.reclength)
- {
- my_errno= HA_ERR_CRASHED;
- goto err;
- }
}
- if (share->keyinfo[i].flag & HA_SPATIAL)
+ if (keyinfo->flag & HA_SPATIAL)
{
#ifdef HAVE_SPATIAL
- uint sp_segs=SPDIMS*2;
- share->keyinfo[i].seg=pos-sp_segs;
- share->keyinfo[i].keysegs--;
+ uint sp_segs= SPDIMS*2;
+ keyinfo->seg= pos - sp_segs;
+ DBUG_ASSERT(keyinfo->keysegs == sp_segs + 1);
+ keyinfo->keysegs= sp_segs;
#else
my_errno=HA_ERR_UNSUPPORTED;
goto err;
#endif
}
- else if (share->keyinfo[i].flag & HA_FULLTEXT)
+ else if (keyinfo->flag & HA_FULLTEXT)
{
if (!fulltext_keys)
{ /* 4.0 compatibility code, to be removed in 5.0 */
- share->keyinfo[i].seg=pos-FT_SEGS;
- share->keyinfo[i].keysegs-=FT_SEGS;
+ keyinfo->seg= pos - FT_SEGS;
+ keyinfo->keysegs-= FT_SEGS;
}
else
{
uint k;
- share->keyinfo[i].seg=pos;
+ keyinfo->seg= pos;
for (k=0; k < FT_SEGS; k++)
{
*pos= ft_keysegs[k];
@@ -427,7 +423,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
}
if (!share->ft2_keyinfo.seg)
{
- memcpy(& share->ft2_keyinfo, & share->keyinfo[i], sizeof(MI_KEYDEF));
+ memcpy(& share->ft2_keyinfo, keyinfo, sizeof(MI_KEYDEF));
share->ft2_keyinfo.keysegs=1;
share->ft2_keyinfo.flag=0;
share->ft2_keyinfo.keylength=
@@ -437,10 +433,10 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
share->ft2_keyinfo.end=pos;
setup_key_functions(& share->ft2_keyinfo);
}
- share->keyinfo[i].ftkey_nr= ftkey_nr++;
+ keyinfo->ftkey_nr= ftkey_nr++;
}
- setup_key_functions(share->keyinfo+i);
- share->keyinfo[i].end=pos;
+ setup_key_functions(keyinfo);
+ keyinfo->end= pos;
pos->type=HA_KEYTYPE_END; /* End */
pos->length=share->base.rec_reflength;
pos->null_bit=0;
@@ -752,6 +748,7 @@ uchar *mi_alloc_rec_buff(MI_INFO *info, ulong length, uchar **buf)
else
length= info->s->base.pack_reclength;
length= MY_MAX(length, info->s->base.max_key_length);
+ length= MY_MAX(length, info->s->vreclength);
/* Avoid unnecessary realloc */
if (newptr && length == old_length)
return newptr;
@@ -764,7 +761,7 @@ uchar *mi_alloc_rec_buff(MI_INFO *info, ulong length, uchar **buf)
newptr-= MI_REC_BUFF_OFFSET;
if (!(newptr=(uchar*) my_realloc((uchar*)newptr, length+extra+8,
MYF(MY_ALLOW_ZERO_PTR))))
- return newptr;
+ return NULL;
*((uint32 *) newptr)= (uint32) length;
*buf= newptr+(extra ? MI_REC_BUFF_OFFSET : 0);
}
@@ -1387,4 +1384,3 @@ int mi_indexes_are_disabled(MI_INFO *info)
*/
return 2;
}
-