summaryrefslogtreecommitdiff
path: root/storage/maria/ma_rt_index.c
diff options
context:
space:
mode:
Diffstat (limited to 'storage/maria/ma_rt_index.c')
-rw-r--r--storage/maria/ma_rt_index.c100
1 files changed, 62 insertions, 38 deletions
diff --git a/storage/maria/ma_rt_index.c b/storage/maria/ma_rt_index.c
index a90efc4ca38..b2efe298daa 100644
--- a/storage/maria/ma_rt_index.c
+++ b/storage/maria/ma_rt_index.c
@@ -66,12 +66,16 @@ static int maria_rtree_find_req(MARIA_HA *info, MARIA_KEYDEF *keyinfo,
int key_data_length;
uint *saved_key= (uint*) (info->maria_rtree_recursion_state) + level;
MARIA_PAGE page;
+ my_bool buff_alloced;
- if (!(page_buf= (uchar*) my_alloca((uint) keyinfo->block_length)))
+ alloc_on_stack(*info->stack_end_ptr, page_buf, buff_alloced,
+ keyinfo->block_length);
+ if (!page_buf)
{
my_errno= HA_ERR_OUT_OF_MEM;
- return -1;
+ return(-1);
}
+
if (_ma_fetch_keypage(&page, info, keyinfo, page_pos,
PAGECACHE_LOCK_LEFT_UNLOCKED,
DFLT_INIT_HITS, page_buf, 0))
@@ -165,11 +169,11 @@ static int maria_rtree_find_req(MARIA_HA *info, MARIA_KEYDEF *keyinfo,
res= 1;
ok:
- my_afree(page_buf);
+ stack_alloc_free(page_buf, buff_alloced);
return res;
err:
- my_afree(page_buf);
+ stack_alloc_free(page_buf, buff_alloced);
info->cur_row.lastpos= HA_OFFSET_ERROR;
return -1;
}
@@ -329,10 +333,17 @@ static int maria_rtree_get_req(MARIA_HA *info, MARIA_KEYDEF *keyinfo,
uint nod_flag, key_data_length;
int res;
uint *saved_key= (uint*) (info->maria_rtree_recursion_state) + level;
+ my_bool buff_alloced;
MARIA_PAGE page;
- if (!(page_buf= (uchar*) my_alloca((uint) keyinfo->block_length)))
- return -1;
+ alloc_on_stack(*info->stack_end_ptr, page_buf, buff_alloced,
+ keyinfo->block_length);
+ if (!page_buf)
+ {
+ my_errno= HA_ERR_OUT_OF_MEM;
+ return(-1);
+ }
+
if (_ma_fetch_keypage(&page, info, keyinfo, page_pos,
PAGECACHE_LOCK_LEFT_UNLOCKED,
DFLT_INIT_HITS, page_buf, 0))
@@ -422,11 +433,11 @@ static int maria_rtree_get_req(MARIA_HA *info, MARIA_KEYDEF *keyinfo,
res= 1;
ok:
- my_afree(page_buf);
+ stack_alloc_free(page_buf, buff_alloced);
return res;
err:
- my_afree(page_buf);
+ stack_alloc_free(page_buf, buff_alloced);
info->cur_row.lastpos= HA_OFFSET_ERROR;
return -1;
}
@@ -603,18 +614,21 @@ static int maria_rtree_insert_req(MARIA_HA *info, MARIA_KEY *key,
uint nod_flag;
uint key_length= key->data_length;
int res;
+ my_bool buff_alloced;
uchar *page_buf, *k;
MARIA_SHARE *share= info->s;
MARIA_KEYDEF *keyinfo= key->keyinfo;
MARIA_PAGE page;
DBUG_ENTER("maria_rtree_insert_req");
- if (!(page_buf= (uchar*) my_alloca((uint) keyinfo->block_length +
- MARIA_MAX_KEY_BUFF)))
+ alloc_on_stack(*info->stack_end_ptr, page_buf, buff_alloced,
+ keyinfo->block_length + keyinfo->max_store_length);
+ if (!page_buf)
{
my_errno= HA_ERR_OUT_OF_MEM;
DBUG_RETURN(-1); /* purecov: inspected */
}
+
if (_ma_fetch_keypage(&page, info, keyinfo, page_pos, PAGECACHE_LOCK_WRITE,
DFLT_INIT_HITS, page_buf, 0))
goto err;
@@ -695,7 +709,7 @@ static int maria_rtree_insert_req(MARIA_HA *info, MARIA_KEY *key,
}
ok:
- my_afree(page_buf);
+ stack_alloc_free(page_buf, buff_alloced);
DBUG_RETURN(res);
err:
@@ -765,6 +779,7 @@ int maria_rtree_insert_level(MARIA_HA *info, MARIA_KEY *key, int ins_level,
case 1: /* root was split, grow a new root; very rare */
{
uchar *new_root_buf, *new_key_buff;
+ my_bool new_root_buf_alloced;
my_off_t new_root;
uint nod_flag= share->base.key_reflength;
MARIA_PINNED_PAGE tmp_page_link, *page_link;
@@ -773,14 +788,16 @@ int maria_rtree_insert_level(MARIA_HA *info, MARIA_KEY *key, int ins_level,
page_link= &tmp_page_link;
DBUG_PRINT("rtree", ("root was split, grow a new root"));
- if (!(new_root_buf= (uchar*) my_alloca((uint) keyinfo->block_length +
- MARIA_MAX_KEY_BUFF)))
+
+ alloc_on_stack(*info->stack_end_ptr, new_root_buf, new_root_buf_alloced,
+ keyinfo->block_length + keyinfo->max_store_length);
+ if (!new_root_buf)
{
my_errno= HA_ERR_OUT_OF_MEM;
DBUG_RETURN(-1); /* purecov: inspected */
}
- bzero(new_root_buf, share->block_size);
+ bzero(new_root_buf, keyinfo->block_length);
_ma_store_keypage_flag(share, new_root_buf, KEYPAGE_FLAG_ISNOD);
_ma_store_keynr(share, new_root_buf, keyinfo->key_nr);
_ma_store_page_used(share, new_root_buf, share->keypage_header);
@@ -805,14 +822,12 @@ int maria_rtree_insert_level(MARIA_HA *info, MARIA_KEY *key, int ins_level,
_ma_kpointer(info, new_key_buff - nod_flag, old_root);
if (maria_rtree_set_key_mbr(info, &new_key, old_root))
goto err;
- if (maria_rtree_add_key(&new_key, &page, NULL)
- == -1)
+ if (maria_rtree_add_key(&new_key, &page, NULL) == -1)
goto err;
_ma_kpointer(info, new_key_buff - nod_flag, new_page);
if (maria_rtree_set_key_mbr(info, &new_key, new_page))
goto err;
- if (maria_rtree_add_key(&new_key, &page, NULL)
- == -1)
+ if (maria_rtree_add_key(&new_key, &page, NULL) == -1)
goto err;
if (_ma_write_keypage(&page, write_lock, DFLT_INIT_HITS))
goto err;
@@ -820,10 +835,10 @@ int maria_rtree_insert_level(MARIA_HA *info, MARIA_KEY *key, int ins_level,
DBUG_PRINT("rtree", ("new root page: %lu level: %d nod_flag: %u",
(ulong) new_root, 0, page.node));
- my_afree(new_root_buf);
+ stack_alloc_free(new_root_buf, new_root_buf_alloced);
break;
err:
- my_afree(new_root_buf);
+ stack_alloc_free(new_root_buf, new_root_buf_alloced);
DBUG_RETURN(-1); /* purecov: inspected */
}
default:
@@ -922,17 +937,21 @@ static int maria_rtree_delete_req(MARIA_HA *info, const MARIA_KEY *key,
ulong i;
uint nod_flag;
int res;
+ my_bool buff_alloced;
uchar *page_buf, *last, *k;
MARIA_SHARE *share= info->s;
MARIA_KEYDEF *keyinfo= key->keyinfo;
MARIA_PAGE page;
DBUG_ENTER("maria_rtree_delete_req");
- if (!(page_buf= (uchar*) my_alloca((uint) keyinfo->block_length)))
+ alloc_on_stack(*info->stack_end_ptr, page_buf, buff_alloced,
+ keyinfo->block_length);
+ if (!page_buf)
{
my_errno= HA_ERR_OUT_OF_MEM;
- DBUG_RETURN(-1); /* purecov: inspected */
+ DBUG_RETURN(-1);
}
+
if (_ma_fetch_keypage(&page, info, keyinfo, page_pos, PAGECACHE_LOCK_WRITE,
DFLT_INIT_HITS, page_buf, 0))
goto err;
@@ -1072,11 +1091,11 @@ static int maria_rtree_delete_req(MARIA_HA *info, const MARIA_KEY *key,
res= 1;
ok:
- my_afree(page_buf);
+ stack_alloc_free(page_buf, buff_alloced);
DBUG_RETURN(res);
err:
- my_afree(page_buf);
+ stack_alloc_free(page_buf, buff_alloced);
DBUG_RETURN(-1); /* purecov: inspected */
}
@@ -1121,6 +1140,8 @@ my_bool maria_rtree_real_delete(MARIA_HA *info, MARIA_KEY *key,
MARIA_SHARE *share= info->s;
MARIA_KEYDEF *keyinfo= key->keyinfo;
uint key_data_length= key->data_length;
+ my_bool buff_alloced= 0;
+ uchar *page_buf= 0;
DBUG_ENTER("maria_rtree_real_delete");
if ((old_root= share->state.key_root[keyinfo->key_nr]) ==
@@ -1147,9 +1168,9 @@ my_bool maria_rtree_real_delete(MARIA_HA *info, MARIA_KEY *key,
{
uint nod_flag;
ulong i;
- uchar *page_buf;
MARIA_PAGE page;
MARIA_KEY tmp_key;
+
tmp_key.keyinfo= key->keyinfo;
tmp_key.data_length= key->data_length;
tmp_key.ref_length= key->ref_length;
@@ -1157,7 +1178,9 @@ my_bool maria_rtree_real_delete(MARIA_HA *info, MARIA_KEY *key,
if (ReinsertList.n_pages)
{
- if (!(page_buf= (uchar*) my_alloca((uint) keyinfo->block_length)))
+ alloc_on_stack(*info->stack_end_ptr, page_buf, buff_alloced,
+ keyinfo->block_length);
+ if (!page_buf)
{
my_errno= HA_ERR_OUT_OF_MEM;
goto err;
@@ -1186,10 +1209,7 @@ my_bool maria_rtree_real_delete(MARIA_HA *info, MARIA_KEY *key,
if ((res= maria_rtree_insert_level(info, &tmp_key,
ReinsertList.pages[i].level,
root)) == -1)
- {
- my_afree(page_buf);
goto err;
- }
if (res)
{
uint j;
@@ -1205,13 +1225,8 @@ my_bool maria_rtree_real_delete(MARIA_HA *info, MARIA_KEY *key,
}
page_mark_changed(info, &page);
if (_ma_dispose(info, page.pos, 0))
- {
- my_afree(page_buf);
goto err;
- }
}
- my_afree(page_buf);
- my_free(ReinsertList.pages);
}
/* check for redundant root (not leaf, 1 child) and eliminate */
@@ -1243,9 +1258,13 @@ my_bool maria_rtree_real_delete(MARIA_HA *info, MARIA_KEY *key,
default:
goto err; /* purecov: inspected */
}
+ my_free(ReinsertList.pages);
+ stack_alloc_free(page_buf, buff_alloced);
DBUG_RETURN(0);
err:
+ my_free(ReinsertList.pages);
+ stack_alloc_free(page_buf, buff_alloced);
DBUG_RETURN(1);
}
@@ -1268,14 +1287,19 @@ ha_rows maria_rtree_estimate(MARIA_HA *info, MARIA_KEY *key, uint32 flag)
MARIA_SHARE *share= info->s;
MARIA_KEYDEF *keyinfo= key->keyinfo;
MARIA_PAGE page;
+ my_bool buff_alloced;
if (flag & MBR_DISJOINT)
return HA_POS_ERROR;
if ((root= share->state.key_root[key->keyinfo->key_nr]) == HA_OFFSET_ERROR)
return HA_POS_ERROR;
- if (!(page_buf= (uchar*) my_alloca((uint) keyinfo->block_length)))
- return HA_POS_ERROR;
+
+ alloc_on_stack(*info->stack_end_ptr, page_buf, buff_alloced,
+ keyinfo->block_length);
+ if (!page_buf)
+ return(HA_POS_ERROR);
+
if (_ma_fetch_keypage(&page, info, keyinfo, root,
PAGECACHE_LOCK_LEFT_UNLOCKED, DFLT_INIT_HITS, page_buf,
0))
@@ -1343,11 +1367,11 @@ ha_rows maria_rtree_estimate(MARIA_HA *info, MARIA_KEY *key, uint32 flag)
res= HA_POS_ERROR;
}
- my_afree(page_buf);
+ stack_alloc_free(page_buf, buff_alloced);
return res;
err:
- my_afree(page_buf);
+ stack_alloc_free(page_buf, buff_alloced);
return HA_POS_ERROR;
}