mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
e8435b3e45
and lexer files). From now on, the following Emacs cc-mode settings apply when indenting C function bodies in InnoDB: (setq c-basic-offset 8) (setq c-label-minimum-indentation 0) (add-to-list 'c-offsets-alist '(c . 0)) (add-to-list 'c-offsets-alist '(label . [0])) The indentation rules for function declarations still have not been formalized, and they must be formatted manually. Try to limit all lines to at most 79 characters (assuming TAB stops every 8 characters) by splitting lines before opening parenthesis, or at string constants. Fix some grammar mistakes in diagnostic output: match to, match with -> match found from -> found in trying rename -> trying to rename Fix an error in page_check_dir(): it said "supremum not pointed to" when the infimum was not pointed to. Enclose commented-out code snippets in #if 0 ... #endif instead of /* ... */. Add (void*) casts to some %p parameters in fprintf() calls. Try to split lines before a binary operator, not after one. (These three fixes were not made everywhere.)
234 lines
5.7 KiB
Text
234 lines
5.7 KiB
Text
/******************************************************
|
|
The B-tree
|
|
|
|
(c) 1994-1996 Innobase Oy
|
|
|
|
Created 6/2/1994 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#include "mach0data.h"
|
|
#include "mtr0mtr.h"
|
|
#include "mtr0log.h"
|
|
|
|
#define BTR_MAX_NODE_LEVEL 50 /* used in debug checking */
|
|
|
|
/******************************************************************
|
|
Gets a buffer page and declares its latching order level. */
|
|
UNIV_INLINE
|
|
page_t*
|
|
btr_page_get(
|
|
/*=========*/
|
|
ulint space, /* in: space id */
|
|
ulint page_no, /* in: page number */
|
|
ulint mode, /* in: latch mode */
|
|
mtr_t* mtr) /* in: mtr */
|
|
{
|
|
page_t* page;
|
|
|
|
page = buf_page_get(space, page_no, mode, mtr);
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
if (mode != RW_NO_LATCH) {
|
|
|
|
buf_page_dbg_add_level(page, SYNC_TREE_NODE);
|
|
}
|
|
#endif
|
|
return(page);
|
|
}
|
|
|
|
/******************************************************************
|
|
Sets the index id field of a page. */
|
|
UNIV_INLINE
|
|
void
|
|
btr_page_set_index_id(
|
|
/*==================*/
|
|
page_t* page, /* in: page to be created */
|
|
dulint id, /* in: index id */
|
|
mtr_t* mtr) /* in: mtr */
|
|
{
|
|
mlog_write_dulint(page + PAGE_HEADER + PAGE_INDEX_ID, id, mtr);
|
|
}
|
|
|
|
/******************************************************************
|
|
Gets the index id field of a page. */
|
|
UNIV_INLINE
|
|
dulint
|
|
btr_page_get_index_id(
|
|
/*==================*/
|
|
/* out: index id */
|
|
page_t* page) /* in: index page */
|
|
{
|
|
return(mach_read_from_8(page + PAGE_HEADER + PAGE_INDEX_ID));
|
|
}
|
|
|
|
/************************************************************
|
|
Gets the node level field in an index page. */
|
|
UNIV_INLINE
|
|
ulint
|
|
btr_page_get_level_low(
|
|
/*===================*/
|
|
/* out: level, leaf level == 0 */
|
|
page_t* page) /* in: index page */
|
|
{
|
|
ulint level;
|
|
|
|
ut_ad(page);
|
|
|
|
level = mach_read_from_2(page + PAGE_HEADER + PAGE_LEVEL);
|
|
|
|
ut_ad(level <= BTR_MAX_NODE_LEVEL);
|
|
|
|
return(level);
|
|
}
|
|
|
|
/************************************************************
|
|
Gets the node level field in an index page. */
|
|
UNIV_INLINE
|
|
ulint
|
|
btr_page_get_level(
|
|
/*===============*/
|
|
/* out: level, leaf level == 0 */
|
|
page_t* page, /* in: index page */
|
|
mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */
|
|
{
|
|
ut_ad(page && mtr);
|
|
|
|
return(btr_page_get_level_low(page));
|
|
}
|
|
|
|
/************************************************************
|
|
Sets the node level field in an index page. */
|
|
UNIV_INLINE
|
|
void
|
|
btr_page_set_level(
|
|
/*===============*/
|
|
page_t* page, /* in: index page */
|
|
ulint level, /* in: level, leaf level == 0 */
|
|
mtr_t* mtr) /* in: mini-transaction handle */
|
|
{
|
|
ut_ad(page && mtr);
|
|
ut_ad(level <= BTR_MAX_NODE_LEVEL);
|
|
|
|
mlog_write_ulint(page + PAGE_HEADER + PAGE_LEVEL, level,
|
|
MLOG_2BYTES, mtr);
|
|
}
|
|
|
|
/************************************************************
|
|
Gets the next index page number. */
|
|
UNIV_INLINE
|
|
ulint
|
|
btr_page_get_next(
|
|
/*==============*/
|
|
/* out: next page number */
|
|
page_t* page, /* in: index page */
|
|
mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */
|
|
{
|
|
ut_ad(page && mtr);
|
|
ut_ad(mtr_memo_contains(mtr, buf_block_align(page),
|
|
MTR_MEMO_PAGE_X_FIX)
|
|
|| mtr_memo_contains(mtr, buf_block_align(page),
|
|
MTR_MEMO_PAGE_S_FIX));
|
|
|
|
return(mach_read_from_4(page + FIL_PAGE_NEXT));
|
|
}
|
|
|
|
/************************************************************
|
|
Sets the next index page field. */
|
|
UNIV_INLINE
|
|
void
|
|
btr_page_set_next(
|
|
/*==============*/
|
|
page_t* page, /* in: index page */
|
|
ulint next, /* in: next page number */
|
|
mtr_t* mtr) /* in: mini-transaction handle */
|
|
{
|
|
ut_ad(page && mtr);
|
|
|
|
mlog_write_ulint(page + FIL_PAGE_NEXT, next, MLOG_4BYTES, mtr);
|
|
}
|
|
|
|
/************************************************************
|
|
Gets the previous index page number. */
|
|
UNIV_INLINE
|
|
ulint
|
|
btr_page_get_prev(
|
|
/*==============*/
|
|
/* out: prev page number */
|
|
page_t* page, /* in: index page */
|
|
mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */
|
|
{
|
|
ut_ad(page && mtr);
|
|
|
|
return(mach_read_from_4(page + FIL_PAGE_PREV));
|
|
}
|
|
|
|
/************************************************************
|
|
Sets the previous index page field. */
|
|
UNIV_INLINE
|
|
void
|
|
btr_page_set_prev(
|
|
/*==============*/
|
|
page_t* page, /* in: index page */
|
|
ulint prev, /* in: previous page number */
|
|
mtr_t* mtr) /* in: mini-transaction handle */
|
|
{
|
|
ut_ad(page && mtr);
|
|
|
|
mlog_write_ulint(page + FIL_PAGE_PREV, prev, MLOG_4BYTES, mtr);
|
|
}
|
|
|
|
/******************************************************************
|
|
Gets the child node file address in a node pointer. */
|
|
UNIV_INLINE
|
|
ulint
|
|
btr_node_ptr_get_child_page_no(
|
|
/*===========================*/
|
|
/* out: child node address */
|
|
rec_t* rec, /* in: node pointer record */
|
|
const ulint* offsets)/* in: array returned by rec_get_offsets() */
|
|
{
|
|
byte* field;
|
|
ulint len;
|
|
ulint page_no;
|
|
|
|
ut_ad(!rec_offs_comp(offsets) || rec_get_node_ptr_flag(rec));
|
|
|
|
/* The child address is in the last field */
|
|
field = rec_get_nth_field(rec, offsets,
|
|
rec_offs_n_fields(offsets) - 1, &len);
|
|
|
|
ut_ad(len == 4);
|
|
|
|
page_no = mach_read_from_4(field);
|
|
|
|
if (UNIV_UNLIKELY(page_no == 0)) {
|
|
fprintf(stderr,
|
|
"InnoDB: a nonsensical page number 0"
|
|
" in a node ptr record at offset %lu\n",
|
|
(ulong) ut_align_offset(rec, UNIV_PAGE_SIZE));
|
|
buf_page_print(buf_frame_align(rec));
|
|
}
|
|
|
|
return(page_no);
|
|
}
|
|
|
|
/******************************************************************
|
|
Releases the latches on a leaf page and bufferunfixes it. */
|
|
UNIV_INLINE
|
|
void
|
|
btr_leaf_page_release(
|
|
/*==================*/
|
|
page_t* page, /* in: page */
|
|
ulint latch_mode, /* in: BTR_SEARCH_LEAF or BTR_MODIFY_LEAF */
|
|
mtr_t* mtr) /* in: mtr */
|
|
{
|
|
ut_ad(!mtr_memo_contains(mtr, buf_block_align(page),
|
|
MTR_MEMO_MODIFY));
|
|
if (latch_mode == BTR_SEARCH_LEAF) {
|
|
mtr_memo_release(mtr, buf_block_align(page),
|
|
MTR_MEMO_PAGE_S_FIX);
|
|
} else {
|
|
ut_ad(latch_mode == BTR_MODIFY_LEAF);
|
|
mtr_memo_release(mtr, buf_block_align(page),
|
|
MTR_MEMO_PAGE_X_FIX);
|
|
}
|
|
}
|