mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Bug fix: we should set have_rtree value in case of table reopen.
Code cleanup.
This commit is contained in:
@@ -484,6 +484,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
|||||||
if (mi_open_datafile(&info, share, old_info->dfile))
|
if (mi_open_datafile(&info, share, old_info->dfile))
|
||||||
goto err;
|
goto err;
|
||||||
errpos=5;
|
errpos=5;
|
||||||
|
have_rtree= old_info->rtree_recursion_state != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* alloc and set up private structure parts */
|
/* alloc and set up private structure parts */
|
||||||
@@ -492,12 +493,15 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
|||||||
&info.blobs,sizeof(MI_BLOB)*share->base.blobs,
|
&info.blobs,sizeof(MI_BLOB)*share->base.blobs,
|
||||||
&info.buff,(share->base.max_key_block_length*2+
|
&info.buff,(share->base.max_key_block_length*2+
|
||||||
share->base.max_key_length),
|
share->base.max_key_length),
|
||||||
&info.rtree_recursion_state,have_rtree ? 1024 : 0,
|
|
||||||
&info.lastkey,share->base.max_key_length*3+1,
|
&info.lastkey,share->base.max_key_length*3+1,
|
||||||
&info.filename,strlen(org_name)+1,
|
&info.filename,strlen(org_name)+1,
|
||||||
|
&info.rtree_recursion_state,have_rtree ? 1024 : 0,
|
||||||
NullS))
|
NullS))
|
||||||
goto err;
|
goto err;
|
||||||
errpos=6;
|
errpos=6;
|
||||||
|
|
||||||
|
if (!have_rtree)
|
||||||
|
info.rtree_recursion_state= NULL;
|
||||||
|
|
||||||
strmov(info.filename,org_name);
|
strmov(info.filename,org_name);
|
||||||
memcpy(info.blobs,share->blobs,sizeof(MI_BLOB)*share->base.blobs);
|
memcpy(info.blobs,share->blobs,sizeof(MI_BLOB)*share->base.blobs);
|
||||||
|
@@ -272,7 +272,7 @@ struct st_myisam_info {
|
|||||||
#ifdef THREAD
|
#ifdef THREAD
|
||||||
THR_LOCK_DATA lock;
|
THR_LOCK_DATA lock;
|
||||||
#endif
|
#endif
|
||||||
uchar * rtree_recursion_state; /* For RTREE */
|
uchar *rtree_recursion_state; /* For RTREE */
|
||||||
int rtree_recursion_depth;
|
int rtree_recursion_depth;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -53,7 +53,7 @@ static int rtree_find_req(MI_INFO *info, MI_KEYDEF *keyinfo, uint search_flag, u
|
|||||||
int res;
|
int res;
|
||||||
uchar *page_buf;
|
uchar *page_buf;
|
||||||
int k_len;
|
int k_len;
|
||||||
int *saved_key = (int*)(info->rtree_recursion_state + level * sizeof(int));
|
uint *saved_key = (uint*) (info->rtree_recursion_state) + level;
|
||||||
|
|
||||||
if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length)))
|
if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length)))
|
||||||
{
|
{
|
||||||
@@ -114,7 +114,7 @@ static int rtree_find_req(MI_INFO *info, MI_KEYDEF *keyinfo, uint search_flag, u
|
|||||||
uchar *after_key = rt_PAGE_NEXT_KEY(k, k_len, nod_flag);
|
uchar *after_key = rt_PAGE_NEXT_KEY(k, k_len, nod_flag);
|
||||||
info->lastpos = _mi_dpos(info, 0, after_key);
|
info->lastpos = _mi_dpos(info, 0, after_key);
|
||||||
info->lastkey_length = k_len + info->s->base.rec_reflength;
|
info->lastkey_length = k_len + info->s->base.rec_reflength;
|
||||||
memcpy(info->lastkey, k, k_len + info->s->base.rec_reflength);
|
memcpy(info->lastkey, k, info->lastkey_length);
|
||||||
|
|
||||||
info->rtree_recursion_depth = level;
|
info->rtree_recursion_depth = level;
|
||||||
*saved_key = k - page_buf;
|
*saved_key = k - page_buf;
|
||||||
@@ -205,7 +205,7 @@ int rtree_find_next(MI_INFO *info, uint keynr, uint search_flag)
|
|||||||
|
|
||||||
info->lastpos = _mi_dpos(info, 0, after_key);
|
info->lastpos = _mi_dpos(info, 0, after_key);
|
||||||
info->lastkey_length = k_len + info->s->base.rec_reflength;
|
info->lastkey_length = k_len + info->s->base.rec_reflength;
|
||||||
memcpy(info->lastkey, key, k_len + info->s->base.rec_reflength);
|
memcpy(info->lastkey, key, info->lastkey_length);
|
||||||
|
|
||||||
*(int*)info->int_keypos = key - info->buff;
|
*(int*)info->int_keypos = key - info->buff;
|
||||||
if (after_key >= info->int_maxpos)
|
if (after_key >= info->int_maxpos)
|
||||||
@@ -246,7 +246,7 @@ static int rtree_get_req(MI_INFO *info, MI_KEYDEF *keyinfo, uint key_length,
|
|||||||
int res;
|
int res;
|
||||||
uchar *page_buf;
|
uchar *page_buf;
|
||||||
uint k_len;
|
uint k_len;
|
||||||
int *saved_key = (int*)(info->rtree_recursion_state + level*sizeof(int));
|
uint *saved_key = (uint*) (info->rtree_recursion_state) + level;
|
||||||
|
|
||||||
if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length)))
|
if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length)))
|
||||||
return -1;
|
return -1;
|
||||||
@@ -297,7 +297,7 @@ static int rtree_get_req(MI_INFO *info, MI_KEYDEF *keyinfo, uint key_length,
|
|||||||
uchar *after_key = rt_PAGE_NEXT_KEY(k, k_len, nod_flag);
|
uchar *after_key = rt_PAGE_NEXT_KEY(k, k_len, nod_flag);
|
||||||
info->lastpos = _mi_dpos(info, 0, after_key);
|
info->lastpos = _mi_dpos(info, 0, after_key);
|
||||||
info->lastkey_length = k_len + info->s->base.rec_reflength;
|
info->lastkey_length = k_len + info->s->base.rec_reflength;
|
||||||
memcpy(info->lastkey, k, k_len + info->s->base.rec_reflength);
|
memcpy(info->lastkey, k, info->lastkey_length);
|
||||||
|
|
||||||
info->rtree_recursion_depth = level;
|
info->rtree_recursion_depth = level;
|
||||||
*saved_key = k - page_buf;
|
*saved_key = k - page_buf;
|
||||||
|
Reference in New Issue
Block a user