diff options
Diffstat (limited to 'storage/myisam')
-rw-r--r-- | storage/myisam/ha_myisam.cc | 25 | ||||
-rw-r--r-- | storage/myisam/mi_open.c | 16 |
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; |