mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 02:46:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			544 lines
		
	
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			544 lines
		
	
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*****************************************************************************
 | |
| 
 | |
| Copyright (c) 2014, 2016, Oracle and/or its affiliates. All Rights Reserved.
 | |
| Copyright (c) 2017, 2023, 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
 | |
| Foundation; version 2 of the License.
 | |
| 
 | |
| This program is distributed in the hope that it will be useful, but WITHOUT
 | |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | |
| FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License along with
 | |
| this program; if not, write to the Free Software Foundation, Inc.,
 | |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
 | |
| 
 | |
| *****************************************************************************/
 | |
| 
 | |
| /******************************************************************//**
 | |
| @file include gis0rtree.h
 | |
| R-tree header file
 | |
| 
 | |
| Created 2013/03/27 Jimmy Yang and Allen Lai
 | |
| ***********************************************************************/
 | |
| 
 | |
| #ifndef gis0rtree_h
 | |
| #define gis0rtree_h
 | |
| 
 | |
| #include "btr0cur.h"
 | |
| #include "rem0types.h"
 | |
| 
 | |
| /* Whether MBR 'a' contains 'b' */
 | |
| #define	MBR_CONTAIN_CMP(a, b)					\
 | |
| 	((((b)->xmin >= (a)->xmin) && ((b)->xmax <= (a)->xmax)	\
 | |
| 	 && ((b)->ymin >= (a)->ymin) && ((b)->ymax <= (a)->ymax)))
 | |
| 
 | |
| /* Whether MBR 'a' equals to 'b' */
 | |
| #define	MBR_EQUAL_CMP(a, b)					\
 | |
| 	((((b)->xmin == (a)->xmin) && ((b)->xmax == (a)->xmax))	\
 | |
| 	 && (((b)->ymin == (a)->ymin) && ((b)->ymax == (a)->ymax)))
 | |
| 
 | |
| /* Whether MBR 'a' intersects 'b' */
 | |
| #define	MBR_INTERSECT_CMP(a, b)					\
 | |
| 	((((b)->xmin <= (a)->xmax) || ((b)->xmax >= (a)->xmin))	\
 | |
| 	 && (((b)->ymin <= (a)->ymax) || ((b)->ymax >= (a)->ymin)))
 | |
| 
 | |
| /* Whether MBR 'a' and 'b' disjoint */
 | |
| #define	MBR_DISJOINT_CMP(a, b)	(!MBR_INTERSECT_CMP(a, b))
 | |
| 
 | |
| /* Whether MBR 'a' within 'b' */
 | |
| #define	MBR_WITHIN_CMP(a, b)					\
 | |
| 	((((b)->xmin <= (a)->xmin) && ((b)->xmax >= (a)->xmax))	\
 | |
| 	 && (((b)->ymin <= (a)->ymin) && ((b)->ymax >= (a)->ymax)))
 | |
| 
 | |
| /* Define it for rtree search mode checking. */
 | |
| #define RTREE_SEARCH_MODE(mode)					\
 | |
| 	(((mode) >= PAGE_CUR_CONTAIN) && ((mode <= PAGE_CUR_RTREE_GET_FATHER)))
 | |
| 
 | |
| /* Geometry data header */
 | |
| #define	GEO_DATA_HEADER_SIZE	4
 | |
| 
 | |
| /** Search for a spatial index leaf page record.
 | |
| @param cur         cursor
 | |
| @param thr         query thread
 | |
| @param tuple       search tuple
 | |
| @param latch_mode  latching mode
 | |
| @param mtr         mini-transaction
 | |
| @param mode        search mode */
 | |
| dberr_t rtr_search_leaf(btr_cur_t *cur, que_thr_t *thr, const dtuple_t *tuple,
 | |
|                         btr_latch_mode latch_mode, mtr_t *mtr,
 | |
|                         page_cur_mode_t mode= PAGE_CUR_RTREE_LOCATE)
 | |
|   MY_ATTRIBUTE((nonnull(1,3,5), warn_unused_result));
 | |
| 
 | |
| /** Search for inserting a spatial index leaf page record.
 | |
| @param cur         cursor
 | |
| @param tuple       search tuple
 | |
| @param latch_mode  latching mode
 | |
| @param mtr         mini-transaction */
 | |
| inline dberr_t rtr_insert_leaf(btr_cur_t *cur, que_thr_t *thr,
 | |
|                                const dtuple_t *tuple,
 | |
|                                btr_latch_mode latch_mode, mtr_t *mtr)
 | |
| {
 | |
|   return rtr_search_leaf(cur, thr, tuple, latch_mode, mtr,
 | |
|                          PAGE_CUR_RTREE_INSERT);
 | |
| }
 | |
| 
 | |
| /** Search for a spatial index leaf page record.
 | |
| @param pcur        cursor
 | |
| @param thr         query thread
 | |
| @param tuple       search tuple
 | |
| @param mode        search mode
 | |
| @param mtr         mini-transaction */
 | |
| dberr_t rtr_search_leaf(btr_pcur_t *pcur, que_thr_t *thr,
 | |
|                         const dtuple_t *tuple,
 | |
|                         page_cur_mode_t mode, mtr_t *mtr)
 | |
|   MY_ATTRIBUTE((nonnull, warn_unused_result));
 | |
| 
 | |
| dberr_t rtr_search_to_nth_level(btr_cur_t *cur, que_thr_t *thr,
 | |
|                                 const dtuple_t *tuple,
 | |
|                                 btr_latch_mode latch_mode, mtr_t *mtr,
 | |
|                                 page_cur_mode_t mode, ulint level)
 | |
|   MY_ATTRIBUTE((nonnull(1,3,5), warn_unused_result));
 | |
| 
 | |
| /**********************************************************************//**
 | |
| Builds a Rtree node pointer out of a physical record and a page number.
 | |
| @return own: node pointer */
 | |
| dtuple_t*
 | |
| rtr_index_build_node_ptr(
 | |
| /*=====================*/
 | |
| 	const dict_index_t*	index,	/*!< in: index */
 | |
| 	const rtr_mbr_t*	mbr,	/*!< in: mbr of lower page */
 | |
| 	const rec_t*		rec,	/*!< in: record for which to build node
 | |
| 					pointer */
 | |
| 	ulint			page_no,/*!< in: page number to put in node
 | |
| 					pointer */
 | |
| 	mem_heap_t*		heap);	/*!< in: memory heap where pointer
 | |
| 					created */
 | |
| 
 | |
| /*************************************************************//**
 | |
| 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.
 | |
| @return inserted record */
 | |
| rec_t*
 | |
| rtr_page_split_and_insert(
 | |
| /*======================*/
 | |
| 	ulint		flags,	/*!< in: undo logging and locking flags */
 | |
| 	btr_cur_t*	cursor,	/*!< in/out: cursor at which to insert; when the
 | |
| 				function returns, the cursor is positioned
 | |
| 				on the predecessor of the inserted record */
 | |
| 	rec_offs**	offsets,/*!< out: offsets on inserted record */
 | |
| 	mem_heap_t**	heap,	/*!< in/out: pointer to memory heap, or NULL */
 | |
| 	const dtuple_t*	tuple,	/*!< in: tuple to insert */
 | |
| 	ulint		n_ext,	/*!< in: number of externally stored columns */
 | |
| 	mtr_t*		mtr,	/*!< in: mtr */
 | |
| 	dberr_t*	err,	/*!< out: error code */
 | |
| 	que_thr_t*	thr);	/*!< in: query thread */
 | |
| 
 | |
| /*************************************************************//**
 | |
| Makes tree one level higher by splitting the root, and inserts the tuple.
 | |
| NOTE that the operation of this function must always succeed,
 | |
| we cannot reverse it: therefore enough free disk space must be
 | |
| guaranteed to be available before this function is called.
 | |
| @return inserted record */
 | |
| rec_t*
 | |
| rtr_root_raise_and_insert(
 | |
| 	ulint		flags,	/*!< in: undo logging and locking flags */
 | |
| 	btr_cur_t*	cursor,	/*!< in: cursor at which to insert: must be
 | |
| 				on the root page; when the function returns,
 | |
| 				the cursor is positioned on the predecessor
 | |
| 				of the inserted record */
 | |
| 	rec_offs**	offsets,/*!< out: offsets on inserted record */
 | |
| 	mem_heap_t**	heap,	/*!< in/out: pointer to memory heap, or NULL */
 | |
| 	const dtuple_t*	tuple,	/*!< in: tuple to insert */
 | |
| 	ulint		n_ext,	/*!< in: number of externally stored columns */
 | |
| 	mtr_t*		mtr,	/*!< in: mtr */
 | |
| 	dberr_t*	err,	/*!< out: error code */
 | |
| 	que_thr_t*	thr);	/*!< in: query thread */
 | |
| 
 | |
| /**************************************************************//**
 | |
| Sets the child node mbr in a node pointer. */
 | |
| UNIV_INLINE
 | |
| void
 | |
| rtr_page_cal_mbr(
 | |
| /*=============*/
 | |
| 	const dict_index_t*	index,	/*!< in: index */
 | |
| 	const buf_block_t*	block,	/*!< in: buffer block */
 | |
| 	rtr_mbr_t*		mbr,	/*!< out: MBR encapsulates the page */
 | |
| 	mem_heap_t*		heap);	/*!< in: heap for the memory
 | |
| 					allocation */
 | |
| /*************************************************************//**
 | |
| 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
 | |
| @return true if there is next qualified record found, otherwise(if
 | |
| exhausted) false */
 | |
| bool
 | |
| rtr_pcur_move_to_next(
 | |
| /*==================*/
 | |
| 	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! */
 | |
| 	page_cur_mode_t	mode,	/*!< in: cursor search mode */
 | |
| 	btr_pcur_t*	cursor, /*!< in: persistent cursor; NOTE that the
 | |
| 				function may release the page latch */
 | |
| 	ulint		cur_level,
 | |
| 				/*!< in: current level */
 | |
| 	mtr_t*		mtr)	/*!< in: mtr */
 | |
| 	MY_ATTRIBUTE((warn_unused_result));
 | |
| 
 | |
| /****************************************************************//**
 | |
| Searches the right position in rtree for a page cursor. */
 | |
| bool
 | |
| rtr_cur_search_with_match(
 | |
| /*======================*/
 | |
| 	const buf_block_t*	block,	/*!< in: buffer block */
 | |
| 	dict_index_t*		index,	/*!< in: index descriptor */
 | |
| 	const dtuple_t*		tuple,	/*!< in: data tuple */
 | |
| 	page_cur_mode_t		mode,	/*!< in: PAGE_CUR_L,
 | |
| 					PAGE_CUR_LE, PAGE_CUR_G, or
 | |
| 					PAGE_CUR_GE */
 | |
| 	page_cur_t*		cursor,	/*!< in/out: page cursor */
 | |
| 	rtr_info_t*		rtr_info);/*!< in/out: search stack */
 | |
| 
 | |
| /****************************************************************//**
 | |
| Calculate the area increased for a new record
 | |
| @return area increased */
 | |
| double
 | |
| rtr_rec_cal_increase(
 | |
| /*=================*/
 | |
| 	const dtuple_t*	dtuple,	/*!< in: data tuple to insert, which
 | |
| 				cause area increase */
 | |
| 	const rec_t*	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 */
 | |
| 	double*		area);	/*!< out: increased area */
 | |
| 
 | |
| /****************************************************************//**
 | |
| Following the right link to find the proper block for insert.
 | |
| @return the proper block.*/
 | |
| dberr_t
 | |
| rtr_ins_enlarge_mbr(
 | |
| /*=================*/
 | |
| 	btr_cur_t*		cursor,	/*!< in: btr cursor */
 | |
| 	mtr_t*			mtr);	/*!< in: mtr */
 | |
| 
 | |
| /**************************************************************//**
 | |
| push a nonleaf index node to the search path */
 | |
| UNIV_INLINE
 | |
| void
 | |
| rtr_non_leaf_stack_push(
 | |
| /*====================*/
 | |
| 	rtr_node_path_t*	path,		/*!< in/out: search path */
 | |
| 	uint32_t		pageno,		/*!< in: pageno to insert */
 | |
| 	node_seq_t		seq_no,		/*!< in: Node sequence num */
 | |
| 	ulint			level,		/*!< in: index level */
 | |
| 	uint32_t		child_no,	/*!< in: child page no */
 | |
| 	btr_pcur_t*		cursor,		/*!< in: position cursor */
 | |
| 	double			mbr_inc);	/*!< in: MBR needs to be
 | |
| 						enlarged */
 | |
| 
 | |
| /**************************************************************//**
 | |
| push a nonleaf index node to the search path for insertion */
 | |
| void
 | |
| rtr_non_leaf_insert_stack_push(
 | |
| /*===========================*/
 | |
| 	dict_index_t*		index,		/*!< in: index descriptor */
 | |
| 	rtr_node_path_t*	path,		/*!< in/out: search path */
 | |
| 	ulint			level,		/*!< in: index level */
 | |
| 	const buf_block_t*	block,		/*!< in: block of the page */
 | |
| 	const rec_t*		rec,		/*!< in: positioned record */
 | |
| 	double			mbr_inc);	/*!< in: MBR needs to be
 | |
| 						enlarged */
 | |
| 
 | |
| #define rtr_get_new_ssn_id(index) (index)->assign_ssn()
 | |
| #define rtr_get_current_ssn_id(index) (index)->ssn()
 | |
| 
 | |
| /********************************************************************//**
 | |
| Create a RTree search info structure */
 | |
| rtr_info_t*
 | |
| rtr_create_rtr_info(
 | |
| /******************/
 | |
| 	bool		need_prdt,	/*!< in: Whether predicate lock is
 | |
| 					needed */
 | |
| 	bool		init_matches,	/*!< in: Whether to initiate the
 | |
| 					"matches" structure for collecting
 | |
| 					matched leaf records */
 | |
| 	que_thr_t*	thr,		/*!< in/out: query thread */
 | |
| 	btr_cur_t*	cursor);	/*!< in: tree search cursor */
 | |
| 
 | |
| /********************************************************************//**
 | |
| Update a btr_cur_t with rtr_info */
 | |
| void
 | |
| rtr_info_update_btr(
 | |
| /******************/
 | |
| 	btr_cur_t*	cursor,		/*!< in/out: tree cursor */
 | |
| 	rtr_info_t*	rtr_info);	/*!< in: rtr_info to set to the
 | |
| 					cursor */
 | |
| 
 | |
| /********************************************************************//**
 | |
| Update a btr_cur_t with rtr_info */
 | |
| void
 | |
| rtr_init_rtr_info(
 | |
| /****************/
 | |
| 	rtr_info_t*	rtr_info,	/*!< in: rtr_info to set to the
 | |
| 					cursor */
 | |
| 	bool		need_prdt,	/*!< in: Whether predicate lock is
 | |
| 					needed */
 | |
| 	btr_cur_t*	cursor,		/*!< in: tree search cursor */
 | |
| 	dict_index_t*	index,		/*!< in: index structure */
 | |
| 	bool		reinit);	/*!< in: Whether this is a reinit */
 | |
| 
 | |
| /**************************************************************//**
 | |
| Clean up Rtree cursor */
 | |
| void
 | |
| rtr_clean_rtr_info(
 | |
| /*===============*/
 | |
| 	rtr_info_t*	rtr_info,	/*!< in: RTree search info */
 | |
| 	bool		free_all);	/*!< in: need to free rtr_info itself */
 | |
| 
 | |
| /****************************************************************//**
 | |
| Get the bounding box content from an index record*/
 | |
| void
 | |
| rtr_get_mbr_from_rec(
 | |
| /*=================*/
 | |
| 	const rec_t*	rec,	/*!< in: data tuple */
 | |
| 	const rec_offs*	offsets,/*!< in: offsets array */
 | |
| 	rtr_mbr_t*	mbr);	/*!< out MBR */
 | |
| 
 | |
| /****************************************************************//**
 | |
| Get the bounding box content from a MBR data record */
 | |
| void
 | |
| rtr_get_mbr_from_tuple(
 | |
| /*===================*/
 | |
| 	const dtuple_t*	dtuple,	/*!< in: data tuple */
 | |
| 	rtr_mbr*	mbr);	/*!< out: mbr to fill */
 | |
| 
 | |
| /* Get the rtree page father.
 | |
| @param[in,out]	mtr		mtr
 | |
| @param[in]	sea_cur		search cursor, contains information
 | |
| 				about parent nodes in search
 | |
| @param[in,out]	cursor		cursor on node pointer record,
 | |
| 				its page x-latched
 | |
| @param[in,out]	thr		query thread
 | |
| @return whether the cursor was successfully positioned */
 | |
| bool rtr_page_get_father(mtr_t *mtr, btr_cur_t *sea_cur, btr_cur_t *cursor,
 | |
|                          que_thr_t *thr)
 | |
|   MY_ATTRIBUTE((nonnull(1,3), warn_unused_result));
 | |
| 
 | |
| /************************************************************//**
 | |
| Returns the father block to a page. It is assumed that mtr holds
 | |
| an X or SX latch on the tree.
 | |
| @return rec_get_offsets() of the node pointer record */
 | |
| rec_offs*
 | |
| rtr_page_get_father_block(
 | |
| /*======================*/
 | |
| 	rec_offs*	offsets,/*!< in: work area for the return value */
 | |
| 	mem_heap_t*	heap,	/*!< in: memory heap to use */
 | |
| 	btr_cur_t*	sea_cur,/*!< in: search cursor, contains information
 | |
| 				about parent nodes in search */
 | |
| 	btr_cur_t*	cursor,	/*!< out: cursor on node pointer record,
 | |
| 				its page x-latched */
 | |
| 	que_thr_t*	thr,	/*!< in/out: query thread */
 | |
| 	mtr_t*		mtr);	/*!< in/out: mtr */
 | |
| /**************************************************************//**
 | |
| Store the parent path cursor
 | |
| @return number of cursor stored */
 | |
| ulint
 | |
| rtr_store_parent_path(
 | |
| /*==================*/
 | |
| 	const buf_block_t*	block,	/*!< in: block of the page */
 | |
| 	btr_cur_t*		btr_cur,/*!< in/out: persistent cursor */
 | |
| 	btr_latch_mode		latch_mode,
 | |
| 					/*!< in: latch_mode */
 | |
| 	ulint			level,	/*!< in: index level */
 | |
| 	mtr_t*			mtr);	/*!< in: mtr */
 | |
| 
 | |
| /**************************************************************//**
 | |
| Initializes and opens a persistent cursor to an index tree. It should be
 | |
| closed with btr_pcur_close. */
 | |
| bool rtr_search(
 | |
| 	const dtuple_t*	tuple,	/*!< in: tuple on which search done */
 | |
| 	btr_latch_mode	latch_mode,/*!< in: BTR_MODIFY_LEAF, ... */
 | |
| 	btr_pcur_t*	cursor,	/*!< in: memory buffer for persistent cursor */
 | |
| 	que_thr_t*	thr,	/*!< in/out; query thread */
 | |
| 	mtr_t*		mtr)	/*!< in: mtr */
 | |
| 	MY_ATTRIBUTE((warn_unused_result));
 | |
| 
 | |
| /*********************************************************//**
 | |
| Returns the R-Tree node stored in the parent search path
 | |
| @return pointer to R-Tree cursor component */
 | |
| UNIV_INLINE
 | |
| node_visit_t*
 | |
| rtr_get_parent_node(
 | |
| /*================*/
 | |
| 	btr_cur_t*	btr_cur,	/*!< in: persistent cursor */
 | |
| 	ulint		level,		/*!< in: index level of buffer page */
 | |
| 	ulint		is_insert);	/*!< in: whether it is insert */
 | |
| 
 | |
| /*********************************************************//**
 | |
| Returns the R-Tree cursor stored in the parent search path
 | |
| @return pointer to R-Tree cursor component */
 | |
| UNIV_INLINE
 | |
| btr_pcur_t*
 | |
| rtr_get_parent_cursor(
 | |
| /*==================*/
 | |
| 	btr_cur_t*	btr_cur,	/*!< in: persistent cursor */
 | |
| 	ulint		level,		/*!< in: index level of buffer page */
 | |
| 	ulint		is_insert);	/*!< in: whether insert operation */
 | |
| 
 | |
| MY_ATTRIBUTE((warn_unused_result))
 | |
| /*************************************************************//**
 | |
| Copy recs from a page to new_block of rtree.
 | |
| 
 | |
| @return error code */
 | |
| dberr_t
 | |
| rtr_page_copy_rec_list_end_no_locks(
 | |
| /*================================*/
 | |
| 	buf_block_t*	new_block,	/*!< in: index page to copy to */
 | |
| 	buf_block_t*	block,		/*!< in: index page of rec */
 | |
| 	rec_t*		rec,		/*!< in: record on page */
 | |
| 	dict_index_t*	index,		/*!< in: record descriptor */
 | |
| 	mem_heap_t*	heap,		/*!< in/out: heap memory */
 | |
| 	rtr_rec_move_t*	rec_move,	/*!< in: recording records moved */
 | |
| 	ulint		max_move,	/*!< in: num of rec to move */
 | |
| 	ulint*		num_moved,	/*!< out: num of rec to move */
 | |
| 	mtr_t*		mtr);		/*!< in: mtr */
 | |
| 
 | |
| MY_ATTRIBUTE((warn_unused_result))
 | |
| /*************************************************************//**
 | |
| Copy recs till a specified rec from a page to new_block of rtree.
 | |
| 
 | |
| @return error code */
 | |
| dberr_t
 | |
| rtr_page_copy_rec_list_start_no_locks(
 | |
| /*==================================*/
 | |
| 	buf_block_t*	new_block,	/*!< in: index page to copy to */
 | |
| 	buf_block_t*	block,		/*!< in: index page of rec */
 | |
| 	rec_t*		rec,		/*!< in: record on page */
 | |
| 	dict_index_t*	index,		/*!< in: record descriptor */
 | |
| 	mem_heap_t*	heap,		/*!< in/out: heap memory */
 | |
| 	rtr_rec_move_t*	rec_move,	/*!< in: recording records moved */
 | |
| 	ulint		max_move,	/*!< in: num of rec to move */
 | |
| 	ulint*		num_moved,	/*!< out: num of rec to move */
 | |
| 	mtr_t*		mtr);		/*!< in: mtr */
 | |
| 
 | |
| /****************************************************************//**
 | |
| Merge 2 mbrs and update the the mbr that cursor is on. */
 | |
| void
 | |
| rtr_merge_and_update_mbr(
 | |
| /*=====================*/
 | |
| 	btr_cur_t*		cursor,		/*!< in/out: cursor */
 | |
| 	btr_cur_t*		cursor2,	/*!< in: the other cursor */
 | |
| 	rec_offs*		offsets,	/*!< in: rec offsets */
 | |
| 	rec_offs*		offsets2,	/*!< in: rec offsets */
 | |
| 	page_t*			child_page,	/*!< in: the child page. */
 | |
| 	mtr_t*			mtr);		/*!< in: mtr */
 | |
| 
 | |
| /*************************************************************//**
 | |
| Deletes on the upper level the node pointer to a page. */
 | |
| void
 | |
| rtr_node_ptr_delete(
 | |
| /*================*/
 | |
| 	btr_cur_t*	cursor,	/*!< in: search cursor, contains information
 | |
| 				about parent nodes in search */
 | |
| 	mtr_t*		mtr);	/*!< in: mtr */
 | |
| 
 | |
| /****************************************************************//**
 | |
| Check two MBRs are identical or need to be merged */
 | |
| bool
 | |
| rtr_merge_mbr_changed(
 | |
| /*==================*/
 | |
| 	btr_cur_t*	cursor,		/*!< in: cursor */
 | |
| 	btr_cur_t*	cursor2,	/*!< in: the other cursor */
 | |
| 	rec_offs*	offsets,	/*!< in: rec offsets */
 | |
| 	rec_offs*	offsets2,	/*!< in: rec offsets */
 | |
| 	rtr_mbr_t*	new_mbr);	/*!< out: MBR to update */
 | |
| 
 | |
| 
 | |
| /**************************************************************//**
 | |
| Update the mbr field of a spatial index row. */
 | |
| void
 | |
| rtr_update_mbr_field(
 | |
| /*=================*/
 | |
| 	btr_cur_t*	cursor,		/*!< in: cursor pointed to rec.*/
 | |
| 	rec_offs*	offsets,	/*!< in: offsets on rec. */
 | |
| 	btr_cur_t*	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.*/
 | |
| 	page_t*		child_page,	/*!< in: child page. */
 | |
| 	rtr_mbr_t*	new_mbr,	/*!< in: the new mbr. */
 | |
| 	rec_t*		new_rec,	/*!< in: rec to use */
 | |
| 	mtr_t*		mtr);		/*!< in: mtr */
 | |
| 
 | |
| /**************************************************************//**
 | |
| Check whether a Rtree page is child of a parent page
 | |
| @return true if there is child/parent relationship */
 | |
| bool
 | |
| rtr_check_same_block(
 | |
| /*=================*/
 | |
| 	dict_index_t*	index,	/*!< in: index tree */
 | |
| 	btr_cur_t*	cur,	/*!< in/out: position at the parent entry
 | |
| 				pointing to the child if successful */
 | |
| 	buf_block_t*	parentb,/*!< in: parent page to check */
 | |
| 	mem_heap_t*	heap);	/*!< in: memory heap */
 | |
| 
 | |
| /*********************************************************************//**
 | |
| Sets pointer to the data and length in a field. */
 | |
| UNIV_INLINE
 | |
| void
 | |
| rtr_write_mbr(
 | |
| /*==========*/
 | |
| 	byte*			data,	/*!< out: data */
 | |
| 	const rtr_mbr_t*	mbr);	/*!< in: data */
 | |
| 
 | |
| /*********************************************************************//**
 | |
| Sets pointer to the data and length in a field. */
 | |
| UNIV_INLINE
 | |
| void
 | |
| rtr_read_mbr(
 | |
| /*==========*/
 | |
| 	const byte*		data,	/*!< in: data */
 | |
| 	rtr_mbr_t*		mbr);	/*!< out: data */
 | |
| 
 | |
| /**************************************************************//**
 | |
| Check whether a discarding page is in anyone's search path */
 | |
| void
 | |
| rtr_check_discard_page(
 | |
| /*===================*/
 | |
| 	dict_index_t*	index,	/*!< in: index */
 | |
| 	btr_cur_t*	cursor,	/*!< in: cursor on the page to discard: not on
 | |
| 				the root page */
 | |
| 	buf_block_t*	block);	/*!< in: block of page to be discarded */
 | |
| 
 | |
| /********************************************************************//**
 | |
| Reinitialize a RTree search info */
 | |
| UNIV_INLINE
 | |
| void
 | |
| rtr_info_reinit_in_cursor(
 | |
| /************************/
 | |
| 	btr_cur_t*	cursor,		/*!< in/out: tree cursor */
 | |
| 	dict_index_t*	index,		/*!< in: index struct */
 | |
| 	bool		need_prdt);	/*!< in: Whether predicate lock is
 | |
| 					needed */
 | |
| 
 | |
| /** Estimates the number of rows in a given area.
 | |
| @param[in]	index	index
 | |
| @param[in]	tuple	range tuple containing mbr, may also be empty tuple
 | |
| @param[in]	mode	search mode
 | |
| @return estimated number of rows */
 | |
| ha_rows
 | |
| rtr_estimate_n_rows_in_range(
 | |
| 	dict_index_t*	index,
 | |
| 	const dtuple_t*	tuple,
 | |
| 	page_cur_mode_t	mode);
 | |
| 
 | |
| #include "gis0rtree.inl"
 | |
| #endif /*!< gis0rtree.h */
 | 
