summaryrefslogtreecommitdiff
path: root/storage/myisam
diff options
context:
space:
mode:
Diffstat (limited to 'storage/myisam')
-rw-r--r--storage/myisam/ha_myisam.cc25
-rw-r--r--storage/myisam/mi_open.c16
2 files changed, 21 insertions, 20 deletions
diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index 46a7734ef22..9fb7e5b2c35 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -892,14 +892,27 @@ int ha_myisam::write_row(uchar *buf)
void ha_myisam::setup_vcols_for_repair(HA_CHECK *param)
{
- if (file->s->base.reclength < file->s->vreclength)
+ DBUG_ASSERT(file->s->base.reclength <= file->s->vreclength);
+ if (!table->vfield)
+ return;
+
+ if (file->s->base.reclength == file->s->vreclength)
{
- param->fix_record= compute_vcols;
- table->use_all_columns();
- table->vcol_set= &table->s->all_set;
+ bool indexed_vcols= false;
+ ulong new_vreclength= file->s->vreclength;
+ for (Field **vf= table->vfield; *vf; vf++)
+ {
+ uint vf_end= (*vf)->offset(table->record[0]) + (*vf)->pack_length_in_rec();
+ set_if_bigger(new_vreclength, vf_end);
+ indexed_vcols|= (*vf)->flags & PART_KEY_FLAG;
+ }
+ if (!indexed_vcols)
+ return;
+ file->s->vreclength= new_vreclength;
}
- else
- DBUG_ASSERT(file->s->base.reclength == file->s->vreclength);
+ param->fix_record= compute_vcols;
+ table->use_all_columns();
+ table->vcol_set= &table->s->all_set;
}
void ha_myisam::restore_vcos_after_repair()
diff --git a/storage/myisam/mi_open.c b/storage/myisam/mi_open.c
index 5bd5554db51..6fd684a050f 100644
--- a/storage/myisam/mi_open.c
+++ b/storage/myisam/mi_open.c
@@ -336,7 +336,6 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
for (i=0 ; i < keys ; i++)
{
MI_KEYDEF *keyinfo= share->keyinfo + i;
- uint sp_segs;
keyinfo->share= share;
disk_pos=mi_keydef_read(disk_pos, keyinfo);
disk_pos_assert(disk_pos + keyinfo->keysegs * HA_KEYSEG_SIZE, end_pos);
@@ -344,11 +343,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
have_rtree=1;
set_if_smaller(share->blocksize, keyinfo->block_length);
keyinfo->seg= pos;
- if (keyinfo->flag & HA_SPATIAL)
- sp_segs= 2*SPDIMS;
- else
- sp_segs= 0;
- for (j=0 ; j < keyinfo->keysegs; j++, pos++)
+ for (j=0 ; j < keyinfo->keysegs; j++,pos++)
{
disk_pos=mi_keyseg_read(disk_pos, pos);
if (pos->flag & HA_BLOB_PART &&
@@ -372,18 +367,11 @@ 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 (j < keyinfo->keysegs - sp_segs)
- {
- uint real_length= pos->flag & HA_BLOB_PART ? pos->bit_start
- : pos->length;
- if (pos->type == HA_KEYTYPE_BIT && pos->bit_length)
- real_length--;
- set_if_bigger(share->vreclength, pos->start + real_length);
- }
}
if (keyinfo->flag & HA_SPATIAL)
{
#ifdef HAVE_SPATIAL
+ uint sp_segs= SPDIMS*2;
keyinfo->seg= pos - sp_segs;
DBUG_ASSERT(keyinfo->keysegs == sp_segs + 1);
keyinfo->keysegs= sp_segs;