~gaul/percona-data-recovery-tool-for-innodb/prerequisites

« back to all changes in this revision

Viewing changes to mysql-source/innobase/include/btr0btr.h

  • Committer: Aleksandr Kuzminsky
  • Date: 2010-01-14 13:05:06 UTC
  • mfrom: (1.1.1 page-signature-check)
  • Revision ID: aleksandr.kuzminsky@percona.com-20100114130506-72t6jxtll15gk3pp
Added InnoDB page signature check.
At the beginning of InnoDB page (type FIL_PAGE_INODE) there are infimum and supremum records.
They are located in fixed position depending on InnoDB page format(REDUNDANT (4.x and 5.x versions) or COMPACT(5.x only)).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************
 
2
The B-tree
 
3
 
 
4
(c) 1994-1996 Innobase Oy
 
5
 
 
6
Created 6/2/1994 Heikki Tuuri
 
7
*******************************************************/
 
8
 
 
9
#ifndef btr0btr_h
 
10
#define btr0btr_h
 
11
 
 
12
#include "univ.i"
 
13
 
 
14
#include "dict0dict.h"
 
15
#include "data0data.h"
 
16
#include "page0cur.h"
 
17
#include "rem0rec.h"
 
18
#include "mtr0mtr.h"
 
19
#include "btr0types.h"
 
20
 
 
21
/* Maximum record size which can be stored on a page, without using the
 
22
special big record storage structure */
 
23
 
 
24
#define BTR_PAGE_MAX_REC_SIZE   (UNIV_PAGE_SIZE / 2 - 200)
 
25
 
 
26
/* Latching modes for the search function (in btr0cur.*) */
 
27
#define BTR_SEARCH_LEAF         RW_S_LATCH
 
28
#define BTR_MODIFY_LEAF         RW_X_LATCH
 
29
#define BTR_NO_LATCHES          RW_NO_LATCH
 
30
#define BTR_MODIFY_TREE         33
 
31
#define BTR_CONT_MODIFY_TREE    34
 
32
#define BTR_SEARCH_PREV         35
 
33
#define BTR_MODIFY_PREV         36
 
34
 
 
35
/* If this is ORed to the latch mode, it means that the search tuple will be
 
36
inserted to the index, at the searched position */
 
37
#define BTR_INSERT              512
 
38
 
 
39
/* This flag ORed to latch mode says that we do the search in query
 
40
optimization */
 
41
#define BTR_ESTIMATE            1024
 
42
 
 
43
/* This flag ORed to latch mode says that we can ignore possible
 
44
UNIQUE definition on secondary indexes when we decide if we can use the
 
45
insert buffer to speed up inserts */
 
46
#define BTR_IGNORE_SEC_UNIQUE   2048    
 
47
 
 
48
/******************************************************************
 
49
Gets the root node of a tree and x-latches it. */
 
50
 
 
51
page_t*
 
52
btr_root_get(
 
53
/*=========*/
 
54
                                /* out: root page, x-latched */
 
55
        dict_tree_t*    tree,   /* in: index tree */
 
56
        mtr_t*          mtr);   /* in: mtr */
 
57
/******************************************************************
 
58
Gets a buffer page and declares its latching order level. */
 
59
UNIV_INLINE
 
60
page_t*
 
61
btr_page_get(
 
62
/*=========*/
 
63
        ulint   space,          /* in: space id */
 
64
        ulint   page_no,        /* in: page number */
 
65
        ulint   mode,           /* in: latch mode */
 
66
        mtr_t*  mtr);           /* in: mtr */
 
67
/******************************************************************
 
68
Gets the index id field of a page. */
 
69
UNIV_INLINE
 
70
dulint
 
71
btr_page_get_index_id(
 
72
/*==================*/
 
73
                                /* out: index id */
 
74
        page_t*         page);  /* in: index page */
 
75
/************************************************************
 
76
Gets the node level field in an index page. */
 
77
UNIV_INLINE
 
78
ulint
 
79
btr_page_get_level_low(
 
80
/*===================*/
 
81
                        /* out: level, leaf level == 0 */
 
82
        page_t* page);  /* in: index page */
 
83
/************************************************************
 
84
Gets the node level field in an index page. */
 
85
UNIV_INLINE
 
86
ulint
 
87
btr_page_get_level(
 
88
/*===============*/
 
89
                        /* out: level, leaf level == 0 */
 
90
        page_t* page,   /* in: index page */
 
91
        mtr_t*  mtr);   /* in: mini-transaction handle */
 
92
/************************************************************
 
93
Gets the next index page number. */
 
94
UNIV_INLINE
 
95
ulint
 
96
btr_page_get_next(
 
97
/*==============*/
 
98
                        /* out: next page number */
 
99
        page_t* page,   /* in: index page */
 
100
        mtr_t*  mtr);   /* in: mini-transaction handle */
 
101
/************************************************************
 
102
Gets the previous index page number. */
 
103
UNIV_INLINE
 
104
ulint
 
105
btr_page_get_prev(
 
106
/*==============*/
 
107
                        /* out: prev page number */
 
108
        page_t* page,   /* in: index page */
 
109
        mtr_t*  mtr);   /* in: mini-transaction handle */
 
110
/*****************************************************************
 
111
Gets pointer to the previous user record in the tree. It is assumed
 
112
that the caller has appropriate latches on the page and its neighbor. */
 
113
 
 
114
rec_t*
 
115
btr_get_prev_user_rec(
 
116
/*==================*/
 
117
                        /* out: previous user record, NULL if there is none */
 
118
        rec_t*  rec,    /* in: record on leaf level */
 
119
        mtr_t*  mtr);   /* in: mtr holding a latch on the page, and if
 
120
                        needed, also to the previous page */
 
121
/*****************************************************************
 
122
Gets pointer to the next user record in the tree. It is assumed
 
123
that the caller has appropriate latches on the page and its neighbor. */
 
124
 
 
125
rec_t*
 
126
btr_get_next_user_rec(
 
127
/*==================*/
 
128
                        /* out: next user record, NULL if there is none */
 
129
        rec_t*  rec,    /* in: record on leaf level */
 
130
        mtr_t*  mtr);   /* in: mtr holding a latch on the page, and if
 
131
                        needed, also to the next page */
 
132
/******************************************************************
 
133
Releases the latch on a leaf page and bufferunfixes it. */
 
134
UNIV_INLINE
 
135
void
 
136
btr_leaf_page_release(
 
137
/*==================*/
 
138
        page_t* page,           /* in: page */
 
139
        ulint   latch_mode,     /* in: BTR_SEARCH_LEAF or BTR_MODIFY_LEAF */
 
140
        mtr_t*  mtr);           /* in: mtr */
 
141
/******************************************************************
 
142
Gets the child node file address in a node pointer. */
 
143
UNIV_INLINE
 
144
ulint
 
145
btr_node_ptr_get_child_page_no(
 
146
/*===========================*/
 
147
                                /* out: child node address */
 
148
        rec_t*          rec,    /* in: node pointer record */
 
149
        const ulint*    offsets);/* in: array returned by rec_get_offsets() */
 
150
/****************************************************************
 
151
Creates the root node for a new index tree. */
 
152
 
 
153
ulint
 
154
btr_create(
 
155
/*=======*/
 
156
                        /* out: page number of the created root, FIL_NULL if
 
157
                        did not succeed */
 
158
        ulint   type,   /* in: type of the index */
 
159
        ulint   space,  /* in: space where created */
 
160
        dulint  index_id,/* in: index id */
 
161
        ulint   comp,   /* in: nonzero=compact page format */
 
162
        mtr_t*  mtr);   /* in: mini-transaction handle */
 
163
/****************************************************************
 
164
Frees a B-tree except the root page, which MUST be freed after this
 
165
by calling btr_free_root. */
 
166
 
 
167
void
 
168
btr_free_but_not_root(
 
169
/*==================*/
 
170
        ulint   space,          /* in: space where created */
 
171
        ulint   root_page_no);  /* in: root page number */
 
172
/****************************************************************
 
173
Frees the B-tree root page. Other tree MUST already have been freed. */
 
174
 
 
175
void
 
176
btr_free_root(
 
177
/*==========*/
 
178
        ulint   space,          /* in: space where created */
 
179
        ulint   root_page_no,   /* in: root page number */
 
180
        mtr_t*  mtr);           /* in: a mini-transaction which has already
 
181
                                been started */
 
182
/*****************************************************************
 
183
Makes tree one level higher by splitting the root, and inserts
 
184
the tuple. It is assumed that mtr contains an x-latch on the tree.
 
185
NOTE that the operation of this function must always succeed,
 
186
we cannot reverse it: therefore enough free disk space must be
 
187
guaranteed to be available before this function is called. */
 
188
 
 
189
rec_t*
 
190
btr_root_raise_and_insert(
 
191
/*======================*/
 
192
                                /* out: inserted record */
 
193
        btr_cur_t*      cursor, /* in: cursor at which to insert: must be
 
194
                                on the root page; when the function returns,
 
195
                                the cursor is positioned on the predecessor
 
196
                                of the inserted record */
 
197
        dtuple_t*       tuple,  /* in: tuple to insert */
 
198
        mtr_t*          mtr);   /* in: mtr */
 
199
/*****************************************************************
 
200
Reorganizes an index page. */
 
201
 
 
202
void
 
203
btr_page_reorganize(
 
204
/*================*/
 
205
        page_t*         page,   /* in: page to be reorganized */
 
206
        dict_index_t*   index,  /* in: record descriptor */
 
207
        mtr_t*          mtr);   /* in: mtr */
 
208
/*****************************************************************
 
209
Decides if the page should be split at the convergence point of
 
210
inserts converging to left. */
 
211
 
 
212
ibool
 
213
btr_page_get_split_rec_to_left(
 
214
/*===========================*/
 
215
                                /* out: TRUE if split recommended */
 
216
        btr_cur_t*      cursor, /* in: cursor at which to insert */
 
217
        rec_t**         split_rec);/* out: if split recommended,
 
218
                                the first record on upper half page,
 
219
                                or NULL if tuple should be first */
 
220
/*****************************************************************
 
221
Decides if the page should be split at the convergence point of
 
222
inserts converging to right. */
 
223
 
 
224
ibool
 
225
btr_page_get_split_rec_to_right(
 
226
/*============================*/
 
227
                                /* out: TRUE if split recommended */
 
228
        btr_cur_t*      cursor, /* in: cursor at which to insert */
 
229
        rec_t**         split_rec);/* out: if split recommended,
 
230
                                the first record on upper half page,
 
231
                                or NULL if tuple should be first */
 
232
/*****************************************************************
 
233
Splits an index page to halves and inserts the tuple. It is assumed
 
234
that mtr holds an x-latch to the index tree. NOTE: the tree x-latch
 
235
is released within this function! NOTE that the operation of this
 
236
function must always succeed, we cannot reverse it: therefore
 
237
enough free disk space must be guaranteed to be available before
 
238
this function is called. */
 
239
 
 
240
rec_t*
 
241
btr_page_split_and_insert(
 
242
/*======================*/
 
243
                                /* out: inserted record; NOTE: the tree
 
244
                                x-latch is released! NOTE: 2 free disk
 
245
                                pages must be available! */
 
246
        btr_cur_t*      cursor, /* in: cursor at which to insert; when the
 
247
                                function returns, the cursor is positioned
 
248
                                on the predecessor of the inserted record */
 
249
        dtuple_t*       tuple,  /* in: tuple to insert */
 
250
        mtr_t*          mtr);   /* in: mtr */
 
251
/***********************************************************
 
252
Inserts a data tuple to a tree on a non-leaf level. It is assumed
 
253
that mtr holds an x-latch on the tree. */
 
254
 
 
255
void
 
256
btr_insert_on_non_leaf_level(
 
257
/*=========================*/
 
258
        dict_tree_t*    tree,   /* in: tree */
 
259
        ulint           level,  /* in: level, must be > 0 */
 
260
        dtuple_t*       tuple,  /* in: the record to be inserted */
 
261
        mtr_t*          mtr);   /* in: mtr */
 
262
/********************************************************************
 
263
Sets a record as the predefined minimum record. */
 
264
 
 
265
void
 
266
btr_set_min_rec_mark(
 
267
/*=================*/
 
268
        rec_t*  rec,    /* in: record */
 
269
        ulint   comp,   /* in: nonzero=compact page format */
 
270
        mtr_t*  mtr);   /* in: mtr */
 
271
/*****************************************************************
 
272
Deletes on the upper level the node pointer to a page. */
 
273
 
 
274
void
 
275
btr_node_ptr_delete(
 
276
/*================*/
 
277
        dict_tree_t*    tree,   /* in: index tree */
 
278
        page_t*         page,   /* in: page whose node pointer is deleted */
 
279
        mtr_t*          mtr);   /* in: mtr */
 
280
/****************************************************************
 
281
Checks that the node pointer to a page is appropriate. */
 
282
 
 
283
ibool
 
284
btr_check_node_ptr(
 
285
/*===============*/
 
286
                                /* out: TRUE */
 
287
        dict_tree_t*    tree,   /* in: index tree */
 
288
        page_t*         page,   /* in: index page */
 
289
        mtr_t*          mtr);   /* in: mtr */
 
290
/*****************************************************************
 
291
Tries to merge the page first to the left immediate brother if such a
 
292
brother exists, and the node pointers to the current page and to the
 
293
brother reside on the same page. If the left brother does not satisfy these
 
294
conditions, looks at the right brother. If the page is the only one on that
 
295
level lifts the records of the page to the father page, thus reducing the
 
296
tree height. It is assumed that mtr holds an x-latch on the tree and on the
 
297
page. If cursor is on the leaf level, mtr must also hold x-latches to
 
298
the brothers, if they exist. NOTE: it is assumed that the caller has reserved
 
299
enough free extents so that the compression will always succeed if done! */
 
300
void
 
301
btr_compress(
 
302
/*=========*/
 
303
        btr_cur_t*      cursor, /* in: cursor on the page to merge or lift;
 
304
                                the page must not be empty: in record delete
 
305
                                use btr_discard_page if the page would become
 
306
                                empty */
 
307
        mtr_t*          mtr);   /* in: mtr */
 
308
/*****************************************************************
 
309
Discards a page from a B-tree. This is used to remove the last record from
 
310
a B-tree page: the whole page must be removed at the same time. This cannot
 
311
be used for the root page, which is allowed to be empty. */
 
312
 
 
313
void
 
314
btr_discard_page(
 
315
/*=============*/
 
316
        btr_cur_t*      cursor, /* in: cursor on the page to discard: not on
 
317
                                the root page */
 
318
        mtr_t*          mtr);   /* in: mtr */
 
319
/********************************************************************
 
320
Parses the redo log record for setting an index record as the predefined
 
321
minimum record. */
 
322
 
 
323
byte*
 
324
btr_parse_set_min_rec_mark(
 
325
/*=======================*/
 
326
                        /* out: end of log record or NULL */
 
327
        byte*   ptr,    /* in: buffer */
 
328
        byte*   end_ptr,/* in: buffer end */
 
329
        ulint   comp,   /* in: nonzero=compact page format */
 
330
        page_t* page,   /* in: page or NULL */
 
331
        mtr_t*  mtr);   /* in: mtr or NULL */
 
332
/***************************************************************
 
333
Parses a redo log record of reorganizing a page. */
 
334
 
 
335
byte*
 
336
btr_parse_page_reorganize(
 
337
/*======================*/
 
338
                                /* out: end of log record or NULL */
 
339
        byte*           ptr,    /* in: buffer */
 
340
        byte*           end_ptr,/* in: buffer end */
 
341
        dict_index_t*   index,  /* in: record descriptor */
 
342
        page_t*         page,   /* in: page or NULL */
 
343
        mtr_t*          mtr);   /* in: mtr or NULL */
 
344
/******************************************************************
 
345
Gets the number of pages in a B-tree. */
 
346
 
 
347
ulint
 
348
btr_get_size(
 
349
/*=========*/
 
350
                                /* out: number of pages */
 
351
        dict_index_t*   index,  /* in: index */
 
352
        ulint           flag);  /* in: BTR_N_LEAF_PAGES or BTR_TOTAL_SIZE */
 
353
/******************************************************************
 
354
Allocates a new file page to be used in an index tree. NOTE: we assume
 
355
that the caller has made the reservation for free extents! */
 
356
 
 
357
page_t*
 
358
btr_page_alloc(
 
359
/*===========*/
 
360
                                        /* out: new allocated page, x-latched;
 
361
                                        NULL if out of space */
 
362
        dict_tree_t*    tree,           /* in: index tree */
 
363
        ulint           hint_page_no,   /* in: hint of a good page */
 
364
        byte            file_direction, /* in: direction where a possible
 
365
                                        page split is made */
 
366
        ulint           level,          /* in: level where the page is placed
 
367
                                        in the tree */
 
368
        mtr_t*          mtr);           /* in: mtr */
 
369
/******************************************************************
 
370
Frees a file page used in an index tree. NOTE: cannot free field external
 
371
storage pages because the page must contain info on its level. */
 
372
 
 
373
void
 
374
btr_page_free(
 
375
/*==========*/
 
376
        dict_tree_t*    tree,   /* in: index tree */
 
377
        page_t*         page,   /* in: page to be freed, x-latched */   
 
378
        mtr_t*          mtr);   /* in: mtr */
 
379
/******************************************************************
 
380
Frees a file page used in an index tree. Can be used also to BLOB
 
381
external storage pages, because the page level 0 can be given as an
 
382
argument. */
 
383
 
 
384
void
 
385
btr_page_free_low(
 
386
/*==============*/
 
387
        dict_tree_t*    tree,   /* in: index tree */
 
388
        page_t*         page,   /* in: page to be freed, x-latched */   
 
389
        ulint           level,  /* in: page level */
 
390
        mtr_t*          mtr);   /* in: mtr */
 
391
#ifdef UNIV_BTR_PRINT
 
392
/*****************************************************************
 
393
Prints size info of a B-tree. */
 
394
 
 
395
void
 
396
btr_print_size(
 
397
/*===========*/
 
398
        dict_tree_t*    tree);  /* in: index tree */
 
399
/******************************************************************
 
400
Prints directories and other info of all nodes in the tree. */
 
401
 
 
402
void
 
403
btr_print_tree(
 
404
/*===========*/
 
405
        dict_tree_t*    tree,   /* in: tree */
 
406
        ulint           width); /* in: print this many entries from start
 
407
                                and end */
 
408
#endif /* UNIV_BTR_PRINT */
 
409
/****************************************************************
 
410
Checks the size and number of fields in a record based on the definition of
 
411
the index. */
 
412
 
 
413
ibool
 
414
btr_index_rec_validate(
 
415
/*====================*/
 
416
                                        /* out: TRUE if ok */
 
417
        rec_t*          rec,            /* in: index record */
 
418
        dict_index_t*   index,          /* in: index */
 
419
        ibool           dump_on_error); /* in: TRUE if the function
 
420
                                        should print hex dump of record
 
421
                                        and page on error */
 
422
/******************************************************************
 
423
Checks the consistency of an index tree. */
 
424
 
 
425
ibool
 
426
btr_validate_tree(
 
427
/*==============*/
 
428
                                /* out: TRUE if ok */
 
429
        dict_tree_t*    tree,   /* in: tree */
 
430
        trx_t*          trx);   /* in: transaction or NULL */
 
431
 
 
432
#define BTR_N_LEAF_PAGES        1
 
433
#define BTR_TOTAL_SIZE          2
 
434
 
 
435
#ifndef UNIV_NONINL
 
436
#include "btr0btr.ic"
 
437
#endif
 
438
 
 
439
#endif