MySQL 9.1.0
Source Code Documentation
|
R-tree header file. More...
#include "univ.i"
#include "btr0cur.h"
#include "btr0types.h"
#include "data0type.h"
#include "data0types.h"
#include "dict0types.h"
#include "gis0geo.h"
#include "gis0type.h"
#include "hash0hash.h"
#include "mem0mem.h"
#include "page0page.h"
#include "que0types.h"
#include "rem0types.h"
#include "row0types.h"
#include "trx0types.h"
#include "ut0vec.h"
#include "ut0wqueue.h"
#include "gis0rtree.ic"
Go to the source code of this file.
Functions | |
static bool | RTREE_SEARCH_MODE (page_cur_mode_t mode) |
dtuple_t * | rtr_index_build_node_ptr (const dict_index_t *index, const rtr_mbr_t *mbr, const rec_t *rec, page_no_t page_no, mem_heap_t *heap) |
Builds a Rtree node pointer out of a physical record and a page number. More... | |
rec_t * | rtr_page_split_and_insert (uint32_t flags, btr_cur_t *cursor, ulint **offsets, mem_heap_t **heap, const dtuple_t *tuple, mtr_t *mtr) |
Splits an R-tree index page to halves and inserts the tuple. More... | |
static void | rtr_page_cal_mbr (const dict_index_t *index, const buf_block_t *block, rtr_mbr_t *mbr, mem_heap_t *heap) |
Sets the child node mbr in a node pointer. More... | |
bool | rtr_pcur_move_to_next (const dtuple_t *tuple, page_cur_mode_t mode, select_mode sel_mode, btr_pcur_t *cursor, ulint cur_level, mtr_t *mtr) |
Find the next matching record. More... | |
bool | rtr_cur_search_with_match (const buf_block_t *block, dict_index_t *index, const dtuple_t *tuple, page_cur_mode_t mode, page_cur_t *cursor, rtr_info_t *rtr_info) |
Searches the right position in rtree for a page cursor. More... | |
double | rtr_rec_cal_increase (const dtuple_t *dtuple, const rec_t *rec, const ulint *offsets, double *area, const dd::Spatial_reference_system *srs) |
Calculate the area increased for a new record. More... | |
dberr_t | rtr_ins_enlarge_mbr (btr_cur_t *btr_cur, mtr_t *mtr) |
Following the right link to find the proper block for insert. More... | |
void | rtr_get_father_node (dict_index_t *index, ulint level, const dtuple_t *tuple, btr_cur_t *sea_cur, btr_cur_t *cursor, page_no_t page_no, mtr_t *mtr) |
in: mtr More... | |
static void | rtr_non_leaf_stack_push (rtr_node_path_t *path, page_no_t pageno, node_seq_t seq_no, ulint level, page_no_t child_no, btr_pcur_t *cursor, double mbr_inc) |
Push a nonleaf index node to the search path. More... | |
void | rtr_non_leaf_insert_stack_push (dict_index_t *index, rtr_node_path_t *path, ulint level, const buf_block_t *block, const rec_t *rec, double mbr_inc) |
Push a nonleaf index node to the search path for insertion. More... | |
static node_seq_t | rtr_get_new_ssn_id (dict_index_t *index) |
Allocates a new Split Sequence Number. More... | |
static node_seq_t | rtr_get_current_ssn_id (dict_index_t *index) |
Get the current Split Sequence Number. More... | |
rtr_info_t * | rtr_create_rtr_info (bool need_prdt, bool init_matches, btr_cur_t *cursor, dict_index_t *index) |
Create a RTree search info structure. More... | |
void | rtr_info_update_btr (btr_cur_t *cursor, rtr_info_t *rtr_info) |
Update a btr_cur_t with rtr_info. More... | |
void | rtr_init_rtr_info (rtr_info_t *rtr_info, bool need_prdt, btr_cur_t *cursor, dict_index_t *index, bool reinit) |
Update a btr_cur_t with rtr_info. More... | |
void | rtr_clean_rtr_info (rtr_info_t *rtr_info, bool free_all) |
Clean up Rtree cursor. More... | |
void | rtr_get_mbr_from_rec (const rec_t *rec, const ulint *offsets, rtr_mbr_t *mbr) |
Get the bounding box content from an index record. More... | |
void | rtr_get_mbr_from_tuple (const dtuple_t *dtuple, rtr_mbr *mbr) |
Get the bounding box content from a MBR data record. More... | |
void | rtr_page_get_father (dict_index_t *index, buf_block_t *block, mtr_t *mtr, btr_cur_t *sea_cur, btr_cur_t *cursor) |
ulint * | rtr_page_get_father_block (ulint *offsets, mem_heap_t *heap, dict_index_t *index, buf_block_t *block, mtr_t *mtr, btr_cur_t *sea_cur, btr_cur_t *cursor) |
Returns the father block to a page. More... | |
ulint | rtr_store_parent_path (const buf_block_t *block, btr_cur_t *btr_cur, ulint latch_mode, ulint level, mtr_t *mtr) |
Store the parent path cursor. More... | |
void | rtr_pcur_open_low (dict_index_t *index, ulint level, const dtuple_t *tuple, page_cur_mode_t mode, ulint latch_mode, btr_pcur_t *cursor, ut::Location location, mtr_t *mtr) |
Initializes and opens a persistent cursor to an index tree. More... | |
static void | rtr_pcur_open (dict_index_t *i, const dtuple_t *t, page_cur_mode_t md, ulint l, btr_pcur_t *c, ut::Location loc, mtr_t *m) |
static node_visit_t * | rtr_get_parent_node (btr_cur_t *btr_cur, ulint level, ulint is_insert) |
Returns the R-Tree node stored in the parent search path. More... | |
static btr_pcur_t * | rtr_get_parent_cursor (btr_cur_t *btr_cur, ulint level, ulint is_insert) |
Returns the R-Tree cursor stored in the parent search path. More... | |
void | rtr_page_copy_rec_list_end_no_locks (buf_block_t *new_block, buf_block_t *block, rec_t *rec, dict_index_t *index, mem_heap_t *heap, rtr_rec_move_t *rec_move, ulint max_move, ulint *num_moved, mtr_t *mtr) |
Copy recs from a page to new_block of rtree. More... | |
void | rtr_page_copy_rec_list_start_no_locks (buf_block_t *new_block, buf_block_t *block, rec_t *rec, dict_index_t *index, mem_heap_t *heap, rtr_rec_move_t *rec_move, ulint max_move, ulint *num_moved, mtr_t *mtr) |
Copy recs till a specified rec from a page to new_block of rtree. More... | |
dberr_t | rtr_merge_and_update_mbr (btr_cur_t *cursor, btr_cur_t *cursor2, ulint *offsets, ulint *offsets2, page_t *child_page, mtr_t *mtr) |
Merge 2 mbrs and update the the mbr that cursor is on. More... | |
void | rtr_node_ptr_delete (btr_cur_t *sea_cur, mtr_t *mtr) |
Deletes on the upper level the node pointer to a page. More... | |
bool | rtr_merge_mbr_changed (btr_cur_t *cursor, btr_cur_t *cursor2, ulint *offsets, ulint *offsets2, rtr_mbr_t *new_mbr) |
Check two MBRs are identical or need to be merged. More... | |
bool | rtr_update_mbr_field (btr_cur_t *cursor, ulint *offsets, btr_cur_t *cursor2, page_t *child_page, rtr_mbr_t *new_mbr, rec_t *new_rec, mtr_t *mtr) |
Update the mbr field of a spatial index row. More... | |
bool | rtr_check_same_block (dict_index_t *index, btr_cur_t *cur, buf_block_t *parentb, buf_block_t *childb, mem_heap_t *heap) |
Check whether a Rtree page is child of a parent page. More... | |
static void | rtr_write_mbr (byte *data, const rtr_mbr_t *mbr) |
Sets pointer to the data and length in a field. More... | |
static void | rtr_read_mbr (const byte *data, rtr_mbr_t *mbr) |
Sets pointer to the data and length in a field. More... | |
void | rtr_check_discard_page (dict_index_t *index, btr_cur_t *cursor, buf_block_t *block) |
Check whether a discarding page is in anyone's search path. More... | |
static void | rtr_info_reinit_in_cursor (btr_cur_t *cursor, dict_index_t *index, bool need_prdt) |
Reinitialize a RTree search info. More... | |
int64_t | rtr_estimate_n_rows_in_range (dict_index_t *index, const dtuple_t *tuple, page_cur_mode_t mode) |
Estimates the number of rows in a given area. More... | |
Variables | |
constexpr uint32_t | GEO_DATA_HEADER_SIZE = 4 |
R-tree header file.
Created 2013/03/27 Jimmy Yang and Allen Lai
void rtr_check_discard_page | ( | dict_index_t * | index, |
btr_cur_t * | cursor, | ||
buf_block_t * | block | ||
) |
Check whether a discarding page is in anyone's search path.
[in] | index | Index |
[in,out] | cursor | Cursor on the page to discard: not on the root page |
[in] | block | Block of page to be discarded |
bool rtr_check_same_block | ( | dict_index_t * | index, |
btr_cur_t * | cursor, | ||
buf_block_t * | parentb, | ||
buf_block_t * | childb, | ||
mem_heap_t * | heap | ||
) |
Check whether a Rtree page is child of a parent page.
index | in: index tree |
cursor | in/out: position at the parent entry pointing to the child if successful |
parentb | in: parent page to check |
childb | in: child Page |
heap | in: memory heap |
void rtr_clean_rtr_info | ( | rtr_info_t * | rtr_info, |
bool | free_all | ||
) |
Clean up Rtree cursor.
in: need to free rtr_info itself
Clean up Rtree cursor.
rtr_info | in: RTree search info |
free_all | in: need to free rtr_info itself |
rtr_info_t * rtr_create_rtr_info | ( | bool | need_prdt, |
bool | init_matches, | ||
btr_cur_t * | cursor, | ||
dict_index_t * | index | ||
) |
Create a RTree search info structure.
[in] | need_prdt | Whether predicate lock is needed |
[in] | init_matches | Whether to initiate the "matches" structure for collecting matched leaf records |
[in] | cursor | Tree search cursor |
[in] | index | Index struct |
bool rtr_cur_search_with_match | ( | const buf_block_t * | block, |
dict_index_t * | index, | ||
const dtuple_t * | tuple, | ||
page_cur_mode_t | mode, | ||
page_cur_t * | cursor, | ||
rtr_info_t * | rtr_info | ||
) |
Searches the right position in rtree for a page cursor.
[in] | block | Buffer block |
[in] | index | Index descriptor |
[in] | tuple | Data tuple |
[in] | mode | Page_cur_l, page_cur_le, page_cur_g, or page_cur_ge |
[in,out] | cursor | Page cursor |
[in,out] | rtr_info | Search stack |
int64_t rtr_estimate_n_rows_in_range | ( | dict_index_t * | index, |
const dtuple_t * | tuple, | ||
page_cur_mode_t | mode | ||
) |
Estimates the number of rows in a given area.
[in] | index | index |
[in] | tuple | range tuple containing mbr, may also be empty tuple |
[in] | mode | search mode |
|
inlinestatic |
Get the current Split Sequence Number.
void rtr_get_father_node | ( | dict_index_t * | index, |
ulint | level, | ||
const dtuple_t * | tuple, | ||
btr_cur_t * | sea_cur, | ||
btr_cur_t * | btr_cur, | ||
page_no_t | page_no, | ||
mtr_t * | mtr | ||
) |
in: mtr
in: mtr
It is assumed that mtr holds an x-latch on the tree.
index | in: index |
level | in: the tree level of search |
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! |
sea_cur | in: search cursor |
btr_cur | in/out: tree cursor; the cursor page is s- or x-latched, but see also above! |
page_no | Current page no |
mtr | in: mtr |
Get the bounding box content from an index record.
[in] | rec | Data tuple |
[in] | offsets | Offsets array |
[out] | mbr | Mbr |
Get the bounding box content from a MBR data record.
[in] | dtuple | Data tuple |
[out] | mbr | Mbr to fill |
dtuple | in: data tuple |
mbr | out: mbr to fill |
|
inlinestatic |
Allocates a new Split Sequence Number.
|
inlinestatic |
Returns the R-Tree cursor stored in the parent search path.
[in] | btr_cur | persistent cursor |
[in] | level | index level of buffer page |
[in] | is_insert | whether insert operation |
|
inlinestatic |
Returns the R-Tree node stored in the parent search path.
[in] | btr_cur | persistent cursor |
[in] | level | index level of buffer page |
[in] | is_insert | whether insert operation |
dtuple_t * rtr_index_build_node_ptr | ( | const dict_index_t * | index, |
const rtr_mbr_t * | mbr, | ||
const rec_t * | rec, | ||
page_no_t | page_no, | ||
mem_heap_t * | heap | ||
) |
Builds a Rtree node pointer out of a physical record and a page number.
[in] | index | index |
[in] | mbr | mbr of lower page |
[in] | rec | record for which to build node pointer |
[in] | page_no | page number to put in node pointer |
[in] | heap | memory heap where pointer created |
|
inlinestatic |
Reinitialize a RTree search info.
[in,out] | cursor | tree cursor |
[in] | index | index struct |
[in] | need_prdt | Whether predicate lock is needed |
void rtr_info_update_btr | ( | btr_cur_t * | cursor, |
rtr_info_t * | rtr_info | ||
) |
Update a btr_cur_t with rtr_info.
[in,out] | cursor | Tree cursor |
[in] | rtr_info | Rtr_info to set to the cursor |
void rtr_init_rtr_info | ( | rtr_info_t * | rtr_info, |
bool | need_prdt, | ||
btr_cur_t * | cursor, | ||
dict_index_t * | index, | ||
bool | reinit | ||
) |
Update a btr_cur_t with rtr_info.
in: Whether this is a reinit
Update a btr_cur_t with rtr_info.
rtr_info | ************* in: rtr_info to set to the cursor |
need_prdt | in: Whether predicate lock is needed |
cursor | in: tree search cursor |
index | in: index structure |
reinit | in: Whether this is a reinit |
Following the right link to find the proper block for insert.
[in] | btr_cur | btr cursor |
[in] | mtr | mtr |
dberr_t rtr_merge_and_update_mbr | ( | btr_cur_t * | cursor, |
btr_cur_t * | cursor2, | ||
ulint * | offsets, | ||
ulint * | offsets2, | ||
page_t * | child_page, | ||
mtr_t * | mtr | ||
) |
Merge 2 mbrs and update the the mbr that cursor is on.
[in,out] | cursor | Cursor |
[in] | cursor2 | The other cursor |
[in] | offsets | Rec offsets |
[in] | offsets2 | Rec offsets |
[in] | child_page | The child page. |
[in] | mtr | Mini-transaction |
bool rtr_merge_mbr_changed | ( | btr_cur_t * | cursor, |
btr_cur_t * | cursor2, | ||
ulint * | offsets, | ||
ulint * | offsets2, | ||
rtr_mbr_t * | new_mbr | ||
) |
Check two MBRs are identical or need to be merged.
[in] | cursor | Cursor |
[in] | cursor2 | The other cursor |
[in] | offsets | Rec offsets |
[in] | offsets2 | Rec offsets |
[out] | new_mbr | Mbr to update |
Deletes on the upper level the node pointer to a page.
[in] | sea_cur | Search cursor, contains information about parent nodes in search |
[in] | mtr | Mini-transaction |
void rtr_non_leaf_insert_stack_push | ( | dict_index_t * | index, |
rtr_node_path_t * | path, | ||
ulint | level, | ||
const buf_block_t * | block, | ||
const rec_t * | rec, | ||
double | mbr_inc | ||
) |
Push a nonleaf index node to the search path for insertion.
[in] | index | index descriptor |
[in,out] | path | search path |
[in] | level | index level |
[in] | block | block of the page |
[in] | rec | positioned record |
[in] | mbr_inc | MBR needs to be enlarged |
|
inlinestatic |
Push a nonleaf index node to the search path.
[in,out] | path | search path |
[in] | pageno | pageno to insert |
[in] | seq_no | Node sequence num |
[in] | level | index level |
[in] | child_no | child page no |
[in] | cursor | position cursor |
[in] | mbr_inc | MBR needs to be enlarged |
|
inlinestatic |
Sets the child node mbr in a node pointer.
[in] | index | index |
[in] | block | buffer block |
[out] | mbr | MBR encapsulates the page |
[in] | heap | heap for the memory allocation |
void rtr_page_copy_rec_list_end_no_locks | ( | buf_block_t * | new_block, |
buf_block_t * | block, | ||
rec_t * | rec, | ||
dict_index_t * | index, | ||
mem_heap_t * | heap, | ||
rtr_rec_move_t * | rec_move, | ||
ulint | max_move, | ||
ulint * | num_moved, | ||
mtr_t * | mtr | ||
) |
Copy recs from a page to new_block of rtree.
Differs from page_copy_rec_list_end, because this function does not touch the lock table and max trx id on page or compress the page.
IMPORTANT: The caller will have to update IBUF_BITMAP_FREE if new_block is a compressed leaf page in a secondary index. This has to be done either within the same mini-transaction, or by invoking ibuf_reset_free_bits() before mtr_commit().
[in] | new_block | Index page to copy to |
[in] | block | Index page of rec |
[in] | rec | Record on page |
[in] | index | Record descriptor |
[in,out] | heap | Heap memory |
[in] | rec_move | Recording records moved |
[in] | max_move | Num of rec to move |
[out] | num_moved | Num of rec to move |
[in] | mtr | Mini-transaction |
void rtr_page_copy_rec_list_start_no_locks | ( | buf_block_t * | new_block, |
buf_block_t * | block, | ||
rec_t * | rec, | ||
dict_index_t * | index, | ||
mem_heap_t * | heap, | ||
rtr_rec_move_t * | rec_move, | ||
ulint | max_move, | ||
ulint * | num_moved, | ||
mtr_t * | mtr | ||
) |
Copy recs till a specified rec from a page to new_block of rtree.
[in] | new_block | Index page to copy to |
[in] | block | Index page of rec |
[in] | rec | Record on page |
[in] | index | Record descriptor |
[in,out] | heap | Heap memory |
[in] | rec_move | Recording records moved |
[in] | max_move | Num of rec to move |
[out] | num_moved | Num of rec to move |
[in] | mtr | Mini-transaction |
void rtr_page_get_father | ( | dict_index_t * | index, |
buf_block_t * | block, | ||
mtr_t * | mtr, | ||
btr_cur_t * | sea_cur, | ||
btr_cur_t * | cursor | ||
) |
ulint * rtr_page_get_father_block | ( | ulint * | offsets, |
mem_heap_t * | heap, | ||
dict_index_t * | index, | ||
buf_block_t * | block, | ||
mtr_t * | mtr, | ||
btr_cur_t * | sea_cur, | ||
btr_cur_t * | cursor | ||
) |
Returns the father block to a page.
It is assumed that mtr holds an X or SX latch on the tree.
It is assumed that mtr holds an X or SX latch on the tree.
offsets | in: work area for the return value |
heap | in: memory heap to use |
index | in: b-tree index |
block | in: child page in the index |
mtr | in: mtr |
sea_cur | in: search cursor, contains information about parent nodes in search |
cursor | out: cursor on node pointer record, its page x-latched |
rec_t * rtr_page_split_and_insert | ( | uint32_t | flags, |
btr_cur_t * | cursor, | ||
ulint ** | offsets, | ||
mem_heap_t ** | heap, | ||
const dtuple_t * | tuple, | ||
mtr_t * | mtr | ||
) |
Splits an R-tree index page to halves and inserts the tuple.
It is assumed that mtr holds an x-latch to the index tree. NOTE: the tree x-latch is released within this function! NOTE that the operation of this function must always succeed, we cannot reverse it: therefore enough free disk space (2 pages) must be guaranteed to be available before this function is called.
It is assumed that mtr holds an x-latch to the index tree. NOTE: the tree x-latch is released within this function! NOTE that the operation of this function must always succeed, we cannot reverse it: therefore enough free disk space (2 pages) must be guaranteed to be available before this function is called.
flags | in: undo logging and locking flags |
cursor | in/out: cursor at which to insert; when the function returns, the cursor is positioned on the predecessor of the inserted record |
offsets | out: offsets on inserted record |
heap | in/out: pointer to memory heap, or NULL |
tuple | in: tuple to insert |
mtr | in: mtr |
bool rtr_pcur_move_to_next | ( | const dtuple_t * | tuple, |
page_cur_mode_t | mode, | ||
select_mode | sel_mode, | ||
btr_pcur_t * | cursor, | ||
ulint | cur_level, | ||
mtr_t * | mtr | ||
) |
Find the next matching record.
This function will first exhaust the copied record listed in the rtr_info->matches vector before moving to next page
[in] | tuple | Data tuple; NOTE: n_fields_cmp in tuple must be set so that it cannot get compared to the node ptr page number field! |
[in] | mode | Cursor search mode |
[in] | sel_mode | Select mode: SELECT_ORDINARY, SELECT_SKIP_LOKCED, or SELECT_NO_WAIT |
[in] | cursor | Persistent cursor; NOTE that the function may release the page latch |
[in] | cur_level | Current level |
[in] | mtr | Mini-transaction |
|
inlinestatic |
void rtr_pcur_open_low | ( | dict_index_t * | index, |
ulint | level, | ||
const dtuple_t * | tuple, | ||
page_cur_mode_t | mode, | ||
ulint | latch_mode, | ||
btr_pcur_t * | cursor, | ||
ut::Location | location, | ||
mtr_t * | mtr | ||
) |
Initializes and opens a persistent cursor to an index tree.
It should be closed with btr_pcur::close. Mainly called by row_search_index_entry()
[in] | index | index |
[in] | level | level in the btree |
[in] | tuple | tuple on which search done |
[in] | mode | PAGE_CUR_L, ...; NOTE that if the search is made using a unique prefix of a record, mode should be PAGE_CUR_LE, not PAGE_CUR_GE, as the latter may end up on the previous page from the record! |
[in] | latch_mode | BTR_SEARCH_LEAF, ... |
[in] | cursor | memore buffer for persistent cursor |
[in] | location | location where called |
[in] | mtr | mtr |
Sets pointer to the data and length in a field.
[in] | data | data |
[out] | mbr | data |
double rtr_rec_cal_increase | ( | const dtuple_t * | dtuple, |
const rec_t * | rec, | ||
const ulint * | offsets, | ||
double * | area, | ||
const dd::Spatial_reference_system * | srs | ||
) |
Calculate the area increased for a new record.
dtuple | in: data tuple to insert, which cause area increase |
rec | in: physical record which differs from dtuple in some of the common fields, or which has an equal number or more fields than dtuple |
offsets | in: array returned by rec_get_offsets() |
area | out: increased area |
srs | in: SRS of R-tree |
ulint rtr_store_parent_path | ( | const buf_block_t * | block, |
btr_cur_t * | btr_cur, | ||
ulint | latch_mode, | ||
ulint | level, | ||
mtr_t * | mtr | ||
) |
Store the parent path cursor.
block | in: block of the page |
btr_cur | in/out: persistent cursor |
latch_mode | in: latch_mode |
level | in: index level |
mtr | in: mtr |
bool rtr_update_mbr_field | ( | btr_cur_t * | cursor, |
ulint * | offsets, | ||
btr_cur_t * | cursor2, | ||
page_t * | child_page, | ||
rtr_mbr_t * | mbr, | ||
rec_t * | new_rec, | ||
mtr_t * | mtr | ||
) |
Update the mbr field of a spatial index row.
cursor | in/out: cursor pointed to rec. |
offsets | in/out: offsets on rec. |
cursor2 | in/out: cursor pointed to rec that should be deleted. this cursor is for btr_compress to delete the merged page's father rec. |
child_page | in: child page. |
mbr | in: the new mbr. |
new_rec | in: rec to use |
mtr | in: mtr |
Sets pointer to the data and length in a field.
[out] | data | data |
[in] | mbr | data |
|
inlinestatic |
|
constexpr |