MySQL 9.1.0
Source Code Documentation
|
The page cursor. More...
#include "univ.i"
#include "buf0types.h"
#include "data0data.h"
#include "gis0type.h"
#include "mtr0mtr.h"
#include "page0page.h"
#include "rem0rec.h"
#include "rem0wrec.h"
#include "page0cur.ic"
Go to the source code of this file.
Classes | |
struct | page_cur_t |
Index page cursor. More... | |
Macros | |
#define | PAGE_CUR_ADAPT |
Functions | |
static page_t * | page_cur_get_page (page_cur_t *cur) |
Gets pointer to the page frame where the cursor is positioned. More... | |
static buf_block_t * | page_cur_get_block (page_cur_t *cur) |
Gets pointer to the buffer block where the cursor is positioned. More... | |
static page_zip_des_t * | page_cur_get_page_zip (page_cur_t *cur) |
Gets pointer to the page frame where the cursor is positioned. More... | |
static rec_t * | page_cur_get_rec (page_cur_t *cur) |
Gets the record where the cursor is positioned. More... | |
static void | page_cur_set_before_first (const buf_block_t *block, page_cur_t *cur) |
Sets the cursor object to point before the first user record on the page. More... | |
static void | page_cur_set_after_last (const buf_block_t *block, page_cur_t *cur) |
Sets the cursor object to point after the last user record on the page. More... | |
static bool | page_cur_is_before_first (const page_cur_t *cur) |
Returns true if the cursor is before first user record on page. More... | |
static bool | page_cur_is_after_last (const page_cur_t *cur) |
Returns true if the cursor is after last user record. More... | |
static void | page_cur_position (const rec_t *rec, const buf_block_t *block, page_cur_t *cur) |
Positions the cursor on the given record. More... | |
static void | page_cur_move_to_next (page_cur_t *cur) |
Moves the cursor to the next record on page. More... | |
static void | page_cur_move_to_prev (page_cur_t *cur) |
Moves the cursor to the previous record on page. More... | |
static rec_t * | page_cur_tuple_insert (page_cur_t *cursor, const dtuple_t *tuple, dict_index_t *index, ulint **offsets, mem_heap_t **heap, mtr_t *mtr) |
Inserts a record next to page cursor. More... | |
static rec_t * | page_cur_rec_insert (page_cur_t *cursor, const rec_t *rec, dict_index_t *index, ulint *offsets, mtr_t *mtr) |
Inserts a record next to page cursor. More... | |
rec_t * | page_cur_insert_rec_low (rec_t *current_rec, dict_index_t *index, const rec_t *rec, ulint *offsets, mtr_t *mtr) |
Inserts a record next to page cursor on an uncompressed page. More... | |
rec_t * | page_cur_direct_insert_rec_low (rec_t *current_rec, dict_index_t *index, const dtuple_t *tuple, mtr_t *mtr, ulint rec_size) |
Inserts a record next to page cursor on an uncompressed page. More... | |
rec_t * | page_cur_insert_rec_zip (page_cur_t *cursor, dict_index_t *index, const rec_t *rec, ulint *offsets, mtr_t *mtr) |
Inserts a record next to page cursor on a compressed and uncompressed page. More... | |
void | page_copy_rec_list_end_to_created_page (page_t *new_page, rec_t *rec, dict_index_t *index, mtr_t *mtr) |
Copies records from page to a newly created page, from a given record onward, including that record. More... | |
void | page_cur_delete_rec (page_cur_t *cursor, const dict_index_t *index, const ulint *offsets, mtr_t *mtr) |
Deletes a record at the page cursor. More... | |
static ulint | page_cur_search (const buf_block_t *block, const dict_index_t *index, const dtuple_t *tuple, page_cur_mode_t mode, page_cur_t *cursor) |
Search the right position for a page cursor. More... | |
static ulint | page_cur_search (const buf_block_t *block, const dict_index_t *index, const dtuple_t *tuple, page_cur_t *cursor) |
Search the right position for a page cursor. More... | |
void | page_cur_search_with_match (const buf_block_t *block, const dict_index_t *index, const dtuple_t *tuple, page_cur_mode_t mode, ulint *iup_matched_fields, ulint *ilow_matched_fields, page_cur_t *cursor, rtr_info_t *rtr_info) |
Searches the right position for a page cursor. More... | |
void | page_cur_search_with_match_bytes (const buf_block_t *block, const dict_index_t *index, const dtuple_t *tuple, page_cur_mode_t mode, ulint *iup_matched_fields, ulint *iup_matched_bytes, ulint *ilow_matched_fields, ulint *ilow_matched_bytes, page_cur_t *cursor) |
Search the right position for a page cursor. More... | |
void | page_cur_open_on_rnd_user_rec (buf_block_t *block, page_cur_t *cursor) |
Positions a page cursor on a randomly chosen user record on a page. More... | |
const byte * | page_cur_parse_insert_rec (bool is_short, const byte *ptr, const byte *end_ptr, buf_block_t *block, dict_index_t *index, mtr_t *mtr) |
Parses a log record of a record insert on a page. More... | |
const byte * | page_parse_copy_rec_list_to_created_page (const byte *ptr, const byte *end_ptr, buf_block_t *block, dict_index_t *index, mtr_t *mtr) |
Parses a log record of copying a record list end to a new created page. More... | |
const byte * | page_cur_parse_delete_rec (const byte *ptr, const byte *end_ptr, buf_block_t *block, dict_index_t *index, mtr_t *mtr) |
Parses log record of a record delete on a page. More... | |
bool | page_delete_rec (const dict_index_t *index, page_cur_t *pcur, const ulint *offsets) |
Removes the record from a leaf page. More... | |
The page cursor.
Created 10/4/1994 Heikki Tuuri
#define PAGE_CUR_ADAPT |
void page_copy_rec_list_end_to_created_page | ( | page_t * | new_page, |
rec_t * | rec, | ||
dict_index_t * | index, | ||
mtr_t * | mtr | ||
) |
Copies records from page to a newly created page, from a given record onward, including that record.
Infimum and supremum records are not copied.
IMPORTANT: The caller will have to update IBUF_BITMAP_FREE if this 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: mtr
Infimum and supremum records are not copied.
IMPORTANT: The caller will have to update IBUF_BITMAP_FREE if this 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().
new_page | in/out: index page to copy to |
rec | in: first record to copy |
index | in: record descriptor |
mtr | in: mtr |
void page_cur_delete_rec | ( | page_cur_t * | cursor, |
const dict_index_t * | index, | ||
const ulint * | offsets, | ||
mtr_t * | mtr | ||
) |
Deletes a record at the page cursor.
The cursor is moved to the next record after the deleted one. in: mini-transaction handle
The cursor is moved to the next record after the deleted one.
cursor | in/out: a page cursor |
index | in: record descriptor |
offsets | in: rec_get_offsets( cursor->rec, index) |
mtr | in: mini-transaction handle or NULL |
rec_t * page_cur_direct_insert_rec_low | ( | rec_t * | current_rec, |
dict_index_t * | index, | ||
const dtuple_t * | tuple, | ||
mtr_t * | mtr, | ||
ulint | rec_size | ||
) |
Inserts a record next to page cursor on an uncompressed page.
[in] | current_rec | Pointer to current record after which the new record is inserted. |
[in] | index | Record descriptor |
[in] | tuple | Pointer to a data tuple |
[in] | mtr | Mini-transaction handle, or NULL |
[in] | rec_size | The size of new record |
< the relevant page
< cursor position at previous insert
< a free record that was reused, or NULL
< inserted record
< heap number of the inserted record
|
inlinestatic |
Gets pointer to the buffer block where the cursor is positioned.
|
inlinestatic |
Gets pointer to the page frame where the cursor is positioned.
|
inlinestatic |
Gets pointer to the page frame where the cursor is positioned.
|
inlinestatic |
Gets the record where the cursor is positioned.
rec_t * page_cur_insert_rec_low | ( | rec_t * | current_rec, |
dict_index_t * | index, | ||
const rec_t * | rec, | ||
ulint * | offsets, | ||
mtr_t * | mtr | ||
) |
Inserts a record next to page cursor on an uncompressed page.
Returns pointer to inserted record if succeed, i.e., enough space available, NULL otherwise. The cursor stays at the same position.
Returns pointer to inserted record if succeed, i.e., enough space available, NULL otherwise. The cursor stays at the same position.
< the relevant page
< cursor position at previous insert
< a free record that was reused, or NULL
< inserted record
< heap number of the inserted record
current_rec | in: pointer to current record after which the new record is inserted |
index | in: record descriptor |
rec | in: pointer to a physical record |
offsets | in/out: rec_get_offsets(rec, index) |
mtr | in: mini-transaction handle, or NULL |
rec_t * page_cur_insert_rec_zip | ( | page_cur_t * | cursor, |
dict_index_t * | index, | ||
const rec_t * | rec, | ||
ulint * | offsets, | ||
mtr_t * | mtr | ||
) |
Inserts a record next to page cursor on a compressed and uncompressed page.
Returns pointer to inserted record if succeed, i.e., enough space available, NULL otherwise. The cursor stays at the same position.
IMPORTANT: The caller will have to update IBUF_BITMAP_FREE if this 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().
Returns pointer to inserted record if succeed, i.e., enough space available, NULL otherwise. The cursor stays at the same position.
IMPORTANT: The caller will have to update IBUF_BITMAP_FREE if this 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().
< the relevant page
< cursor position at previous insert
< a free record that was reused, or NULL
< inserted record
< heap number of the inserted record
cursor | in/out: page cursor |
index | in: record descriptor |
rec | in: pointer to a physical record |
offsets | in/out: rec_get_offsets(rec, index) |
mtr | in: mini-transaction handle, or NULL |
|
inlinestatic |
Returns true if the cursor is after last user record.
|
inlinestatic |
Returns true if the cursor is before first user record on page.
|
inlinestatic |
Moves the cursor to the next record on page.
in/out: cursor; must not be after last
|
inlinestatic |
Moves the cursor to the previous record on page.
in/out: cursor; not before first
void page_cur_open_on_rnd_user_rec | ( | buf_block_t * | block, |
page_cur_t * | cursor | ||
) |
Positions a page cursor on a randomly chosen user record on a page.
If there are no user records, sets the cursor on the infimum record. out: page cursor
If there are no user records, sets the cursor on the infimum record.
block | in: page |
cursor | out: page cursor |
const byte * page_cur_parse_delete_rec | ( | const byte * | ptr, |
const byte * | end_ptr, | ||
buf_block_t * | block, | ||
dict_index_t * | index, | ||
mtr_t * | mtr | ||
) |
Parses log record of a record delete on a page.
ptr | in: buffer |
end_ptr | in: buffer end |
block | in: page or NULL |
index | in: record descriptor |
mtr | in: mtr or NULL |
const byte * page_cur_parse_insert_rec | ( | bool | is_short, |
const byte * | ptr, | ||
const byte * | end_ptr, | ||
buf_block_t * | block, | ||
dict_index_t * | index, | ||
mtr_t * | mtr | ||
) |
Parses a log record of a record insert on a page.
is_short | in: true if short inserts |
ptr | in: buffer |
end_ptr | in: buffer end |
block | in: page or NULL |
index | in: record descriptor |
mtr | in: mtr or NULL |
|
inlinestatic |
Positions the cursor on the given record.
[in] | rec | record on a page |
[in] | block | buffer block containing the record |
[out] | cur | page cursor |
|
inlinestatic |
Inserts a record next to page cursor.
Returns pointer to inserted record if succeed, i.e., enough space available, NULL otherwise. The cursor stays at the same logical position, but the physical position may change if it is pointing to a compressed page that was reorganized.
IMPORTANT: The caller will have to update IBUF_BITMAP_FREE if this 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,out] | cursor | A page cursor |
[in] | rec | record To insert |
[in] | index | Record descriptor |
[in,out] | offsets | rec_get_offsets(rec, index) |
[in] | mtr | Mini-transaction handle, or NULL |
|
inlinestatic |
Search the right position for a page cursor.
[in] | block | buffer block |
[in] | index | index tree |
[in] | tuple | data tuple |
[in] | mode | PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G, or PAGE_CUR_GE |
[out] | cursor | page cursor |
|
inlinestatic |
Search the right position for a page cursor.
[in] | block | buffer block |
[in] | index | index tree |
[in] | tuple | data tuple |
[out] | cursor | page cursor |
void page_cur_search_with_match | ( | const buf_block_t * | block, |
const dict_index_t * | index, | ||
const dtuple_t * | tuple, | ||
page_cur_mode_t | mode, | ||
ulint * | iup_matched_fields, | ||
ulint * | ilow_matched_fields, | ||
page_cur_t * | cursor, | ||
rtr_info_t * | rtr_info | ||
) |
Searches the right position for a page cursor.
[in] | block | Buffer block |
[in] | index | Record descriptor |
[in] | tuple | Data tuple |
[in] | mode | PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G, or PAGE_CUR_GE |
[in,out] | iup_matched_fields | Already matched fields in upper limit record |
[in,out] | ilow_matched_fields | Already matched fields in lower limit record |
[out] | cursor | Page cursor |
[in,out] | rtr_info | Rtree search stack |
void page_cur_search_with_match_bytes | ( | const buf_block_t * | block, |
const dict_index_t * | index, | ||
const dtuple_t * | tuple, | ||
page_cur_mode_t | mode, | ||
ulint * | iup_matched_fields, | ||
ulint * | iup_matched_bytes, | ||
ulint * | ilow_matched_fields, | ||
ulint * | ilow_matched_bytes, | ||
page_cur_t * | cursor | ||
) |
Search the right position for a page cursor.
[in] | block | buffer block |
[in] | index | index tree |
[in] | tuple | key to be searched for |
[in] | mode | search mode |
[in,out] | iup_matched_fields | already matched fields in the upper limit record |
[in,out] | iup_matched_bytes | already matched bytes in the first partially matched field in the upper limit record |
[in,out] | ilow_matched_fields | already matched fields in the lower limit record |
[in,out] | ilow_matched_bytes | already matched bytes in the first partially matched field in the lower limit record |
[out] | cursor | page cursor |
|
inlinestatic |
Sets the cursor object to point after the last user record on the page.
[in] | block | index page |
[in] | cur | cursor |
|
inlinestatic |
Sets the cursor object to point before the first user record on the page.
[in] | block | index page |
[in] | cur | cursor |
|
inlinestatic |
Inserts a record next to page cursor.
Returns pointer to inserted record if succeed, i.e., enough space available, NULL otherwise. The cursor stays at the same logical position, but the physical position may change if it is pointing to a compressed page that was reorganized.
IMPORTANT: The caller will have to update IBUF_BITMAP_FREE if this 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,out] | cursor | Page cursor. |
[in] | tuple | Pointer to a data tuple |
[in] | index | Index descriptor. |
[in] | offsets | Offsets on *rec. |
[in,out] | heap | Pointer to memory heap, or to nullptr. |
[in] | mtr | Mini-transaction handle, or nullptr. |
bool page_delete_rec | ( | const dict_index_t * | index, |
page_cur_t * | pcur, | ||
const ulint * | offsets | ||
) |
Removes the record from a leaf page.
This function does not log any changes. It is used by the IMPORT tablespace functions.
[in] | index | The index that the record belongs to. |
[in,out] | pcur | Page cursor on record to delete. |
[in] | offsets | Offsets for record. |
const byte * page_parse_copy_rec_list_to_created_page | ( | const byte * | ptr, |
const byte * | end_ptr, | ||
buf_block_t * | block, | ||
dict_index_t * | index, | ||
mtr_t * | mtr | ||
) |
Parses a log record of copying a record list end to a new created page.
ptr | in: buffer |
end_ptr | in: buffer end |
block | in: page or NULL |
index | in: record descriptor |
mtr | in: mtr or NULL |