From d137b4dbbac1ce53906ca15817334e3a4daa2655 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Wed, 23 Nov 2016 17:33:40 +0100 Subject: MDEV-5800 MyISAM support for indexed vcols * don't issue an error for ER_KEY_BASED_ON_GENERATED_VIRTUAL_COLUMN * support keyread on vcols * callback into the server to compute vcol values from mi_check/mi_repair * DMLs just work. Automatically. --- storage/myisam/mi_open.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'storage/myisam/mi_open.c') diff --git a/storage/myisam/mi_open.c b/storage/myisam/mi_open.c index 6bf16f6a426..776594a6409 100644 --- a/storage/myisam/mi_open.c +++ b/storage/myisam/mi_open.c @@ -328,6 +328,7 @@ 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; @@ -335,6 +336,7 @@ 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); @@ -342,7 +344,11 @@ 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; - for (j=0 ; j < keyinfo->keysegs; j++,pos++) + if (keyinfo->flag & HA_SPATIAL) + sp_segs= 2*SPDIMS; + else + sp_segs= 0; + for (j=0 ; j < keyinfo->keysegs; j++, pos++) { disk_pos=mi_keyseg_read(disk_pos, pos); if (pos->flag & HA_BLOB_PART && @@ -366,17 +372,16 @@ 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 (!(keyinfo->flag & HA_SPATIAL) && - pos->start > share->base.reclength) + if (j < keyinfo->keysegs - sp_segs) { - my_errno= HA_ERR_CRASHED; - goto err; + uint real_length= pos->flag & HA_BLOB_PART ? pos->bit_start + : pos->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; -- cgit v1.2.1