InnoDB Plugin  1.0
Data Structures | Macros | Enumerations | Functions | Variables
btr0cur.h File Reference
#include "univ.i"
#include "dict0dict.h"
#include "page0cur.h"
#include "btr0types.h"
#include "que0types.h"
#include "row0types.h"
#include "ha0ha.h"
#include "btr0cur.ic"
Include dependency graph for btr0cur.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  btr_path_t
struct  btr_cur_t

Macros

#define BTR_CUR_ADAPT
#define BTR_CUR_HASH_ADAPT
#define btr_cur_get_index(cursor)   ((cursor)->index)
#define btr_cur_open_at_index_side(f, i, l, c, lv, m)   btr_cur_open_at_index_side_func(f,i,l,c,lv,__FILE__,__LINE__,m)
#define btr_cur_open_at_rnd_pos(i, l, c, m)   btr_cur_open_at_rnd_pos_func(i,l,c,__FILE__,__LINE__,m)
#define btr_cur_update_alloc_zip(page_zip, cursor, index, offsets, len, cr, mtr)   btr_cur_update_alloc_zip_func(page_zip,cursor,index,offsets,len,cr,mtr)
#define btr_cur_optimistic_delete(cursor, flags, mtr)   btr_cur_optimistic_delete_func(cursor, flags, mtr)
#define BTR_CUR_PAGE_COMPRESS_LIMIT   (UNIV_PAGE_SIZE / 2)
#define BTR_PATH_ARRAY_N_SLOTS   250
#define BTR_CUR_RETRY_DELETE_N_TIMES   100
#define BTR_CUR_RETRY_SLEEP_TIME   50000
#define BTR_EXTERN_SPACE_ID   0
#define BTR_EXTERN_PAGE_NO   4
#define BTR_EXTERN_OFFSET   8
#define BTR_EXTERN_LEN   12
#define BTR_EXTERN_OWNER_FLAG   128
#define BTR_EXTERN_INHERITED_FLAG   64

Enumerations

enum  {
  BTR_NO_UNDO_LOG_FLAG = 1, BTR_NO_LOCKING_FLAG = 2, BTR_KEEP_SYS_FLAG = 4, BTR_KEEP_POS_FLAG = 8,
  BTR_CREATE_FLAG = 16, BTR_KEEP_IBUF_BITMAP = 32
}
enum  blob_op { BTR_STORE_INSERT = 0, BTR_STORE_INSERT_UPDATE, BTR_STORE_UPDATE }
enum  btr_cur_method {
  BTR_CUR_HASH = 1, BTR_CUR_HASH_FAIL, BTR_CUR_BINARY, BTR_CUR_INSERT_TO_IBUF,
  BTR_CUR_DEL_MARK_IBUF, BTR_CUR_DELETE_IBUF, BTR_CUR_DELETE_REF
}

Functions

UNIV_INLINE page_cur_tbtr_cur_get_page_cur (const btr_cur_t *cursor)
UNIV_INLINE buf_block_tbtr_cur_get_block (const btr_cur_t *cursor)
UNIV_INLINE rec_t * btr_cur_get_rec (const btr_cur_t *cursor)
UNIV_INLINE page_zip_des_tbtr_cur_get_page_zip (btr_cur_t *cursor)
UNIV_INLINE void btr_cur_invalidate (btr_cur_t *cursor)
UNIV_INLINE page_tbtr_cur_get_page (btr_cur_t *cursor)
UNIV_INLINE void btr_cur_position (dict_index_t *index, rec_t *rec, buf_block_t *block, btr_cur_t *cursor)
UNIV_INTERN void btr_cur_search_to_nth_level (dict_index_t *index, ulint level, const dtuple_t *tuple, ulint mode, ulint latch_mode, btr_cur_t *cursor, ulint has_search_latch, const char *file, ulint line, mtr_t *mtr)
UNIV_INTERN void btr_cur_open_at_index_side_func (bool from_left, dict_index_t *index, ulint latch_mode, btr_cur_t *cursor, ulint level, const char *file, ulint line, mtr_t *mtr))
UNIV_INTERN void btr_cur_open_at_rnd_pos_func (dict_index_t *index, ulint latch_mode, btr_cur_t *cursor, const char *file, ulint line, mtr_t *mtr)
UNIV_INTERN dberr_t btr_cur_optimistic_insert (ulint flags, btr_cur_t *cursor, ulint **offsets, mem_heap_t **heap, dtuple_t *entry, rec_t **rec, big_rec_t **big_rec, ulint n_ext, que_thr_t *thr, mtr_t *mtr)
UNIV_INTERN dberr_t btr_cur_pessimistic_insert (ulint flags, btr_cur_t *cursor, ulint **offsets, mem_heap_t **heap, dtuple_t *entry, rec_t **rec, big_rec_t **big_rec, ulint n_ext, que_thr_t *thr, mtr_t *mtr)
UNIV_INTERN bool btr_cur_update_alloc_zip_func (page_zip_des_t *page_zip, page_cur_t *cursor, dict_index_t *index, ulint *offsets, ulint length, bool create, mtr_t *mtr))
UNIV_INTERN dberr_t btr_cur_update_in_place (ulint flags, btr_cur_t *cursor, ulint *offsets, const upd_t *update, ulint cmpl_info, que_thr_t *thr, trx_id_t trx_id, mtr_t *mtr))
UNIV_INTERN void btr_cur_update_in_place_log (ulint flags, const rec_t *rec, dict_index_t *index, const upd_t *update, trx_id_t trx_id, roll_ptr_t roll_ptr, mtr_t *mtr))
UNIV_INTERN dberr_t btr_cur_optimistic_update (ulint flags, btr_cur_t *cursor, ulint **offsets, mem_heap_t **heap, const upd_t *update, ulint cmpl_info, que_thr_t *thr, trx_id_t trx_id, mtr_t *mtr))
UNIV_INTERN dberr_t btr_cur_pessimistic_update (ulint flags, btr_cur_t *cursor, ulint **offsets, mem_heap_t **offsets_heap, mem_heap_t *entry_heap, big_rec_t **big_rec, const upd_t *update, ulint cmpl_info, que_thr_t *thr, trx_id_t trx_id, mtr_t *mtr))
UNIV_INTERN dberr_t btr_cur_del_mark_set_clust_rec (buf_block_t *block, rec_t *rec, dict_index_t *index, const ulint *offsets, que_thr_t *thr, mtr_t *mtr))
UNIV_INTERN dberr_t btr_cur_del_mark_set_sec_rec (ulint flags, btr_cur_t *cursor, ibool val, que_thr_t *thr, mtr_t *mtr))
UNIV_INTERN ibool btr_cur_compress_if_useful (btr_cur_t *cursor, ibool adjust, mtr_t *mtr))
UNIV_INTERN ibool btr_cur_optimistic_delete_func (btr_cur_t *cursor, ulint flags, mtr_t *mtr))
UNIV_INTERN ibool btr_cur_pessimistic_delete (dberr_t *err, ibool has_reserved_extents, btr_cur_t *cursor, ulint flags, enum trx_rb_ctx rb_ctx, mtr_t *mtr))
UNIV_INTERN byte * btr_cur_parse_update_in_place (byte *ptr, byte *end_ptr, page_t *page, page_zip_des_t *page_zip, dict_index_t *index)
UNIV_INTERN byte * btr_cur_parse_del_mark_set_clust_rec (byte *ptr, byte *end_ptr, page_t *page, page_zip_des_t *page_zip, dict_index_t *index)
UNIV_INTERN byte * btr_cur_parse_del_mark_set_sec_rec (byte *ptr, byte *end_ptr, page_t *page, page_zip_des_t *page_zip)
UNIV_INTERN ib_int64_t btr_estimate_n_rows_in_range (dict_index_t *index, const dtuple_t *tuple1, ulint mode1, const dtuple_t *tuple2, ulint mode2)
UNIV_INTERN void btr_estimate_number_of_different_key_vals (dict_index_t *index)
ulint btr_rec_get_externally_stored_len (const rec_t *rec, const ulint *offsets)
UNIV_INTERN void btr_cur_disown_inherited_fields (page_zip_des_t *page_zip, rec_t *rec, dict_index_t *index, const ulint *offsets, const upd_t *update, mtr_t *mtr)))
UNIV_INLINE ibool btr_blob_op_is_update (enum blob_op op))
UNIV_INTERN dberr_t btr_store_big_rec_extern_fields (dict_index_t *index, buf_block_t *rec_block, rec_t *rec, const ulint *offsets, const big_rec_t *big_rec_vec, mtr_t *btr_mtr, enum blob_op op))
UNIV_INTERN void btr_free_externally_stored_field (dict_index_t *index, byte *field_ref, const rec_t *rec, const ulint *offsets, page_zip_des_t *page_zip, ulint i, enum trx_rb_ctx rb_ctx, mtr_t *local_mtr)
UNIV_INTERN ulint btr_copy_externally_stored_field_prefix (byte *buf, ulint len, ulint zip_size, const byte *data, ulint local_len)
UNIV_INTERN byte * btr_copy_externally_stored_field (ulint *len, const byte *data, ulint zip_size, ulint local_len, mem_heap_t *heap)
UNIV_INTERN byte * btr_rec_copy_externally_stored_field (const rec_t *rec, const ulint *offsets, ulint zip_size, ulint no, ulint *len, mem_heap_t *heap)
UNIV_INTERN ulint btr_push_update_extern_fields (dtuple_t *tuple, const upd_t *update, mem_heap_t *heap))
UNIV_INTERN void btr_cur_set_deleted_flag_for_ibuf (rec_t *rec, page_zip_des_t *page_zip, ibool val, mtr_t *mtr)

Variables

UNIV_INTERN dberr_t warn_unused_result
ulint btr_cur_n_non_sea
ulint btr_cur_n_sea
ulint btr_cur_n_non_sea_old
ulint btr_cur_n_sea_old
uint btr_cur_limit_optimistic_insert_debug

Detailed Description

The index tree cursor

Created 10/16/1994 Heikki Tuuri

Macro Definition Documentation

#define btr_cur_get_index (   cursor)    ((cursor)->index)

Returns the index of a cursor.

Parameters
cursorb-tree cursor
Returns
index
#define BTR_CUR_PAGE_COMPRESS_LIMIT   (UNIV_PAGE_SIZE / 2)
In the pessimistic delete, if the page data size drops below this

limit, merging it to a neighbor is tried

#define BTR_CUR_RETRY_DELETE_N_TIMES   100
If pessimistic delete fails because of lack of file space, there

is still a good change of success a little later. Try this many times.

#define BTR_CUR_RETRY_SLEEP_TIME   50000
If pessimistic delete fails because of lack of file space, there

is still a good change of success a little later. Sleep this many microseconds between retries.

#define BTR_EXTERN_INHERITED_FLAG   64
If the second most significant bit of BTR_EXTERN_LEN (i.e., the

second most significant bit of the byte at smallest address) is 1 then it means that the externally stored field was inherited from an earlier version of the row. In rollback we are not allowed to free an inherited external field.

#define BTR_EXTERN_LEN   12

8 bytes containing the length of the externally stored part of the BLOB. The 2 highest bits are reserved to the flags below.

#define BTR_EXTERN_OFFSET   8

offset of BLOB header on that page

#define BTR_EXTERN_OWNER_FLAG   128
The most significant bit of BTR_EXTERN_LEN (i.e., the most

significant bit of the byte at smallest address) is set to 1 if this field does not 'own' the externally stored field; only the owner field is allowed to free the field in purge!

#define BTR_EXTERN_PAGE_NO   4

page no where stored

#define BTR_EXTERN_SPACE_ID   0
The reference in a field for which data is stored on a different page.

The reference is at the end of the 'locally' stored part of the field. 'Locally' means storage in the index record. We store locally a long enough prefix of each column so that we can determine the ordering parts of each index record without looking into the externally stored part. space id where stored

#define BTR_PATH_ARRAY_N_SLOTS   250

size of path array (in slots)

Enumeration Type Documentation

anonymous enum

Mode flags for btr_cur operations; these can be ORed

Enumerator:
BTR_NO_UNDO_LOG_FLAG 

do no undo logging

BTR_NO_LOCKING_FLAG 

do no record lock checking

BTR_KEEP_SYS_FLAG 

sys fields will be found in the update vector or inserted entry

BTR_KEEP_POS_FLAG 

btr_cur_pessimistic_update() must keep cursor position when moving columns to big_rec

BTR_CREATE_FLAG 

the caller is creating the index or wants to bypass the index->info.online creation log

BTR_KEEP_IBUF_BITMAP 

the caller of btr_cur_optimistic_update() or btr_cur_update_in_place() will take care of updating IBUF_BITMAP_FREE

enum blob_op

Operation code for btr_store_big_rec_extern_fields().

Enumerator:
BTR_STORE_INSERT 

Store off-page columns for a freshly inserted record

BTR_STORE_INSERT_UPDATE 

Store off-page columns for an insert by update

BTR_STORE_UPDATE 

Store off-page columns for an update

Values for the flag documenting the used search method

Enumerator:
BTR_CUR_HASH 

successful shortcut using the hash index

BTR_CUR_HASH_FAIL 

failure using hash, success using binary search: the misleading hash reference is stored in the field hash_node, and might be necessary to update

BTR_CUR_BINARY 

success using the binary search

BTR_CUR_INSERT_TO_IBUF 

performed the intended insert to the insert buffer

BTR_CUR_DEL_MARK_IBUF 

performed the intended delete mark in the insert/delete buffer

BTR_CUR_DELETE_IBUF 

performed the intended delete in the insert/delete buffer

BTR_CUR_DELETE_REF 

row_purge_poss_sec() failed

Function Documentation

UNIV_INLINE ibool btr_blob_op_is_update ( enum blob_op  op)

Determine if an operation on off-page columns is an update.

Returns
TRUE if op != BTR_STORE_INSERT
Parameters
opin: operation
UNIV_INTERN byte* btr_copy_externally_stored_field ( ulint *  len,
const byte *  data,
ulint  zip_size,
ulint  local_len,
mem_heap_t heap 
)

Copies an externally stored field of a record to mem heap. The clustered index record must be protected by a lock or a page latch.

Returns
the whole field copied to heap in: mem heap
Parameters
lenout: length of the whole field
datain: 'internally' stored part of the field containing also the reference to the external part; must be protected by a lock or a page latch
zip_sizein: nonzero=compressed BLOB page size, zero for uncompressed BLOBs
local_lenin: length of data
UNIV_INTERN ulint btr_copy_externally_stored_field_prefix ( byte *  buf,
ulint  len,
ulint  zip_size,
const byte *  data,
ulint  local_len 
)

Copies the prefix of an externally stored field of a record. The clustered index record must be protected by a lock or a page latch.

Returns
the length of the copied field, or 0 if the column was being or has been deleted in: length of data, in bytes
Parameters
bufout: the field, or a prefix of it
lenin: length of buf, in bytes
zip_sizein: nonzero=compressed BLOB page size, zero for uncompressed BLOBs
datain: 'internally' stored part of the field containing also the reference to the external part; must be protected by a lock or a page latch
UNIV_INTERN ibool btr_cur_compress_if_useful ( btr_cur_t cursor,
ibool  adjust,
mtr_t mtr 
)

Tries to compress a page of the tree if it seems useful. It is assumed that mtr holds an x-latch on the tree and on the cursor page. To avoid deadlocks, mtr must also own x-latches to brothers of page, if those brothers exist. NOTE: it is assumed that the caller has reserved enough free extents so that the compression will always succeed if done!

Returns
TRUE if compression occurred
Parameters
cursorin/out: cursor on the page to compress; cursor does not stay valid if compression occurs
adjustin: TRUE if should adjust the cursor position even if compression occurs
mtrin/out: mini-transaction
UNIV_INTERN dberr_t btr_cur_del_mark_set_clust_rec ( buf_block_t block,
rec_t *  rec,
dict_index_t index,
const ulint *  offsets,
que_thr_t thr,
mtr_t mtr 
)

Marks a clustered index record deleted. Writes an undo log record to undo log on this delete marking. Writes in the trx id field the id of the deleting transaction, and in the roll ptr field pointer to the undo log record created.

Returns
DB_SUCCESS, DB_LOCK_WAIT, or error number
Parameters
blockin/out: buffer block of the record
recin/out: record
indexin: clustered index of the record
offsetsin: rec_get_offsets(rec)
thrin: query thread
mtrin/out: mini-transaction
UNIV_INTERN dberr_t btr_cur_del_mark_set_sec_rec ( ulint  flags,
btr_cur_t cursor,
ibool  val,
que_thr_t thr,
mtr_t mtr 
)

Sets a secondary index record delete mark to TRUE or FALSE.

Returns
DB_SUCCESS, DB_LOCK_WAIT, or error number
Parameters
flagsin: locking flag
cursorin: cursor
valin: value to set
thrin: query thread
mtrin/out: mini-transaction
UNIV_INTERN void btr_cur_disown_inherited_fields ( page_zip_des_t page_zip,
rec_t *  rec,
dict_index_t index,
const ulint *  offsets,
const upd_t update,
mtr_t mtr 
)

Marks non-updated off-page fields as disowned by this record. The ownership must be transferred to the updated record which is inserted elsewhere in the index tree. In purge only the owner of externally stored field is allowed to free the field.

Parameters
page_zipin/out: compressed page whose uncompressed part will be updated, or NULL
recin/out: record in a clustered index
indexin: index of the page
offsetsin: array returned by rec_get_offsets()
updatein: update vector
mtrin/out: mini-transaction
UNIV_INLINE buf_block_t* btr_cur_get_block ( const btr_cur_t cursor)

Returns the buffer block on which the tree cursor is positioned.

Returns
pointer to buffer block in: tree cursor

Returns the buffer block on which the tree cursor is positioned.

Returns
pointer to buffer block
Parameters
cursorin: tree cursor
UNIV_INLINE page_t* btr_cur_get_page ( btr_cur_t cursor)

Returns the page of a tree cursor.

Returns
pointer to page in: tree cursor

Returns the page of a tree cursor.

Returns
pointer to page
Parameters
cursorin: tree cursor
UNIV_INLINE page_cur_t* btr_cur_get_page_cur ( const btr_cur_t cursor)

Returns the page cursor component of a tree cursor.

Returns
pointer to page cursor component in: tree cursor

Returns the page cursor component of a tree cursor.

Returns
pointer to page cursor component
Parameters
cursorin: tree cursor
UNIV_INLINE page_zip_des_t* btr_cur_get_page_zip ( btr_cur_t cursor)

Returns the compressed page on which the tree cursor is positioned.

Returns
pointer to compressed page, or NULL if the page is not compressed in: tree cursor

Returns the compressed page on which the tree cursor is positioned.

Returns
pointer to compressed page, or NULL if the page is not compressed
Parameters
cursorin: tree cursor
UNIV_INLINE rec_t* btr_cur_get_rec ( const btr_cur_t cursor)

Returns the record pointer of a tree cursor.

Returns
pointer to record in: tree cursor

Returns the record pointer of a tree cursor.

Returns
pointer to record
Parameters
cursorin: tree cursor
UNIV_INLINE void btr_cur_invalidate ( btr_cur_t cursor)

Invalidates a tree cursor by setting record pointer to NULL. in: tree cursor

Invalidates a tree cursor by setting record pointer to NULL.

Parameters
cursorin: tree cursor
UNIV_INTERN void btr_cur_open_at_index_side_func ( bool  from_left,
dict_index_t index,
ulint  latch_mode,
btr_cur_t cursor,
ulint  level,
const char *  file,
ulint  line,
mtr_t mtr 
)

Opens a cursor at either end of an index.

Parameters
from_leftin: true if open to the low end, false if to the high end
indexin: index
latch_modein: latch mode
cursorin/out: cursor
levelin: level to search for (0=leaf)
filein: file name
linein: line where called
mtrin/out: mini-transaction
UNIV_INTERN void btr_cur_open_at_rnd_pos_func ( dict_index_t index,
ulint  latch_mode,
btr_cur_t cursor,
const char *  file,
ulint  line,
mtr_t mtr 
)

Positions a cursor at a randomly chosen position within a B-tree. in: mtr

Parameters
indexin: index
latch_modein: BTR_SEARCH_LEAF, ...
cursorin/out: B-tree cursor
filein: file name
linein: line where called
UNIV_INTERN ibool btr_cur_optimistic_delete_func ( btr_cur_t cursor,
ulint  flags,
mtr_t mtr 
)

Removes the record on which the tree cursor is positioned. It is assumed that the mtr has an x-latch on the page where the cursor is positioned, but no latch on the whole tree.

Returns
TRUE if success, i.e., the page did not become too empty
Parameters
cursorin: cursor on the record to delete; cursor stays valid: if deletion succeeds, on function exit it points to the successor of the deleted record
flagsin: BTR_CREATE_FLAG or 0
mtrin: mtr; if this function returns TRUE on a leaf page of a secondary index, the mtr must be committed before latching any further pages
UNIV_INTERN dberr_t btr_cur_optimistic_insert ( ulint  flags,
btr_cur_t cursor,
ulint **  offsets,
mem_heap_t **  heap,
dtuple_t entry,
rec_t **  rec,
big_rec_t **  big_rec,
ulint  n_ext,
que_thr_t thr,
mtr_t mtr 
)

Tries to perform an insert to a page in an index tree, next to cursor. It is assumed that mtr holds an x-latch on the page. The operation does not succeed if there is too little space on the page. If there is just one record on the page, the insert will always succeed; this is to prevent trying to split a page with just one record.

Returns
DB_SUCCESS, DB_WAIT_LOCK, DB_FAIL, or error number
Parameters
flagsin: undo logging and locking flags: if not zero, the parameters index and thr should be specified
cursorin: cursor on page after which to insert; cursor stays valid
offsetsout: offsets on *rec
heapin/out: pointer to memory heap, or NULL
entryin/out: entry to insert
recout: pointer to inserted record if succeed
big_recout: big rec vector whose fields have to be stored externally by the caller, or NULL
n_extin: number of externally stored columns
thrin: query thread or NULL
mtrin/out: mini-transaction; if this function returns DB_SUCCESS on a leaf page of a secondary index in a compressed tablespace, the caller must mtr_commit(mtr) before latching any further pages
UNIV_INTERN dberr_t btr_cur_optimistic_update ( ulint  flags,
btr_cur_t cursor,
ulint **  offsets,
mem_heap_t **  heap,
const upd_t update,
ulint  cmpl_info,
que_thr_t thr,
trx_id_t  trx_id,
mtr_t mtr 
)

Tries to update a record on a page in an index tree. It is assumed that mtr holds an x-latch on the page. The operation does not succeed if there is too little space on the page or if the update would result in too empty a page, so that tree compression is recommended.

Returns
error code, including
Return values
DB_SUCCESSon success
DB_OVERFLOWif the updated record does not fit
DB_UNDERFLOWif the page would become too empty
DB_ZIP_OVERFLOWif there is not enough space left on the compressed page
Parameters
flagsin: undo logging and locking flags
cursorin: cursor on the record to update; cursor stays valid and positioned on the same record
offsetsout: offsets on cursor->page_cur.rec
heapin/out: pointer to NULL or memory heap
updatein: update vector; this must also contain trx id and roll ptr fields
cmpl_infoin: compiler info on secondary index updates
thrin: query thread
trx_idin: transaction id
mtrin/out: mini-transaction; if this is a secondary index, the caller must mtr_commit(mtr) before latching any further pages
UNIV_INTERN byte* btr_cur_parse_del_mark_set_clust_rec ( byte *  ptr,
byte *  end_ptr,
page_t page,
page_zip_des_t page_zip,
dict_index_t index 
)

Parses the redo log record for delete marking or unmarking of a clustered index record.

Returns
end of log record or NULL in: index corresponding to page
Parameters
ptrin: buffer
end_ptrin: buffer end
pagein/out: page or NULL
page_zipin/out: compressed page, or NULL
UNIV_INTERN byte* btr_cur_parse_del_mark_set_sec_rec ( byte *  ptr,
byte *  end_ptr,
page_t page,
page_zip_des_t page_zip 
)

Parses the redo log record for delete marking or unmarking of a secondary index record.

Returns
end of log record or NULL in/out: compressed page, or NULL
Parameters
ptrin: buffer
end_ptrin: buffer end
pagein/out: page or NULL
UNIV_INTERN byte* btr_cur_parse_update_in_place ( byte *  ptr,
byte *  end_ptr,
page_t page,
page_zip_des_t page_zip,
dict_index_t index 
)

Parses a redo log record of updating a record in-place.

Returns
end of log record or NULL in: index corresponding to page
Parameters
ptrin: buffer
end_ptrin: buffer end
pagein/out: page or NULL
page_zipin/out: compressed page, or NULL
UNIV_INTERN ibool btr_cur_pessimistic_delete ( dberr_t err,
ibool  has_reserved_extents,
btr_cur_t cursor,
ulint  flags,
enum trx_rb_ctx  rb_ctx,
mtr_t mtr 
)

Removes the record on which the tree cursor is positioned. Tries to compress the page if its fillfactor drops below a threshold or if it is the only page on the level. It is assumed that mtr holds an x-latch on the tree and on the cursor page. To avoid deadlocks, mtr must also own x-latches to brothers of page, if those brothers exist.

Returns
TRUE if compression occurred
Parameters
errout: DB_SUCCESS or DB_OUT_OF_FILE_SPACE; the latter may occur because we may have to update node pointers on upper levels, and in the case of variable length keys these may actually grow in size
has_reserved_extentsin: TRUE if the caller has already reserved enough free extents so that he knows that the operation will succeed
cursorin: cursor on the record to delete; if compression does not occur, the cursor stays valid: it points to successor of deleted record on function exit
flagsin: BTR_CREATE_FLAG or 0
rb_ctxin: rollback context
mtrin: mtr
UNIV_INTERN dberr_t btr_cur_pessimistic_insert ( ulint  flags,
btr_cur_t cursor,
ulint **  offsets,
mem_heap_t **  heap,
dtuple_t entry,
rec_t **  rec,
big_rec_t **  big_rec,
ulint  n_ext,
que_thr_t thr,
mtr_t mtr 
)

Performs an insert on a page of an index tree. It is assumed that mtr holds an x-latch on the tree and on the cursor page. If the insert is made on the leaf level, to avoid deadlocks, mtr must also own x-latches to brothers of page, if those brothers exist.

Returns
DB_SUCCESS or error number
Parameters
flagsin: undo logging and locking flags: if not zero, the parameter thr should be specified; if no undo logging is specified, then the caller must have reserved enough free extents in the file space so that the insertion will certainly succeed
cursorin: cursor after which to insert; cursor stays valid
offsetsout: offsets on *rec
heapin/out: pointer to memory heap that can be emptied, or NULL
entryin/out: entry to insert
recout: pointer to inserted record if succeed
big_recout: big rec vector whose fields have to be stored externally by the caller, or NULL
n_extin: number of externally stored columns
thrin: query thread or NULL
mtrin/out: mini-transaction
UNIV_INTERN dberr_t btr_cur_pessimistic_update ( ulint  flags,
btr_cur_t cursor,
ulint **  offsets,
mem_heap_t **  offsets_heap,
mem_heap_t entry_heap,
big_rec_t **  big_rec,
const upd_t update,
ulint  cmpl_info,
que_thr_t thr,
trx_id_t  trx_id,
mtr_t mtr 
)

Performs an update of a record on a page of a tree. It is assumed that mtr holds an x-latch on the tree and on the cursor page. If the update is made on the leaf level, to avoid deadlocks, mtr must also own x-latches to brothers of page, if those brothers exist.

Returns
DB_SUCCESS or error code
Parameters
flagsin: undo logging, locking, and rollback flags
cursorin/out: cursor on the record to update; cursor may become invalid if *big_rec == NULL || !(flags & BTR_KEEP_POS_FLAG)
offsetsout: offsets on cursor->page_cur.rec
offsets_heapin/out: pointer to memory heap that can be emptied, or NULL
entry_heapin/out: memory heap for allocating big_rec and the index tuple
big_recout: big rec vector whose fields have to be stored externally by the caller, or NULL
updatein: update vector; this is allowed also contain trx id and roll ptr fields, but the values in update vector have no effect
cmpl_infoin: compiler info on secondary index updates
thrin: query thread
trx_idin: transaction id
mtrin/out: mini-transaction; must be committed before latching any further pages
UNIV_INLINE void btr_cur_position ( dict_index_t index,
rec_t *  rec,
buf_block_t block,
btr_cur_t cursor 
)

Positions a tree cursor at a given record. in: cursor

Positions a tree cursor at a given record.

Parameters
indexin: index
recin: record in tree
blockin: buffer block of rec
cursorout: cursor
UNIV_INTERN void btr_cur_search_to_nth_level ( dict_index_t index,
ulint  level,
const dtuple_t tuple,
ulint  mode,
ulint  latch_mode,
btr_cur_t cursor,
ulint  has_search_latch,
const char *  file,
ulint  line,
mtr_t mtr 
)

Searches an index tree and positions a tree cursor on a given level. NOTE: n_fields_cmp in tuple must be set so that it cannot be compared to node pointer page number fields on the upper levels of the tree! Note that if mode is PAGE_CUR_LE, which is used in inserts, then cursor->up_match and cursor->low_match both will have sensible values. If mode is PAGE_CUR_GE, then up_match will a have a sensible value. in: mtr

Parameters
indexin: index
levelin: the tree level of search
tuplein: data tuple; NOTE: n_fields_cmp in tuple must be set so that it cannot get compared to the node ptr page number field!
modein: 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 of the record! Inserts should always be made using PAGE_CUR_LE to search the position!
latch_modein: BTR_SEARCH_LEAF, ..., ORed with at most one of BTR_INSERT, BTR_DELETE_MARK, BTR_DELETE, or BTR_ESTIMATE; cursor->left_block is used to store a pointer to the left neighbor page, in the cases BTR_SEARCH_PREV and BTR_MODIFY_PREV; NOTE that if has_search_latch is != 0, we maybe do not have a latch set on the cursor page, we assume the caller uses his search latch to protect the record!
cursorin/out: tree cursor; the cursor page is s- or x-latched, but see also above!
has_search_latchin: latch mode the caller currently has on btr_search_latch: RW_S_LATCH, or 0
filein: file name
linein: line where called
UNIV_INTERN void btr_cur_set_deleted_flag_for_ibuf ( rec_t *  rec,
page_zip_des_t page_zip,
ibool  val,
mtr_t mtr 
)

Sets a secondary index record's delete mark to the given value. This function is only used by the insert buffer merge mechanism. in/out: mini-transaction

Parameters
recin/out: record
page_zipin/out: compressed page corresponding to rec, or NULL when the tablespace is uncompressed
valin: value to set
UNIV_INTERN bool btr_cur_update_alloc_zip_func ( page_zip_des_t page_zip,
page_cur_t cursor,
dict_index_t index,
ulint *  offsets,
ulint  length,
bool  create,
mtr_t mtr 
)

See if there is enough place in the page modification log to log an update-in-place.

Return values
falseif out of space; IBUF_BITMAP_FREE will be reset outside mtr if the page was recompressed
trueif enough place;

IMPORTANT: The caller will have to update IBUF_BITMAP_FREE if this is a secondary index leaf page. This has to be done either within the same mini-transaction, or by invoking ibuf_reset_free_bits() before mtr_commit(mtr).

Parameters
page_zipin/out: compressed page
cursorin/out: B-tree page cursor
indexin: the index corresponding to cursor
offsetsin/out: offsets of the cursor record
lengthin: size needed
createin: true=delete-and-insert, false=update-in-place
mtrin/out: mini-transaction
UNIV_INTERN dberr_t btr_cur_update_in_place ( ulint  flags,
btr_cur_t cursor,
ulint *  offsets,
const upd_t update,
ulint  cmpl_info,
que_thr_t thr,
trx_id_t  trx_id,
mtr_t mtr 
)

Updates a record when the update causes no size changes in its fields.

Returns
locking or undo log related error code, or
Return values
DB_SUCCESSon success
DB_ZIP_OVERFLOWif there is not enough space left on the compressed page (IBUF_BITMAP_FREE was reset outside mtr)
Parameters
flagsin: undo logging and locking flags
cursorin: cursor on the record to update; cursor stays valid and positioned on the same record
offsetsin/out: offsets on cursor->page_cur.rec
updatein: update vector
cmpl_infoin: compiler info on secondary index updates
thrin: query thread
trx_idin: transaction id
mtrin/out: mini-transaction; if this is a secondary index, the caller must mtr_commit(mtr) before latching any further pages
UNIV_INTERN void btr_cur_update_in_place_log ( ulint  flags,
const rec_t *  rec,
dict_index_t index,
const upd_t update,
trx_id_t  trx_id,
roll_ptr_t  roll_ptr,
mtr_t mtr 
)

Writes a redo log record of updating a record in-place.

Parameters
flagsin: flags
recin: record
indexin: index of the record
updatein: update vector
trx_idin: transaction id
roll_ptrin: roll ptr
mtrin: mtr
UNIV_INTERN ib_int64_t btr_estimate_n_rows_in_range ( dict_index_t index,
const dtuple_t tuple1,
ulint  mode1,
const dtuple_t tuple2,
ulint  mode2 
)

Estimates the number of rows in a given index range.

Returns
estimated number of rows in: search mode for range end
Parameters
indexin: index
tuple1in: range start, may also be empty tuple
mode1in: search mode for range start
tuple2in: range end, may also be empty tuple
UNIV_INTERN void btr_estimate_number_of_different_key_vals ( dict_index_t index)

Estimates the number of different key values in a given index, for each n-column prefix of the index where 1 <= n <= dict_index_get_n_unique(index). The estimates are stored in the array index->stat_n_diff_key_vals[] (indexed 0..n_uniq-1) and the number of pages that were sampled is saved in index->stat_n_sample_sizes[]. If innodb_stats_method is nulls_ignored, we also record the number of non-null values for each prefix and stored the estimates in array index->stat_n_non_null_key_vals. in: index

UNIV_INTERN void btr_free_externally_stored_field ( dict_index_t index,
byte *  field_ref,
const rec_t *  rec,
const ulint *  offsets,
page_zip_des_t page_zip,
ulint  i,
enum trx_rb_ctx  rb_ctx,
mtr_t local_mtr 
)

Frees the space in an externally stored field to the file space management if the field in data is owned the externally stored field, in a rollback we may have the additional condition that the field must not be inherited. in: mtr containing the latch to data an an X-latch to the index tree

Parameters
indexin: index of the data, the index tree MUST be X-latched; if the tree height is 1, then also the root page must be X-latched! (this is relevant in the case this function is called from purge where 'data' is located on an undo log page, not an index page)
field_refin/out: field reference
recin: record containing field_ref, for page_zip_write_blob_ptr(), or NULL
offsetsin: rec_get_offsets(rec, index), or NULL
page_zipin: compressed page corresponding to rec, or NULL if rec == NULL
iin: field number of field_ref; ignored if rec == NULL
rb_ctxin: rollback context
UNIV_INTERN ulint btr_push_update_extern_fields ( dtuple_t tuple,
const upd_t update,
mem_heap_t heap 
)

Flags the data tuple fields that are marked as extern storage in the update vector. We use this function to remember which fields we must mark as extern storage in a record inserted for an update.

Returns
number of flagged external columns
Parameters
tuplein/out: data tuple
updatein: update vector
heapin: memory heap
UNIV_INTERN byte* btr_rec_copy_externally_stored_field ( const rec_t *  rec,
const ulint *  offsets,
ulint  zip_size,
ulint  no,
ulint *  len,
mem_heap_t heap 
)

Copies an externally stored field of a record to mem heap.

Returns
the field copied to heap, or NULL if the field is incomplete in: mem heap
Parameters
recin: record in a clustered index; must be protected by a lock or a page latch
offsetsin: array returned by rec_get_offsets()
zip_sizein: nonzero=compressed BLOB page size, zero for uncompressed BLOBs
noin: field number
lenout: length of the field
ulint btr_rec_get_externally_stored_len ( const rec_t *  rec,
const ulint *  offsets 
)
Gets the externally stored size of a record, in units of a database page.
Parameters
[in]recrecord
[in]offsetsarray returned by rec_get_offsets()
Returns
externally stored part, in units of a database page
UNIV_INTERN dberr_t btr_store_big_rec_extern_fields ( dict_index_t index,
buf_block_t rec_block,
rec_t *  rec,
const ulint *  offsets,
const big_rec_t big_rec_vec,
mtr_t btr_mtr,
enum blob_op  op 
)

Stores the fields in big_rec_vec to the tablespace and puts pointers to them in rec. The extern flags in rec will have to be set beforehand. The fields are stored on pages allocated from leaf node file segment of the index tree.

Returns
DB_SUCCESS or DB_OUT_OF_FILE_SPACE

in: operation code

Parameters
indexin: index of rec; the index tree MUST be X-latched
rec_blockin/out: block containing rec
recin/out: record
offsetsin: rec_get_offsets(rec, index); the "external storage" flags in offsets will not correspond to rec when this function returns
big_rec_vecin: vector containing fields to be stored externally
btr_mtrin: mtr containing the latches to the clustered index

Variable Documentation

ulint btr_cur_n_non_sea

Number of searches down the B-tree in btr_cur_search_to_nth_level().

ulint btr_cur_n_non_sea_old
Old value of btr_cur_n_non_sea.  Copied by

srv_refresh_innodb_monitor_stats(). Referenced by srv_printf_innodb_monitor().

ulint btr_cur_n_sea
Number of successful adaptive hash index lookups in

btr_cur_search_to_nth_level().

ulint btr_cur_n_sea_old
Old value of btr_cur_n_sea.  Copied by

srv_refresh_innodb_monitor_stats(). Referenced by srv_printf_innodb_monitor().