~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to storage/innobase/include/btr0cur.h

  • Committer: Monty Taylor
  • Date: 2009-08-12 06:25:19 UTC
  • mto: (1114.1.1 innodb-plugin-merge)
  • mto: This revision was merged to the branch mainline in revision 1183.
  • Revision ID: mordred@inaugust.com-20090812062519-cij02mrrunvnxblt
Tags: innodb-plugin-1.0.4
InnoDB Plugin 1.0.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
*****************************************************************************/
18
18
 
19
 
/******************************************************
 
19
/**************************************************//**
 
20
@file include/btr0cur.h
20
21
The index tree cursor
21
22
 
22
23
Created 10/16/1994 Heikki Tuuri
29
30
#include "dict0dict.h"
30
31
#include "page0cur.h"
31
32
#include "btr0types.h"
32
 
#include "que0types.h"
33
 
#include "row0types.h"
34
 
#include "ha0ha.h"
35
33
 
36
34
/* Mode flags for btr_cur operations; these can be ORed */
37
35
#define BTR_NO_UNDO_LOG_FLAG    1       /* do no undo logging */
39
37
#define BTR_KEEP_SYS_FLAG       4       /* sys fields will be found from the
40
38
                                        update vector or inserted entry */
41
39
 
 
40
#ifndef UNIV_HOTBACKUP
 
41
#include "que0types.h"
 
42
#include "row0types.h"
 
43
#include "ha0ha.h"
 
44
 
42
45
#define BTR_CUR_ADAPT
43
46
#define BTR_CUR_HASH_ADAPT
44
47
 
45
48
#ifdef UNIV_DEBUG
46
 
/*************************************************************
47
 
Returns the page cursor component of a tree cursor. */
 
49
/*********************************************************//**
 
50
Returns the page cursor component of a tree cursor.
 
51
@return pointer to page cursor component */
48
52
UNIV_INLINE
49
53
page_cur_t*
50
54
btr_cur_get_page_cur(
51
55
/*=================*/
52
 
                                        /* out: pointer to page cursor
53
 
                                        component */
54
 
        const btr_cur_t*        cursor);/* in: tree cursor */
 
56
        const btr_cur_t*        cursor);/*!< in: tree cursor */
55
57
#else /* UNIV_DEBUG */
56
58
# define btr_cur_get_page_cur(cursor) (&(cursor)->page_cur)
57
59
#endif /* UNIV_DEBUG */
58
 
/*************************************************************
59
 
Returns the buffer block on which the tree cursor is positioned. */
 
60
/*********************************************************//**
 
61
Returns the buffer block on which the tree cursor is positioned.
 
62
@return pointer to buffer block */
60
63
UNIV_INLINE
61
64
buf_block_t*
62
65
btr_cur_get_block(
63
66
/*==============*/
64
 
                                /* out: pointer to buffer block */
65
 
        btr_cur_t*      cursor);/* in: tree cursor */
66
 
/*************************************************************
67
 
Returns the record pointer of a tree cursor. */
 
67
        btr_cur_t*      cursor);/*!< in: tree cursor */
 
68
/*********************************************************//**
 
69
Returns the record pointer of a tree cursor.
 
70
@return pointer to record */
68
71
UNIV_INLINE
69
72
rec_t*
70
73
btr_cur_get_rec(
71
74
/*============*/
72
 
                                /* out: pointer to record */
73
 
        btr_cur_t*      cursor);/* in: tree cursor */
74
 
/*************************************************************
75
 
Returns the compressed page on which the tree cursor is positioned. */
 
75
        btr_cur_t*      cursor);/*!< in: tree cursor */
 
76
/*********************************************************//**
 
77
Returns the compressed page on which the tree cursor is positioned.
 
78
@return pointer to compressed page, or NULL if the page is not compressed */
76
79
UNIV_INLINE
77
80
page_zip_des_t*
78
81
btr_cur_get_page_zip(
79
82
/*=================*/
80
 
                                /* out: pointer to compressed page,
81
 
                                or NULL if the page is not compressed */
82
 
        btr_cur_t*      cursor);/* in: tree cursor */
83
 
/*************************************************************
 
83
        btr_cur_t*      cursor);/*!< in: tree cursor */
 
84
/*********************************************************//**
84
85
Invalidates a tree cursor by setting record pointer to NULL. */
85
86
UNIV_INLINE
86
87
void
87
88
btr_cur_invalidate(
88
89
/*===============*/
89
 
        btr_cur_t*      cursor);/* in: tree cursor */
90
 
/*************************************************************
91
 
Returns the page of a tree cursor. */
 
90
        btr_cur_t*      cursor);/*!< in: tree cursor */
 
91
/*********************************************************//**
 
92
Returns the page of a tree cursor.
 
93
@return pointer to page */
92
94
UNIV_INLINE
93
95
page_t*
94
96
btr_cur_get_page(
95
97
/*=============*/
96
 
                                /* out: pointer to page */
97
 
        btr_cur_t*      cursor);/* in: tree cursor */
98
 
/*************************************************************
99
 
Returns the index of a cursor. */
 
98
        btr_cur_t*      cursor);/*!< in: tree cursor */
 
99
/*********************************************************//**
 
100
Returns the index of a cursor.
 
101
@return index */
100
102
UNIV_INLINE
101
103
dict_index_t*
102
104
btr_cur_get_index(
103
105
/*==============*/
104
 
                                /* out: index */
105
 
        btr_cur_t*      cursor);/* in: B-tree cursor */
106
 
/*************************************************************
 
106
        btr_cur_t*      cursor);/*!< in: B-tree cursor */
 
107
/*********************************************************//**
107
108
Positions a tree cursor at a given record. */
108
109
UNIV_INLINE
109
110
void
110
111
btr_cur_position(
111
112
/*=============*/
112
 
        dict_index_t*   index,  /* in: index */
113
 
        rec_t*          rec,    /* in: record in tree */
114
 
        buf_block_t*    block,  /* in: buffer block of rec */
115
 
        btr_cur_t*      cursor);/* in: cursor */
116
 
/************************************************************************
 
113
        dict_index_t*   index,  /*!< in: index */
 
114
        rec_t*          rec,    /*!< in: record in tree */
 
115
        buf_block_t*    block,  /*!< in: buffer block of rec */
 
116
        btr_cur_t*      cursor);/*!< in: cursor */
 
117
/********************************************************************//**
117
118
Searches an index tree and positions a tree cursor on a given level.
118
119
NOTE: n_fields_cmp in tuple must be set so that it cannot be compared
119
120
to node pointer page number fields on the upper levels of the tree!
124
125
void
125
126
btr_cur_search_to_nth_level(
126
127
/*========================*/
127
 
        dict_index_t*   index,  /* in: index */
128
 
        ulint           level,  /* in: the tree level of search */
129
 
        const dtuple_t* tuple,  /* in: data tuple; NOTE: n_fields_cmp in
 
128
        dict_index_t*   index,  /*!< in: index */
 
129
        ulint           level,  /*!< in: the tree level of search */
 
130
        const dtuple_t* tuple,  /*!< in: data tuple; NOTE: n_fields_cmp in
130
131
                                tuple must be set so that it cannot get
131
132
                                compared to the node ptr page number field! */
132
 
        ulint           mode,   /* in: PAGE_CUR_L, ...;
 
133
        ulint           mode,   /*!< in: PAGE_CUR_L, ...;
133
134
                                NOTE that if the search is made using a unique
134
135
                                prefix of a record, mode should be PAGE_CUR_LE,
135
136
                                not PAGE_CUR_GE, as the latter may end up on
136
137
                                the previous page of the record! Inserts
137
138
                                should always be made using PAGE_CUR_LE to
138
139
                                search the position! */
139
 
        ulint           latch_mode, /* in: BTR_SEARCH_LEAF, ..., ORed with
 
140
        ulint           latch_mode, /*!< in: BTR_SEARCH_LEAF, ..., ORed with
140
141
                                BTR_INSERT and BTR_ESTIMATE;
141
142
                                cursor->left_block is used to store a pointer
142
143
                                to the left neighbor page, in the cases
146
147
                                on the cursor page, we assume
147
148
                                the caller uses his search latch
148
149
                                to protect the record! */
149
 
        btr_cur_t*      cursor, /* in/out: tree cursor; the cursor page is
 
150
        btr_cur_t*      cursor, /*!< in/out: tree cursor; the cursor page is
150
151
                                s- or x-latched, but see also above! */
151
 
        ulint           has_search_latch,/* in: latch mode the caller
 
152
        ulint           has_search_latch,/*!< in: latch mode the caller
152
153
                                currently has on btr_search_latch:
153
154
                                RW_S_LATCH, or 0 */
154
 
        mtr_t*          mtr);   /* in: mtr */
155
 
/*********************************************************************
 
155
        mtr_t*          mtr);   /*!< in: mtr */
 
156
/*****************************************************************//**
156
157
Opens a cursor at either end of an index. */
157
158
UNIV_INTERN
158
159
void
159
160
btr_cur_open_at_index_side(
160
161
/*=======================*/
161
 
        ibool           from_left,      /* in: TRUE if open to the low end,
 
162
        ibool           from_left,      /*!< in: TRUE if open to the low end,
162
163
                                        FALSE if to the high end */
163
 
        dict_index_t*   index,          /* in: index */
164
 
        ulint           latch_mode,     /* in: latch mode */
165
 
        btr_cur_t*      cursor,         /* in: cursor */
166
 
        mtr_t*          mtr);           /* in: mtr */
167
 
/**************************************************************************
 
164
        dict_index_t*   index,          /*!< in: index */
 
165
        ulint           latch_mode,     /*!< in: latch mode */
 
166
        btr_cur_t*      cursor,         /*!< in: cursor */
 
167
        mtr_t*          mtr);           /*!< in: mtr */
 
168
/**********************************************************************//**
168
169
Positions a cursor at a randomly chosen position within a B-tree. */
169
170
UNIV_INTERN
170
171
void
171
172
btr_cur_open_at_rnd_pos(
172
173
/*====================*/
173
 
        dict_index_t*   index,          /* in: index */
174
 
        ulint           latch_mode,     /* in: BTR_SEARCH_LEAF, ... */
175
 
        btr_cur_t*      cursor,         /* in/out: B-tree cursor */
176
 
        mtr_t*          mtr);           /* in: mtr */
177
 
/*****************************************************************
 
174
        dict_index_t*   index,          /*!< in: index */
 
175
        ulint           latch_mode,     /*!< in: BTR_SEARCH_LEAF, ... */
 
176
        btr_cur_t*      cursor,         /*!< in/out: B-tree cursor */
 
177
        mtr_t*          mtr);           /*!< in: mtr */
 
178
/*************************************************************//**
178
179
Tries to perform an insert to a page in an index tree, next to cursor.
179
180
It is assumed that mtr holds an x-latch on the page. The operation does
180
181
not succeed if there is too little space on the page. If there is just
181
182
one record on the page, the insert will always succeed; this is to
182
 
prevent trying to split a page with just one record. */
 
183
prevent trying to split a page with just one record.
 
184
@return DB_SUCCESS, DB_WAIT_LOCK, DB_FAIL, or error number */
183
185
UNIV_INTERN
184
186
ulint
185
187
btr_cur_optimistic_insert(
186
188
/*======================*/
187
 
                                /* out: DB_SUCCESS, DB_WAIT_LOCK,
188
 
                                DB_FAIL, or error number */
189
 
        ulint           flags,  /* in: undo logging and locking flags: if not
 
189
        ulint           flags,  /*!< in: undo logging and locking flags: if not
190
190
                                zero, the parameters index and thr should be
191
191
                                specified */
192
 
        btr_cur_t*      cursor, /* in: cursor on page after which to insert;
 
192
        btr_cur_t*      cursor, /*!< in: cursor on page after which to insert;
193
193
                                cursor stays valid */
194
 
        dtuple_t*       entry,  /* in/out: entry to insert */
195
 
        rec_t**         rec,    /* out: pointer to inserted record if
 
194
        dtuple_t*       entry,  /*!< in/out: entry to insert */
 
195
        rec_t**         rec,    /*!< out: pointer to inserted record if
196
196
                                succeed */
197
 
        big_rec_t**     big_rec,/* out: big rec vector whose fields have to
 
197
        big_rec_t**     big_rec,/*!< out: big rec vector whose fields have to
198
198
                                be stored externally by the caller, or
199
199
                                NULL */
200
 
        ulint           n_ext,  /* in: number of externally stored columns */
201
 
        que_thr_t*      thr,    /* in: query thread or NULL */
202
 
        mtr_t*          mtr);   /* in: mtr; if this function returns
 
200
        ulint           n_ext,  /*!< in: number of externally stored columns */
 
201
        que_thr_t*      thr,    /*!< in: query thread or NULL */
 
202
        mtr_t*          mtr);   /*!< in: mtr; if this function returns
203
203
                                DB_SUCCESS on a leaf page of a secondary
204
204
                                index in a compressed tablespace, the
205
205
                                mtr must be committed before latching
206
206
                                any further pages */
207
 
/*****************************************************************
 
207
/*************************************************************//**
208
208
Performs an insert on a page of an index tree. It is assumed that mtr
209
209
holds an x-latch on the tree and on the cursor page. If the insert is
210
210
made on the leaf level, to avoid deadlocks, mtr must also own x-latches
211
 
to brothers of page, if those brothers exist. */
 
211
to brothers of page, if those brothers exist.
 
212
@return DB_SUCCESS or error number */
212
213
UNIV_INTERN
213
214
ulint
214
215
btr_cur_pessimistic_insert(
215
216
/*=======================*/
216
 
                                /* out: DB_SUCCESS or error number */
217
 
        ulint           flags,  /* in: undo logging and locking flags: if not
 
217
        ulint           flags,  /*!< in: undo logging and locking flags: if not
218
218
                                zero, the parameter thr should be
219
219
                                specified; if no undo logging is specified,
220
220
                                then the caller must have reserved enough
221
221
                                free extents in the file space so that the
222
222
                                insertion will certainly succeed */
223
 
        btr_cur_t*      cursor, /* in: cursor after which to insert;
 
223
        btr_cur_t*      cursor, /*!< in: cursor after which to insert;
224
224
                                cursor stays valid */
225
 
        dtuple_t*       entry,  /* in/out: entry to insert */
226
 
        rec_t**         rec,    /* out: pointer to inserted record if
 
225
        dtuple_t*       entry,  /*!< in/out: entry to insert */
 
226
        rec_t**         rec,    /*!< out: pointer to inserted record if
227
227
                                succeed */
228
 
        big_rec_t**     big_rec,/* out: big rec vector whose fields have to
 
228
        big_rec_t**     big_rec,/*!< out: big rec vector whose fields have to
229
229
                                be stored externally by the caller, or
230
230
                                NULL */
231
 
        ulint           n_ext,  /* in: number of externally stored columns */
232
 
        que_thr_t*      thr,    /* in: query thread or NULL */
233
 
        mtr_t*          mtr);   /* in: mtr */
234
 
/*****************************************************************
235
 
Updates a record when the update causes no size changes in its fields. */
 
231
        ulint           n_ext,  /*!< in: number of externally stored columns */
 
232
        que_thr_t*      thr,    /*!< in: query thread or NULL */
 
233
        mtr_t*          mtr);   /*!< in: mtr */
 
234
/*************************************************************//**
 
235
Updates a record when the update causes no size changes in its fields.
 
236
@return DB_SUCCESS or error number */
236
237
UNIV_INTERN
237
238
ulint
238
239
btr_cur_update_in_place(
239
240
/*====================*/
240
 
                                /* out: DB_SUCCESS or error number */
241
 
        ulint           flags,  /* in: undo logging and locking flags */
242
 
        btr_cur_t*      cursor, /* in: cursor on the record to update;
 
241
        ulint           flags,  /*!< in: undo logging and locking flags */
 
242
        btr_cur_t*      cursor, /*!< in: cursor on the record to update;
243
243
                                cursor stays valid and positioned on the
244
244
                                same record */
245
 
        const upd_t*    update, /* in: update vector */
246
 
        ulint           cmpl_info,/* in: compiler info on secondary index
 
245
        const upd_t*    update, /*!< in: update vector */
 
246
        ulint           cmpl_info,/*!< in: compiler info on secondary index
247
247
                                updates */
248
 
        que_thr_t*      thr,    /* in: query thread */
249
 
        mtr_t*          mtr);   /* in: mtr; must be committed before
 
248
        que_thr_t*      thr,    /*!< in: query thread */
 
249
        mtr_t*          mtr);   /*!< in: mtr; must be committed before
250
250
                                latching any further pages */
251
 
/*****************************************************************
 
251
/*************************************************************//**
252
252
Tries to update a record on a page in an index tree. It is assumed that mtr
253
253
holds an x-latch on the page. The operation does not succeed if there is too
254
254
little space on the page or if the update would result in too empty a page,
255
 
so that tree compression is recommended. */
 
255
so that tree compression is recommended.
 
256
@return DB_SUCCESS, or DB_OVERFLOW if the updated record does not fit,
 
257
DB_UNDERFLOW if the page would become too empty, or DB_ZIP_OVERFLOW if
 
258
there is not enough space left on the compressed page */
256
259
UNIV_INTERN
257
260
ulint
258
261
btr_cur_optimistic_update(
259
262
/*======================*/
260
 
                                /* out: DB_SUCCESS, or DB_OVERFLOW if the
261
 
                                updated record does not fit, DB_UNDERFLOW
262
 
                                if the page would become too empty, or
263
 
                                DB_ZIP_OVERFLOW if there is not enough
264
 
                                space left on the compressed page */
265
 
        ulint           flags,  /* in: undo logging and locking flags */
266
 
        btr_cur_t*      cursor, /* in: cursor on the record to update;
 
263
        ulint           flags,  /*!< in: undo logging and locking flags */
 
264
        btr_cur_t*      cursor, /*!< in: cursor on the record to update;
267
265
                                cursor stays valid and positioned on the
268
266
                                same record */
269
 
        const upd_t*    update, /* in: update vector; this must also
 
267
        const upd_t*    update, /*!< in: update vector; this must also
270
268
                                contain trx id and roll ptr fields */
271
 
        ulint           cmpl_info,/* in: compiler info on secondary index
 
269
        ulint           cmpl_info,/*!< in: compiler info on secondary index
272
270
                                updates */
273
 
        que_thr_t*      thr,    /* in: query thread */
274
 
        mtr_t*          mtr);   /* in: mtr; must be committed before
 
271
        que_thr_t*      thr,    /*!< in: query thread */
 
272
        mtr_t*          mtr);   /*!< in: mtr; must be committed before
275
273
                                latching any further pages */
276
 
/*****************************************************************
 
274
/*************************************************************//**
277
275
Performs an update of a record on a page of a tree. It is assumed
278
276
that mtr holds an x-latch on the tree and on the cursor page. If the
279
277
update is made on the leaf level, to avoid deadlocks, mtr must also
280
 
own x-latches to brothers of page, if those brothers exist. */
 
278
own x-latches to brothers of page, if those brothers exist.
 
279
@return DB_SUCCESS or error code */
281
280
UNIV_INTERN
282
281
ulint
283
282
btr_cur_pessimistic_update(
284
283
/*=======================*/
285
 
                                /* out: DB_SUCCESS or error code */
286
 
        ulint           flags,  /* in: undo logging, locking, and rollback
 
284
        ulint           flags,  /*!< in: undo logging, locking, and rollback
287
285
                                flags */
288
 
        btr_cur_t*      cursor, /* in: cursor on the record to update */
289
 
        mem_heap_t**    heap,   /* in/out: pointer to memory heap, or NULL */
290
 
        big_rec_t**     big_rec,/* out: big rec vector whose fields have to
 
286
        btr_cur_t*      cursor, /*!< in: cursor on the record to update */
 
287
        mem_heap_t**    heap,   /*!< in/out: pointer to memory heap, or NULL */
 
288
        big_rec_t**     big_rec,/*!< out: big rec vector whose fields have to
291
289
                                be stored externally by the caller, or NULL */
292
 
        const upd_t*    update, /* in: update vector; this is allowed also
 
290
        const upd_t*    update, /*!< in: update vector; this is allowed also
293
291
                                contain trx id and roll ptr fields, but
294
292
                                the values in update vector have no effect */
295
 
        ulint           cmpl_info,/* in: compiler info on secondary index
 
293
        ulint           cmpl_info,/*!< in: compiler info on secondary index
296
294
                                updates */
297
 
        que_thr_t*      thr,    /* in: query thread */
298
 
        mtr_t*          mtr);   /* in: mtr; must be committed before
 
295
        que_thr_t*      thr,    /*!< in: query thread */
 
296
        mtr_t*          mtr);   /*!< in: mtr; must be committed before
299
297
                                latching any further pages */
300
 
/***************************************************************
 
298
/***********************************************************//**
301
299
Marks a clustered index record deleted. Writes an undo log record to
302
300
undo log on this delete marking. Writes in the trx id field the id
303
301
of the deleting transaction, and in the roll ptr field pointer to the
304
 
undo log record created. */
 
302
undo log record created.
 
303
@return DB_SUCCESS, DB_LOCK_WAIT, or error number */
305
304
UNIV_INTERN
306
305
ulint
307
306
btr_cur_del_mark_set_clust_rec(
308
307
/*===========================*/
309
 
                                /* out: DB_SUCCESS, DB_LOCK_WAIT, or error
310
 
                                number */
311
 
        ulint           flags,  /* in: undo logging and locking flags */
312
 
        btr_cur_t*      cursor, /* in: cursor */
313
 
        ibool           val,    /* in: value to set */
314
 
        que_thr_t*      thr,    /* in: query thread */
315
 
        mtr_t*          mtr);   /* in: mtr */
316
 
/***************************************************************
317
 
Sets a secondary index record delete mark to TRUE or FALSE. */
 
308
        ulint           flags,  /*!< in: undo logging and locking flags */
 
309
        btr_cur_t*      cursor, /*!< in: cursor */
 
310
        ibool           val,    /*!< in: value to set */
 
311
        que_thr_t*      thr,    /*!< in: query thread */
 
312
        mtr_t*          mtr);   /*!< in: mtr */
 
313
/***********************************************************//**
 
314
Sets a secondary index record delete mark to TRUE or FALSE.
 
315
@return DB_SUCCESS, DB_LOCK_WAIT, or error number */
318
316
UNIV_INTERN
319
317
ulint
320
318
btr_cur_del_mark_set_sec_rec(
321
319
/*=========================*/
322
 
                                /* out: DB_SUCCESS, DB_LOCK_WAIT, or error
323
 
                                number */
324
 
        ulint           flags,  /* in: locking flag */
325
 
        btr_cur_t*      cursor, /* in: cursor */
326
 
        ibool           val,    /* in: value to set */
327
 
        que_thr_t*      thr,    /* in: query thread */
328
 
        mtr_t*          mtr);   /* in: mtr */
329
 
/***************************************************************
 
320
        ulint           flags,  /*!< in: locking flag */
 
321
        btr_cur_t*      cursor, /*!< in: cursor */
 
322
        ibool           val,    /*!< in: value to set */
 
323
        que_thr_t*      thr,    /*!< in: query thread */
 
324
        mtr_t*          mtr);   /*!< in: mtr */
 
325
/***********************************************************//**
330
326
Clear a secondary index record's delete mark.  This function is only
331
327
used by the insert buffer insert merge mechanism. */
332
328
UNIV_INTERN
333
329
void
334
330
btr_cur_del_unmark_for_ibuf(
335
331
/*========================*/
336
 
        rec_t*          rec,            /* in/out: record to delete unmark */
337
 
        page_zip_des_t* page_zip,       /* in/out: compressed page
 
332
        rec_t*          rec,            /*!< in/out: record to delete unmark */
 
333
        page_zip_des_t* page_zip,       /*!< in/out: compressed page
338
334
                                        corresponding to rec, or NULL
339
335
                                        when the tablespace is
340
336
                                        uncompressed */
341
 
        mtr_t*          mtr);           /* in: mtr */
342
 
/*****************************************************************
 
337
        mtr_t*          mtr);           /*!< in: mtr */
 
338
/*************************************************************//**
343
339
Tries to compress a page of the tree if it seems useful. It is assumed
344
340
that mtr holds an x-latch on the tree and on the cursor page. To avoid
345
341
deadlocks, mtr must also own x-latches to brothers of page, if those
346
342
brothers exist. NOTE: it is assumed that the caller has reserved enough
347
 
free extents so that the compression will always succeed if done! */
 
343
free extents so that the compression will always succeed if done!
 
344
@return TRUE if compression occurred */
348
345
UNIV_INTERN
349
346
ibool
350
347
btr_cur_compress_if_useful(
351
348
/*=======================*/
352
 
                                /* out: TRUE if compression occurred */
353
 
        btr_cur_t*      cursor, /* in: cursor on the page to compress;
 
349
        btr_cur_t*      cursor, /*!< in: cursor on the page to compress;
354
350
                                cursor does not stay valid if compression
355
351
                                occurs */
356
 
        mtr_t*          mtr);   /* in: mtr */
357
 
/***********************************************************
 
352
        mtr_t*          mtr);   /*!< in: mtr */
 
353
/*******************************************************//**
358
354
Removes the record on which the tree cursor is positioned. It is assumed
359
355
that the mtr has an x-latch on the page where the cursor is positioned,
360
 
but no latch on the whole tree. */
 
356
but no latch on the whole tree.
 
357
@return TRUE if success, i.e., the page did not become too empty */
361
358
UNIV_INTERN
362
359
ibool
363
360
btr_cur_optimistic_delete(
364
361
/*======================*/
365
 
                                /* out: TRUE if success, i.e., the page
366
 
                                did not become too empty */
367
 
        btr_cur_t*      cursor, /* in: cursor on the record to delete;
 
362
        btr_cur_t*      cursor, /*!< in: cursor on the record to delete;
368
363
                                cursor stays valid: if deletion succeeds,
369
364
                                on function exit it points to the successor
370
365
                                of the deleted record */
371
 
        mtr_t*          mtr);   /* in: mtr; if this function returns
 
366
        mtr_t*          mtr);   /*!< in: mtr; if this function returns
372
367
                                TRUE on a leaf page of a secondary
373
368
                                index, the mtr must be committed
374
369
                                before latching any further pages */
375
 
/*****************************************************************
 
370
/*************************************************************//**
376
371
Removes the record on which the tree cursor is positioned. Tries
377
372
to compress the page if its fillfactor drops below a threshold
378
373
or if it is the only page on the level. It is assumed that mtr holds
379
374
an x-latch on the tree and on the cursor page. To avoid deadlocks,
380
375
mtr must also own x-latches to brothers of page, if those brothers
381
 
exist. */
 
376
exist.
 
377
@return TRUE if compression occurred */
382
378
UNIV_INTERN
383
379
ibool
384
380
btr_cur_pessimistic_delete(
385
381
/*=======================*/
386
 
                                /* out: TRUE if compression occurred */
387
 
        ulint*          err,    /* out: DB_SUCCESS or DB_OUT_OF_FILE_SPACE;
 
382
        ulint*          err,    /*!< out: DB_SUCCESS or DB_OUT_OF_FILE_SPACE;
388
383
                                the latter may occur because we may have
389
384
                                to update node pointers on upper levels,
390
385
                                and in the case of variable length keys
391
386
                                these may actually grow in size */
392
 
        ibool           has_reserved_extents, /* in: TRUE if the
 
387
        ibool           has_reserved_extents, /*!< in: TRUE if the
393
388
                                caller has already reserved enough free
394
389
                                extents so that he knows that the operation
395
390
                                will succeed */
396
 
        btr_cur_t*      cursor, /* in: cursor on the record to delete;
 
391
        btr_cur_t*      cursor, /*!< in: cursor on the record to delete;
397
392
                                if compression does not occur, the cursor
398
393
                                stays valid: it points to successor of
399
394
                                deleted record on function exit */
400
 
        enum trx_rb_ctx rb_ctx, /* in: rollback context */
401
 
        mtr_t*          mtr);   /* in: mtr */
402
 
/***************************************************************
403
 
Parses a redo log record of updating a record in-place. */
 
395
        enum trx_rb_ctx rb_ctx, /*!< in: rollback context */
 
396
        mtr_t*          mtr);   /*!< in: mtr */
 
397
#endif /* !UNIV_HOTBACKUP */
 
398
/***********************************************************//**
 
399
Parses a redo log record of updating a record in-place.
 
400
@return end of log record or NULL */
404
401
UNIV_INTERN
405
402
byte*
406
403
btr_cur_parse_update_in_place(
407
404
/*==========================*/
408
 
                                /* out: end of log record or NULL */
409
 
        byte*           ptr,    /* in: buffer */
410
 
        byte*           end_ptr,/* in: buffer end */
411
 
        page_t*         page,   /* in/out: page or NULL */
412
 
        page_zip_des_t* page_zip,/* in/out: compressed page, or NULL */
413
 
        dict_index_t*   index); /* in: index corresponding to page */
414
 
/********************************************************************
 
405
        byte*           ptr,    /*!< in: buffer */
 
406
        byte*           end_ptr,/*!< in: buffer end */
 
407
        page_t*         page,   /*!< in/out: page or NULL */
 
408
        page_zip_des_t* page_zip,/*!< in/out: compressed page, or NULL */
 
409
        dict_index_t*   index); /*!< in: index corresponding to page */
 
410
/****************************************************************//**
415
411
Parses the redo log record for delete marking or unmarking of a clustered
416
 
index record. */
 
412
index record.
 
413
@return end of log record or NULL */
417
414
UNIV_INTERN
418
415
byte*
419
416
btr_cur_parse_del_mark_set_clust_rec(
420
417
/*=================================*/
421
 
                                /* out: end of log record or NULL */
422
 
        byte*           ptr,    /* in: buffer */
423
 
        byte*           end_ptr,/* in: buffer end */
424
 
        page_t*         page,   /* in/out: page or NULL */
425
 
        page_zip_des_t* page_zip,/* in/out: compressed page, or NULL */
426
 
        dict_index_t*   index); /* in: index corresponding to page */
427
 
/********************************************************************
 
418
        byte*           ptr,    /*!< in: buffer */
 
419
        byte*           end_ptr,/*!< in: buffer end */
 
420
        page_t*         page,   /*!< in/out: page or NULL */
 
421
        page_zip_des_t* page_zip,/*!< in/out: compressed page, or NULL */
 
422
        dict_index_t*   index); /*!< in: index corresponding to page */
 
423
/****************************************************************//**
428
424
Parses the redo log record for delete marking or unmarking of a secondary
429
 
index record. */
 
425
index record.
 
426
@return end of log record or NULL */
430
427
UNIV_INTERN
431
428
byte*
432
429
btr_cur_parse_del_mark_set_sec_rec(
433
430
/*===============================*/
434
 
                                /* out: end of log record or NULL */
435
 
        byte*           ptr,    /* in: buffer */
436
 
        byte*           end_ptr,/* in: buffer end */
437
 
        page_t*         page,   /* in/out: page or NULL */
438
 
        page_zip_des_t* page_zip);/* in/out: compressed page, or NULL */
439
 
/***********************************************************************
440
 
Estimates the number of rows in a given index range. */
 
431
        byte*           ptr,    /*!< in: buffer */
 
432
        byte*           end_ptr,/*!< in: buffer end */
 
433
        page_t*         page,   /*!< in/out: page or NULL */
 
434
        page_zip_des_t* page_zip);/*!< in/out: compressed page, or NULL */
 
435
#ifndef UNIV_HOTBACKUP
 
436
/*******************************************************************//**
 
437
Estimates the number of rows in a given index range.
 
438
@return estimated number of rows */
441
439
UNIV_INTERN
442
440
ib_int64_t
443
441
btr_estimate_n_rows_in_range(
444
442
/*=========================*/
445
 
                                /* out: estimated number of rows */
446
 
        dict_index_t*   index,  /* in: index */
447
 
        const dtuple_t* tuple1, /* in: range start, may also be empty tuple */
448
 
        ulint           mode1,  /* in: search mode for range start */
449
 
        const dtuple_t* tuple2, /* in: range end, may also be empty tuple */
450
 
        ulint           mode2); /* in: search mode for range end */
451
 
/***********************************************************************
 
443
        dict_index_t*   index,  /*!< in: index */
 
444
        const dtuple_t* tuple1, /*!< in: range start, may also be empty tuple */
 
445
        ulint           mode1,  /*!< in: search mode for range start */
 
446
        const dtuple_t* tuple2, /*!< in: range end, may also be empty tuple */
 
447
        ulint           mode2); /*!< in: search mode for range end */
 
448
/*******************************************************************//**
452
449
Estimates the number of different key values in a given index, for
453
450
each n-column prefix of the index where n <= dict_index_get_n_unique(index).
454
451
The estimates are stored in the array index->stat_n_diff_key_vals. */
456
453
void
457
454
btr_estimate_number_of_different_key_vals(
458
455
/*======================================*/
459
 
        dict_index_t*   index); /* in: index */
460
 
/***********************************************************************
 
456
        dict_index_t*   index); /*!< in: index */
 
457
/*******************************************************************//**
461
458
Marks not updated extern fields as not-owned by this record. The ownership
462
459
is transferred to the updated record which is inserted elsewhere in the
463
460
index tree. In purge only the owner of externally stored field is allowed
466
463
void
467
464
btr_cur_mark_extern_inherited_fields(
468
465
/*=================================*/
469
 
        page_zip_des_t* page_zip,/* in/out: compressed page whose uncompressed
 
466
        page_zip_des_t* page_zip,/*!< in/out: compressed page whose uncompressed
470
467
                                part will be updated, or NULL */
471
 
        rec_t*          rec,    /* in/out: record in a clustered index */
472
 
        dict_index_t*   index,  /* in: index of the page */
473
 
        const ulint*    offsets,/* in: array returned by rec_get_offsets() */
474
 
        const upd_t*    update, /* in: update vector */
475
 
        mtr_t*          mtr);   /* in: mtr, or NULL if not logged */
476
 
/***********************************************************************
 
468
        rec_t*          rec,    /*!< in/out: record in a clustered index */
 
469
        dict_index_t*   index,  /*!< in: index of the page */
 
470
        const ulint*    offsets,/*!< in: array returned by rec_get_offsets() */
 
471
        const upd_t*    update, /*!< in: update vector */
 
472
        mtr_t*          mtr);   /*!< in: mtr, or NULL if not logged */
 
473
/*******************************************************************//**
477
474
The complement of the previous function: in an update entry may inherit
478
475
some externally stored fields from a record. We must mark them as inherited
479
476
in entry, so that they are not freed in a rollback. */
481
478
void
482
479
btr_cur_mark_dtuple_inherited_extern(
483
480
/*=================================*/
484
 
        dtuple_t*       entry,          /* in/out: updated entry to be
 
481
        dtuple_t*       entry,          /*!< in/out: updated entry to be
485
482
                                        inserted to clustered index */
486
 
        const upd_t*    update);        /* in: update vector */
487
 
/***********************************************************************
 
483
        const upd_t*    update);        /*!< in: update vector */
 
484
/*******************************************************************//**
488
485
Marks all extern fields in a dtuple as owned by the record. */
489
486
UNIV_INTERN
490
487
void
491
488
btr_cur_unmark_dtuple_extern_fields(
492
489
/*================================*/
493
 
        dtuple_t*       entry);         /* in/out: clustered index entry */
494
 
/***********************************************************************
 
490
        dtuple_t*       entry);         /*!< in/out: clustered index entry */
 
491
/*******************************************************************//**
495
492
Stores the fields in big_rec_vec to the tablespace and puts pointers to
496
493
them in rec.  The extern flags in rec will have to be set beforehand.
497
494
The fields are stored on pages allocated from leaf node
498
 
file segment of the index tree. */
 
495
file segment of the index tree.
 
496
@return DB_SUCCESS or error */
499
497
UNIV_INTERN
500
498
ulint
501
499
btr_store_big_rec_extern_fields(
502
500
/*============================*/
503
 
                                        /* out: DB_SUCCESS or error */
504
 
        dict_index_t*   index,          /* in: index of rec; the index tree
 
501
        dict_index_t*   index,          /*!< in: index of rec; the index tree
505
502
                                        MUST be X-latched */
506
 
        buf_block_t*    rec_block,      /* in/out: block containing rec */
507
 
        rec_t*          rec,            /* in: record */
508
 
        const ulint*    offsets,        /* in: rec_get_offsets(rec, index);
 
503
        buf_block_t*    rec_block,      /*!< in/out: block containing rec */
 
504
        rec_t*          rec,            /*!< in: record */
 
505
        const ulint*    offsets,        /*!< in: rec_get_offsets(rec, index);
509
506
                                        the "external storage" flags in offsets
510
507
                                        will not correspond to rec when
511
508
                                        this function returns */
512
 
        big_rec_t*      big_rec_vec,    /* in: vector containing fields
 
509
        big_rec_t*      big_rec_vec,    /*!< in: vector containing fields
513
510
                                        to be stored externally */
514
 
        mtr_t*          local_mtr);     /* in: mtr containing the latch to
 
511
        mtr_t*          local_mtr);     /*!< in: mtr containing the latch to
515
512
                                        rec and to the tree */
516
 
/***********************************************************************
 
513
/*******************************************************************//**
517
514
Frees the space in an externally stored field to the file space
518
515
management if the field in data is owned the externally stored field,
519
516
in a rollback we may have the additional condition that the field must
522
519
void
523
520
btr_free_externally_stored_field(
524
521
/*=============================*/
525
 
        dict_index_t*   index,          /* in: index of the data, the index
 
522
        dict_index_t*   index,          /*!< in: index of the data, the index
526
523
                                        tree MUST be X-latched; if the tree
527
524
                                        height is 1, then also the root page
528
525
                                        must be X-latched! (this is relevant
530
527
                                        from purge where 'data' is located on
531
528
                                        an undo log page, not an index
532
529
                                        page) */
533
 
        byte*           field_ref,      /* in/out: field reference */
534
 
        const rec_t*    rec,            /* in: record containing field_ref, for
 
530
        byte*           field_ref,      /*!< in/out: field reference */
 
531
        const rec_t*    rec,            /*!< in: record containing field_ref, for
535
532
                                        page_zip_write_blob_ptr(), or NULL */
536
 
        const ulint*    offsets,        /* in: rec_get_offsets(rec, index),
 
533
        const ulint*    offsets,        /*!< in: rec_get_offsets(rec, index),
537
534
                                        or NULL */
538
 
        page_zip_des_t* page_zip,       /* in: compressed page corresponding
 
535
        page_zip_des_t* page_zip,       /*!< in: compressed page corresponding
539
536
                                        to rec, or NULL if rec == NULL */
540
 
        ulint           i,              /* in: field number of field_ref;
 
537
        ulint           i,              /*!< in: field number of field_ref;
541
538
                                        ignored if rec == NULL */
542
 
        enum trx_rb_ctx rb_ctx,         /* in: rollback context */
543
 
        mtr_t*          local_mtr);     /* in: mtr containing the latch to
 
539
        enum trx_rb_ctx rb_ctx,         /*!< in: rollback context */
 
540
        mtr_t*          local_mtr);     /*!< in: mtr containing the latch to
544
541
                                        data an an X-latch to the index
545
542
                                        tree */
546
 
/***********************************************************************
 
543
/*******************************************************************//**
547
544
Copies the prefix of an externally stored field of a record.  The
548
 
clustered index record must be protected by a lock or a page latch. */
 
545
clustered index record must be protected by a lock or a page latch.
 
546
@return the length of the copied field, or 0 if the column was being
 
547
or has been deleted */
549
548
UNIV_INTERN
550
549
ulint
551
550
btr_copy_externally_stored_field_prefix(
552
551
/*====================================*/
553
 
                                /* out: the length of the copied field,
554
 
                                or 0 if the column is being or has been
555
 
                                deleted */
556
 
        byte*           buf,    /* out: the field, or a prefix of it */
557
 
        ulint           len,    /* in: length of buf, in bytes */
558
 
        ulint           zip_size,/* in: nonzero=compressed BLOB page size,
 
552
        byte*           buf,    /*!< out: the field, or a prefix of it */
 
553
        ulint           len,    /*!< in: length of buf, in bytes */
 
554
        ulint           zip_size,/*!< in: nonzero=compressed BLOB page size,
559
555
                                zero for uncompressed BLOBs */
560
 
        const byte*     data,   /* in: 'internally' stored part of the
 
556
        const byte*     data,   /*!< in: 'internally' stored part of the
561
557
                                field containing also the reference to
562
558
                                the external part; must be protected by
563
559
                                a lock or a page latch */
564
 
        ulint           local_len);/* in: length of data, in bytes */
565
 
/***********************************************************************
566
 
Copies an externally stored field of a record to mem heap. */
 
560
        ulint           local_len);/*!< in: length of data, in bytes */
 
561
/*******************************************************************//**
 
562
Copies an externally stored field of a record to mem heap.
 
563
@return the field copied to heap */
567
564
UNIV_INTERN
568
565
byte*
569
566
btr_rec_copy_externally_stored_field(
570
567
/*=================================*/
571
 
                                /* out: the field copied to heap */
572
 
        const rec_t*    rec,    /* in: record in a clustered index;
 
568
        const rec_t*    rec,    /*!< in: record in a clustered index;
573
569
                                must be protected by a lock or a page latch */
574
 
        const ulint*    offsets,/* in: array returned by rec_get_offsets() */
575
 
        ulint           zip_size,/* in: nonzero=compressed BLOB page size,
 
570
        const ulint*    offsets,/*!< in: array returned by rec_get_offsets() */
 
571
        ulint           zip_size,/*!< in: nonzero=compressed BLOB page size,
576
572
                                zero for uncompressed BLOBs */
577
 
        ulint           no,     /* in: field number */
578
 
        ulint*          len,    /* out: length of the field */
579
 
        mem_heap_t*     heap);  /* in: mem heap */
580
 
/***********************************************************************
 
573
        ulint           no,     /*!< in: field number */
 
574
        ulint*          len,    /*!< out: length of the field */
 
575
        mem_heap_t*     heap);  /*!< in: mem heap */
 
576
/*******************************************************************//**
581
577
Flags the data tuple fields that are marked as extern storage in the
582
578
update vector.  We use this function to remember which fields we must
583
 
mark as extern storage in a record inserted for an update. */
 
579
mark as extern storage in a record inserted for an update.
 
580
@return number of flagged external columns */
584
581
UNIV_INTERN
585
582
ulint
586
583
btr_push_update_extern_fields(
587
584
/*==========================*/
588
 
                                /* out: number of flagged external columns */
589
 
        dtuple_t*       tuple,  /* in/out: data tuple */
590
 
        const upd_t*    update, /* in: update vector */
591
 
        mem_heap_t*     heap)   /* in: memory heap */
 
585
        dtuple_t*       tuple,  /*!< in/out: data tuple */
 
586
        const upd_t*    update, /*!< in: update vector */
 
587
        mem_heap_t*     heap)   /*!< in: memory heap */
592
588
        __attribute__((nonnull));
593
589
 
594
590
/*######################################################################*/
595
591
 
596
 
/* In the pessimistic delete, if the page data size drops below this
 
592
/** In the pessimistic delete, if the page data size drops below this
597
593
limit, merging it to a neighbor is tried */
598
 
 
599
594
#define BTR_CUR_PAGE_COMPRESS_LIMIT     (UNIV_PAGE_SIZE / 2)
600
595
 
601
 
/* A slot in the path array. We store here info on a search path down the
 
596
/** A slot in the path array. We store here info on a search path down the
602
597
tree. Each slot contains data on a single level of the tree. */
603
598
 
604
599
typedef struct btr_path_struct  btr_path_t;
605
600
struct btr_path_struct{
606
 
        ulint   nth_rec;        /* index of the record
 
601
        ulint   nth_rec;        /*!< index of the record
607
602
                                where the page cursor stopped on
608
603
                                this level (index in alphabetical
609
604
                                order); value ULINT_UNDEFINED
610
605
                                denotes array end */
611
 
        ulint   n_recs;         /* number of records on the page */
612
 
};
613
 
 
614
 
#define BTR_PATH_ARRAY_N_SLOTS  250     /* size of path array (in slots) */
615
 
 
616
 
/* The tree cursor: the definition appears here only for the compiler
 
606
        ulint   n_recs;         /*!< number of records on the page */
 
607
};
 
608
 
 
609
#define BTR_PATH_ARRAY_N_SLOTS  250     /*!< size of path array (in slots) */
 
610
 
 
611
/** Values for the flag documenting the used search method */
 
612
enum btr_cur_method {
 
613
        BTR_CUR_HASH = 1,       /*!< successful shortcut using
 
614
                                the hash index */
 
615
        BTR_CUR_HASH_FAIL,      /*!< failure using hash, success using
 
616
                                binary search: the misleading hash
 
617
                                reference is stored in the field
 
618
                                hash_node, and might be necessary to
 
619
                                update */
 
620
        BTR_CUR_BINARY,         /*!< success using the binary search */
 
621
        BTR_CUR_INSERT_TO_IBUF, /*!< performed the intended insert to
 
622
                                the insert buffer */
 
623
};
 
624
 
 
625
/** The tree cursor: the definition appears here only for the compiler
617
626
to know struct size! */
618
 
 
619
627
struct btr_cur_struct {
620
 
        dict_index_t*   index;          /* index where positioned */
621
 
        page_cur_t      page_cur;       /* page cursor */
622
 
        buf_block_t*    left_block;     /* this field is used to store
 
628
        dict_index_t*   index;          /*!< index where positioned */
 
629
        page_cur_t      page_cur;       /*!< page cursor */
 
630
        buf_block_t*    left_block;     /*!< this field is used to store
623
631
                                        a pointer to the left neighbor
624
632
                                        page, in the cases
625
633
                                        BTR_SEARCH_PREV and
626
634
                                        BTR_MODIFY_PREV */
627
635
        /*------------------------------*/
628
 
        que_thr_t*      thr;            /* this field is only used when
629
 
                                        btr_cur_search_... is called for an
630
 
                                        index entry insertion: the calling
631
 
                                        query thread is passed here to be
 
636
        que_thr_t*      thr;            /*!< this field is only used
 
637
                                        when btr_cur_search_to_nth_level
 
638
                                        is called for an index entry
 
639
                                        insertion: the calling query
 
640
                                        thread is passed here to be
632
641
                                        used in the insert buffer */
633
642
        /*------------------------------*/
634
 
        /* The following fields are used in btr_cur_search... to pass
635
 
        information: */
636
 
        ulint           flag;           /* BTR_CUR_HASH, BTR_CUR_HASH_FAIL,
637
 
                                        BTR_CUR_BINARY, or
638
 
                                        BTR_CUR_INSERT_TO_IBUF */
639
 
        ulint           tree_height;    /* Tree height if the search is done
 
643
        /** The following fields are used in
 
644
        btr_cur_search_to_nth_level to pass information: */
 
645
        /* @{ */
 
646
        enum btr_cur_method     flag;   /*!< Search method used */
 
647
        ulint           tree_height;    /*!< Tree height if the search is done
640
648
                                        for a pessimistic insert or update
641
649
                                        operation */
642
 
        ulint           up_match;       /* If the search mode was PAGE_CUR_LE,
 
650
        ulint           up_match;       /*!< If the search mode was PAGE_CUR_LE,
643
651
                                        the number of matched fields to the
644
652
                                        the first user record to the right of
645
653
                                        the cursor record after
646
 
                                        btr_cur_search_...;
 
654
                                        btr_cur_search_to_nth_level;
647
655
                                        for the mode PAGE_CUR_GE, the matched
648
656
                                        fields to the first user record AT THE
649
657
                                        CURSOR or to the right of it;
653
661
                                        record if that record is on a
654
662
                                        different leaf page! (See the note in
655
663
                                        row_ins_duplicate_key.) */
656
 
        ulint           up_bytes;       /* number of matched bytes to the
 
664
        ulint           up_bytes;       /*!< number of matched bytes to the
657
665
                                        right at the time cursor positioned;
658
666
                                        only used internally in searches: not
659
667
                                        defined after the search */
660
 
        ulint           low_match;      /* if search mode was PAGE_CUR_LE,
 
668
        ulint           low_match;      /*!< if search mode was PAGE_CUR_LE,
661
669
                                        the number of matched fields to the
662
670
                                        first user record AT THE CURSOR or
663
671
                                        to the left of it after
664
 
                                        btr_cur_search_...;
 
672
                                        btr_cur_search_to_nth_level;
665
673
                                        NOT defined for PAGE_CUR_GE or any
666
674
                                        other search modes; see also the NOTE
667
675
                                        in up_match! */
668
 
        ulint           low_bytes;      /* number of matched bytes to the
 
676
        ulint           low_bytes;      /*!< number of matched bytes to the
669
677
                                        right at the time cursor positioned;
670
678
                                        only used internally in searches: not
671
679
                                        defined after the search */
672
 
        ulint           n_fields;       /* prefix length used in a hash
 
680
        ulint           n_fields;       /*!< prefix length used in a hash
673
681
                                        search if hash_node != NULL */
674
 
        ulint           n_bytes;        /* hash prefix bytes if hash_node !=
 
682
        ulint           n_bytes;        /*!< hash prefix bytes if hash_node !=
675
683
                                        NULL */
676
 
        ulint           fold;           /* fold value used in the search if
 
684
        ulint           fold;           /*!< fold value used in the search if
677
685
                                        flag is BTR_CUR_HASH */
678
686
        /*------------------------------*/
679
 
        btr_path_t*     path_arr;       /* in estimating the number of
 
687
        /* @} */
 
688
        btr_path_t*     path_arr;       /*!< in estimating the number of
680
689
                                        rows in range, we store in this array
681
690
                                        information of the path through
682
691
                                        the tree */
683
692
};
684
693
 
685
 
/* Values for the flag documenting the used search method */
686
 
#define BTR_CUR_HASH            1       /* successful shortcut using the hash
687
 
                                        index */
688
 
#define BTR_CUR_HASH_FAIL       2       /* failure using hash, success using
689
 
                                        binary search: the misleading hash
690
 
                                        reference is stored in the field
691
 
                                        hash_node, and might be necessary to
692
 
                                        update */
693
 
#define BTR_CUR_BINARY          3       /* success using the binary search */
694
 
#define BTR_CUR_INSERT_TO_IBUF  4       /* performed the intended insert to
695
 
                                        the insert buffer */
696
 
 
697
 
/* If pessimistic delete fails because of lack of file space,
698
 
there is still a good change of success a little later: try this many times,
699
 
and sleep this many microseconds in between */
 
694
/** If pessimistic delete fails because of lack of file space, there
 
695
is still a good change of success a little later.  Try this many
 
696
times. */
700
697
#define BTR_CUR_RETRY_DELETE_N_TIMES    100
 
698
/** If pessimistic delete fails because of lack of file space, there
 
699
is still a good change of success a little later.  Sleep this many
 
700
microseconds between retries. */
701
701
#define BTR_CUR_RETRY_SLEEP_TIME        50000
702
702
 
703
 
/* The reference in a field for which data is stored on a different page.
 
703
/** The reference in a field for which data is stored on a different page.
704
704
The reference is at the end of the 'locally' stored part of the field.
705
705
'Locally' means storage in the index record.
706
706
We store locally a long enough prefix of each column so that we can determine
707
707
the ordering parts of each index record without looking into the externally
708
708
stored part. */
709
 
 
710
 
/*--------------------------------------*/
711
 
#define BTR_EXTERN_SPACE_ID             0       /* space id where stored */
712
 
#define BTR_EXTERN_PAGE_NO              4       /* page no where stored */
713
 
#define BTR_EXTERN_OFFSET               8       /* offset of BLOB header
 
709
/*-------------------------------------- @{ */
 
710
#define BTR_EXTERN_SPACE_ID             0       /*!< space id where stored */
 
711
#define BTR_EXTERN_PAGE_NO              4       /*!< page no where stored */
 
712
#define BTR_EXTERN_OFFSET               8       /*!< offset of BLOB header
714
713
                                                on that page */
715
 
#define BTR_EXTERN_LEN                  12      /* 8 bytes containing the
 
714
#define BTR_EXTERN_LEN                  12      /*!< 8 bytes containing the
716
715
                                                length of the externally
717
716
                                                stored part of the BLOB.
718
717
                                                The 2 highest bits are
719
718
                                                reserved to the flags below. */
720
 
/*--------------------------------------*/
 
719
/*-------------------------------------- @} */
721
720
/* #define BTR_EXTERN_FIELD_REF_SIZE    20 // moved to btr0types.h */
722
721
 
723
 
/* The highest bit of BTR_EXTERN_LEN (i.e., the highest bit of the byte
724
 
at lowest address) is set to 1 if this field does not 'own' the externally
725
 
stored field; only the owner field is allowed to free the field in purge!
726
 
If the 2nd highest bit is 1 then it means that the externally stored field
727
 
was inherited from an earlier version of the row. In rollback we are not
728
 
allowed to free an inherited external field. */
729
 
 
 
722
/** The most significant bit of BTR_EXTERN_LEN (i.e., the most
 
723
significant bit of the byte at smallest address) is set to 1 if this
 
724
field does not 'own' the externally stored field; only the owner field
 
725
is allowed to free the field in purge! */
730
726
#define BTR_EXTERN_OWNER_FLAG           128
 
727
/** If the second most significant bit of BTR_EXTERN_LEN (i.e., the
 
728
second most significant bit of the byte at smallest address) is 1 then
 
729
it means that the externally stored field was inherited from an
 
730
earlier version of the row.  In rollback we are not allowed to free an
 
731
inherited external field. */
731
732
#define BTR_EXTERN_INHERITED_FLAG       64
732
733
 
 
734
/** Number of searches down the B-tree in btr_cur_search_to_nth_level(). */
733
735
extern ulint    btr_cur_n_non_sea;
 
736
/** Number of successful adaptive hash index lookups in
 
737
btr_cur_search_to_nth_level(). */
734
738
extern ulint    btr_cur_n_sea;
 
739
/** Old value of btr_cur_n_non_sea.  Copied by
 
740
srv_refresh_innodb_monitor_stats().  Referenced by
 
741
srv_printf_innodb_monitor(). */
735
742
extern ulint    btr_cur_n_non_sea_old;
 
743
/** Old value of btr_cur_n_sea.  Copied by
 
744
srv_refresh_innodb_monitor_stats().  Referenced by
 
745
srv_printf_innodb_monitor(). */
736
746
extern ulint    btr_cur_n_sea_old;
 
747
#endif /* !UNIV_HOTBACKUP */
737
748
 
738
749
#ifndef UNIV_NONINL
739
750
#include "btr0cur.ic"