diff options
author | Sergei Golubchik <serg@mariadb.org> | 2016-11-23 17:33:40 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2016-12-12 20:27:36 +0100 |
commit | d137b4dbbac1ce53906ca15817334e3a4daa2655 (patch) | |
tree | 14d421c0a6327365d584942b1e9164a7ee5ca379 /storage/myisam/mi_open.c | |
parent | a418c9920047d5222a0d065343347312127b780f (diff) | |
download | mariadb-git-d137b4dbbac1ce53906ca15817334e3a4daa2655.tar.gz |
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.
Diffstat (limited to 'storage/myisam/mi_open.c')
-rw-r--r-- | storage/myisam/mi_open.c | 17 |
1 files changed, 11 insertions, 6 deletions
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; |