summaryrefslogtreecommitdiff
path: root/storage/myisam/mi_open.c
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2016-11-23 17:33:40 +0100
committerSergei Golubchik <serg@mariadb.org>2016-12-12 20:27:36 +0100
commitd137b4dbbac1ce53906ca15817334e3a4daa2655 (patch)
tree14d421c0a6327365d584942b1e9164a7ee5ca379 /storage/myisam/mi_open.c
parenta418c9920047d5222a0d065343347312127b780f (diff)
downloadmariadb-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.c17
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;