diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-04-28 09:47:40 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-04-28 19:37:07 +0300 |
commit | fae70d6b1c65c249c6b2927f1461f22b867a605c (patch) | |
tree | 156af3caf7da434d20e0e578a71744f7f9ce7d9d /storage | |
parent | fb7c1b9415c9a8b0dc2e86ae44f0e7a2634e5d7e (diff) | |
download | mariadb-git-fae70d6b1c65c249c6b2927f1461f22b867a605c.tar.gz |
Cleanup: Declare rtr_get_father_node() statically
Diffstat (limited to 'storage')
-rw-r--r-- | storage/innobase/gis/gis0sea.cc | 234 | ||||
-rw-r--r-- | storage/innobase/include/gis0rtree.h | 18 |
2 files changed, 117 insertions, 135 deletions
diff --git a/storage/innobase/gis/gis0sea.cc b/storage/innobase/gis/gis0sea.cc index 7ac529ed0db..e0dde1154b0 100644 --- a/storage/innobase/gis/gis0sea.cc +++ b/storage/innobase/gis/gis0sea.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2016, 2018, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2018, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -686,6 +686,121 @@ rtr_page_get_father( mem_heap_free(heap); } +/********************************************************************//** +Returns the upper level node pointer to a R-Tree page. It is assumed +that mtr holds an x-latch on the tree. */ +static void rtr_get_father_node( + dict_index_t* index, /*!< in: index */ + ulint level, /*!< in: the tree level of search */ + const dtuple_t* tuple, /*!< in: data tuple; NOTE: n_fields_cmp in + tuple must be set so that it cannot get + compared to the node ptr page number field! */ + btr_cur_t* sea_cur,/*!< in: search cursor */ + btr_cur_t* btr_cur,/*!< in/out: tree cursor; the cursor page is + s- or x-latched, but see also above! */ + ulint page_no,/*!< Current page no */ + mtr_t* mtr) /*!< in: mtr */ +{ + mem_heap_t* heap = NULL; + bool ret = false; + const rec_t* rec; + ulint n_fields; + bool new_rtr = false; + + /* Try to optimally locate the parent node. Level should always + less than sea_cur->tree_height unless the root is splitting */ + if (sea_cur && sea_cur->tree_height > level) { + + ut_ad(mtr_memo_contains_flagged(mtr, + dict_index_get_lock(index), + MTR_MEMO_X_LOCK + | MTR_MEMO_SX_LOCK)); + ret = rtr_cur_restore_position( + BTR_CONT_MODIFY_TREE, sea_cur, level, mtr); + + /* Once we block shrink tree nodes while there are + active search on it, this optimal locating should always + succeeds */ + ut_ad(ret); + + if (ret) { + btr_pcur_t* r_cursor = rtr_get_parent_cursor( + sea_cur, level, false); + + rec = btr_pcur_get_rec(r_cursor); + + ut_ad(r_cursor->rel_pos == BTR_PCUR_ON); + page_cur_position(rec, + btr_pcur_get_block(r_cursor), + btr_cur_get_page_cur(btr_cur)); + btr_cur->rtr_info = sea_cur->rtr_info; + btr_cur->tree_height = sea_cur->tree_height; + ut_ad(rtr_compare_cursor_rec( + index, btr_cur, page_no, &heap)); + goto func_exit; + } + } + + /* We arrive here in one of two scenario + 1) check table and btr_valide + 2) index root page being raised */ + ut_ad(!sea_cur || sea_cur->tree_height == level); + + if (btr_cur->rtr_info) { + rtr_clean_rtr_info(btr_cur->rtr_info, true); + } else { + new_rtr = true; + } + + btr_cur->rtr_info = rtr_create_rtr_info(false, false, btr_cur, index); + + if (sea_cur && sea_cur->tree_height == level) { + /* root split, and search the new root */ + btr_cur_search_to_nth_level( + index, level, tuple, PAGE_CUR_RTREE_LOCATE, + BTR_CONT_MODIFY_TREE, btr_cur, 0, + __FILE__, __LINE__, mtr); + + } else { + /* btr_validate */ + ut_ad(level >= 1); + ut_ad(!sea_cur); + + btr_cur_search_to_nth_level( + index, level, tuple, PAGE_CUR_RTREE_LOCATE, + BTR_CONT_MODIFY_TREE, btr_cur, 0, + __FILE__, __LINE__, mtr); + + rec = btr_cur_get_rec(btr_cur); + n_fields = dtuple_get_n_fields_cmp(tuple); + + if (page_rec_is_infimum(rec) + || (btr_cur->low_match != n_fields)) { + ret = rtr_pcur_getnext_from_path( + tuple, PAGE_CUR_RTREE_LOCATE, btr_cur, + level, BTR_CONT_MODIFY_TREE, + true, mtr); + + ut_ad(ret && btr_cur->low_match == n_fields); + } + } + + ret = rtr_compare_cursor_rec( + index, btr_cur, page_no, &heap); + + ut_ad(ret); + +func_exit: + if (heap) { + mem_heap_free(heap); + } + + if (new_rtr && btr_cur->rtr_info) { + rtr_clean_rtr_info(btr_cur->rtr_info, true); + btr_cur->rtr_info = NULL; + } +} + /** Returns the upper level node pointer to a R-Tree page. It is assumed that mtr holds an SX-latch or X-latch on the tree. @return rec_get_offsets() of the node pointer record */ @@ -806,123 +921,6 @@ rtr_page_get_father_block( cursor, mtr)); } -/********************************************************************//** -Returns the upper level node pointer to a R-Tree page. It is assumed -that mtr holds an x-latch on the tree. */ -void -rtr_get_father_node( -/*================*/ - dict_index_t* index, /*!< in: index */ - ulint level, /*!< in: the tree level of search */ - const dtuple_t* tuple, /*!< in: data tuple; NOTE: n_fields_cmp in - tuple must be set so that it cannot get - compared to the node ptr page number field! */ - btr_cur_t* sea_cur,/*!< in: search cursor */ - btr_cur_t* btr_cur,/*!< in/out: tree cursor; the cursor page is - s- or x-latched, but see also above! */ - ulint page_no,/*!< Current page no */ - mtr_t* mtr) /*!< in: mtr */ -{ - mem_heap_t* heap = NULL; - bool ret = false; - const rec_t* rec; - ulint n_fields; - bool new_rtr = false; - - /* Try to optimally locate the parent node. Level should always - less than sea_cur->tree_height unless the root is splitting */ - if (sea_cur && sea_cur->tree_height > level) { - - ut_ad(mtr_memo_contains_flagged(mtr, - dict_index_get_lock(index), - MTR_MEMO_X_LOCK - | MTR_MEMO_SX_LOCK)); - ret = rtr_cur_restore_position( - BTR_CONT_MODIFY_TREE, sea_cur, level, mtr); - - /* Once we block shrink tree nodes while there are - active search on it, this optimal locating should always - succeeds */ - ut_ad(ret); - - if (ret) { - btr_pcur_t* r_cursor = rtr_get_parent_cursor( - sea_cur, level, false); - - rec = btr_pcur_get_rec(r_cursor); - - ut_ad(r_cursor->rel_pos == BTR_PCUR_ON); - page_cur_position(rec, - btr_pcur_get_block(r_cursor), - btr_cur_get_page_cur(btr_cur)); - btr_cur->rtr_info = sea_cur->rtr_info; - btr_cur->tree_height = sea_cur->tree_height; - ut_ad(rtr_compare_cursor_rec( - index, btr_cur, page_no, &heap)); - goto func_exit; - } - } - - /* We arrive here in one of two scenario - 1) check table and btr_valide - 2) index root page being raised */ - ut_ad(!sea_cur || sea_cur->tree_height == level); - - if (btr_cur->rtr_info) { - rtr_clean_rtr_info(btr_cur->rtr_info, true); - } else { - new_rtr = true; - } - - btr_cur->rtr_info = rtr_create_rtr_info(false, false, btr_cur, index); - - if (sea_cur && sea_cur->tree_height == level) { - /* root split, and search the new root */ - btr_cur_search_to_nth_level( - index, level, tuple, PAGE_CUR_RTREE_LOCATE, - BTR_CONT_MODIFY_TREE, btr_cur, 0, - __FILE__, __LINE__, mtr); - - } else { - /* btr_validate */ - ut_ad(level >= 1); - ut_ad(!sea_cur); - - btr_cur_search_to_nth_level( - index, level, tuple, PAGE_CUR_RTREE_LOCATE, - BTR_CONT_MODIFY_TREE, btr_cur, 0, - __FILE__, __LINE__, mtr); - - rec = btr_cur_get_rec(btr_cur); - n_fields = dtuple_get_n_fields_cmp(tuple); - - if (page_rec_is_infimum(rec) - || (btr_cur->low_match != n_fields)) { - ret = rtr_pcur_getnext_from_path( - tuple, PAGE_CUR_RTREE_LOCATE, btr_cur, - level, BTR_CONT_MODIFY_TREE, - true, mtr); - - ut_ad(ret && btr_cur->low_match == n_fields); - } - } - - ret = rtr_compare_cursor_rec( - index, btr_cur, page_no, &heap); - - ut_ad(ret); - -func_exit: - if (heap) { - mem_heap_free(heap); - } - - if (new_rtr && btr_cur->rtr_info) { - rtr_clean_rtr_info(btr_cur->rtr_info, true); - btr_cur->rtr_info = NULL; - } -} - /*******************************************************************//** Create a RTree search info structure */ rtr_info_t* diff --git a/storage/innobase/include/gis0rtree.h b/storage/innobase/include/gis0rtree.h index ffb6beb922b..028014970f1 100644 --- a/storage/innobase/include/gis0rtree.h +++ b/storage/innobase/include/gis0rtree.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2014, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2018, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -166,22 +166,6 @@ rtr_ins_enlarge_mbr( que_thr_t* thr, /*!< in: query thread */ mtr_t* mtr); /*!< in: mtr */ -/********************************************************************//** -*/ -void -rtr_get_father_node( -/*================*/ - dict_index_t* index, /*!< in: index */ - ulint level, /*!< in: the tree level of search */ - const dtuple_t* tuple, /*!< in: data tuple; NOTE: n_fields_cmp in - tuple must be set so that it cannot get - compared to the node ptr page number field! */ - btr_cur_t* sea_cur,/*!< in: search cursor */ - btr_cur_t* cursor, /*!< in/out: tree cursor; the cursor page is - s- or x-latched */ - ulint page_no,/*!< in: current page no */ - mtr_t* mtr); /*!< in: mtr */ - /**************************************************************//** push a nonleaf index node to the search path */ UNIV_INLINE |