~drizzle-trunk/drizzle/development

641.2.2 by Monty Taylor
InnoDB Plugin 1.0.3
1
/*****************************************************************************
2
3
Copyright (c) 1994, 2009, Innobase Oy. All Rights Reserved.
4
5
This program is free software; you can redistribute it and/or modify it under
6
the terms of the GNU General Public License as published by the Free Software
7
Foundation; version 2 of the License.
8
9
This program is distributed in the hope that it will be useful, but WITHOUT
10
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
13
You should have received a copy of the GNU General Public License along with
14
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
15
Place, Suite 330, Boston, MA 02111-1307 USA
16
17
*****************************************************************************/
18
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
19
/**************************************************//**
20
@file include/btr0btr.ic
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
21
The B-tree
22
23
Created 6/2/1994 Heikki Tuuri
24
*******************************************************/
25
26
#include "mach0data.h"
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
27
#ifndef UNIV_HOTBACKUP
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
28
#include "mtr0mtr.h"
29
#include "mtr0log.h"
30
#include "page0zip.h"
31
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
32
#define BTR_MAX_NODE_LEVEL	50	/*!< Maximum B-tree page level
33
					(not really a hard limit).
34
					Used in debug assertions
35
					in btr_page_set_level and
36
					btr_page_get_level_low */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
37
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
38
/**************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
39
Gets a buffer page and declares its latching order level. */
40
UNIV_INLINE
41
buf_block_t*
42
btr_block_get(
43
/*==========*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
44
	ulint	space,		/*!< in: space id */
45
	ulint	zip_size,	/*!< in: compressed page size in bytes
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
46
				or 0 for uncompressed pages */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
47
	ulint	page_no,	/*!< in: page number */
48
	ulint	mode,		/*!< in: latch mode */
49
	mtr_t*	mtr)		/*!< in: mtr */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
50
{
51
	buf_block_t*	block;
52
53
	block = buf_page_get(space, zip_size, page_no, mode, mtr);
641.2.1 by Monty Taylor
InnoDB Plugin 1.0.2
54
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
55
	if (mode != RW_NO_LATCH) {
56
57
		buf_block_dbg_add_level(block, SYNC_TREE_NODE);
58
	}
641.2.1 by Monty Taylor
InnoDB Plugin 1.0.2
59
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
60
	return(block);
61
}
62
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
63
/**************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
64
Gets a buffer page and declares its latching order level. */
65
UNIV_INLINE
66
page_t*
67
btr_page_get(
68
/*=========*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
69
	ulint	space,		/*!< in: space id */
70
	ulint	zip_size,	/*!< in: compressed page size in bytes
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
71
				or 0 for uncompressed pages */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
72
	ulint	page_no,	/*!< in: page number */
73
	ulint	mode,		/*!< in: latch mode */
74
	mtr_t*	mtr)		/*!< in: mtr */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
75
{
76
	return(buf_block_get_frame(btr_block_get(space, zip_size, page_no,
77
						 mode, mtr)));
78
}
79
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
80
/**************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
81
Sets the index id field of a page. */
82
UNIV_INLINE
83
void
84
btr_page_set_index_id(
85
/*==================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
86
	page_t*		page,	/*!< in: page to be created */
87
	page_zip_des_t*	page_zip,/*!< in: compressed page whose uncompressed
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
88
				part will be updated, or NULL */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
89
	dulint		id,	/*!< in: index id */
90
	mtr_t*		mtr)	/*!< in: mtr */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
91
{
92
	if (UNIV_LIKELY_NULL(page_zip)) {
93
		mach_write_to_8(page + (PAGE_HEADER + PAGE_INDEX_ID), id);
94
		page_zip_write_header(page_zip,
95
				      page + (PAGE_HEADER + PAGE_INDEX_ID),
96
				      8, mtr);
97
	} else {
98
		mlog_write_dulint(page + (PAGE_HEADER + PAGE_INDEX_ID),
99
				  id, mtr);
100
	}
101
}
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
102
#endif /* !UNIV_HOTBACKUP */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
103
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
104
/**************************************************************//**
105
Gets the index id field of a page.
106
@return	index id */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
107
UNIV_INLINE
108
dulint
109
btr_page_get_index_id(
110
/*==================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
111
	const page_t*	page)	/*!< in: index page */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
112
{
113
	return(mach_read_from_8(page + PAGE_HEADER + PAGE_INDEX_ID));
114
}
115
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
116
#ifndef UNIV_HOTBACKUP
117
/********************************************************//**
118
Gets the node level field in an index page.
119
@return	level, leaf level == 0 */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
120
UNIV_INLINE
121
ulint
122
btr_page_get_level_low(
123
/*===================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
124
	const page_t*	page)	/*!< in: index page */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
125
{
126
	ulint	level;
127
128
	ut_ad(page);
129
130
	level = mach_read_from_2(page + PAGE_HEADER + PAGE_LEVEL);
131
132
	ut_ad(level <= BTR_MAX_NODE_LEVEL);
133
134
	return(level);
135
}
136
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
137
/********************************************************//**
138
Gets the node level field in an index page.
139
@return	level, leaf level == 0 */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
140
UNIV_INLINE
141
ulint
142
btr_page_get_level(
143
/*===============*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
144
	const page_t*	page,	/*!< in: index page */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
145
	mtr_t*		mtr __attribute__((unused)))
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
146
				/*!< in: mini-transaction handle */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
147
{
1182.1.3 by Monty Taylor
Fixed solaris build errors in InnoDB
148
	(void)mtr;
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
149
	ut_ad(page && mtr);
150
151
	return(btr_page_get_level_low(page));
152
}
153
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
154
/********************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
155
Sets the node level field in an index page. */
156
UNIV_INLINE
157
void
158
btr_page_set_level(
159
/*===============*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
160
	page_t*		page,	/*!< in: index page */
161
	page_zip_des_t*	page_zip,/*!< in: compressed page whose uncompressed
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
162
				part will be updated, or NULL */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
163
	ulint		level,	/*!< in: level, leaf level == 0 */
164
	mtr_t*		mtr)	/*!< in: mini-transaction handle */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
165
{
166
	ut_ad(page && mtr);
167
	ut_ad(level <= BTR_MAX_NODE_LEVEL);
168
169
	if (UNIV_LIKELY_NULL(page_zip)) {
170
		mach_write_to_2(page + (PAGE_HEADER + PAGE_LEVEL), level);
171
		page_zip_write_header(page_zip,
172
				      page + (PAGE_HEADER + PAGE_LEVEL),
173
				      2, mtr);
174
	} else {
175
		mlog_write_ulint(page + (PAGE_HEADER + PAGE_LEVEL), level,
176
				 MLOG_2BYTES, mtr);
177
	}
178
}
179
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
180
/********************************************************//**
181
Gets the next index page number.
182
@return	next page number */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
183
UNIV_INLINE
184
ulint
185
btr_page_get_next(
186
/*==============*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
187
	const page_t*	page,	/*!< in: index page */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
188
	mtr_t*		mtr __attribute__((unused)))
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
189
				/*!< in: mini-transaction handle */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
190
{
1182.1.3 by Monty Taylor
Fixed solaris build errors in InnoDB
191
	(void)mtr;
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
192
	ut_ad(page && mtr);
193
	ut_ad(mtr_memo_contains_page(mtr, page, MTR_MEMO_PAGE_X_FIX)
194
	      || mtr_memo_contains_page(mtr, page, MTR_MEMO_PAGE_S_FIX));
195
196
	return(mach_read_from_4(page + FIL_PAGE_NEXT));
197
}
198
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
199
/********************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
200
Sets the next index page field. */
201
UNIV_INLINE
202
void
203
btr_page_set_next(
204
/*==============*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
205
	page_t*		page,	/*!< in: index page */
206
	page_zip_des_t*	page_zip,/*!< in: compressed page whose uncompressed
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
207
				part will be updated, or NULL */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
208
	ulint		next,	/*!< in: next page number */
209
	mtr_t*		mtr)	/*!< in: mini-transaction handle */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
210
{
211
	ut_ad(page && mtr);
212
213
	if (UNIV_LIKELY_NULL(page_zip)) {
214
		mach_write_to_4(page + FIL_PAGE_NEXT, next);
215
		page_zip_write_header(page_zip, page + FIL_PAGE_NEXT, 4, mtr);
216
	} else {
217
		mlog_write_ulint(page + FIL_PAGE_NEXT, next, MLOG_4BYTES, mtr);
218
	}
219
}
220
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
221
/********************************************************//**
222
Gets the previous index page number.
223
@return	prev page number */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
224
UNIV_INLINE
225
ulint
226
btr_page_get_prev(
227
/*==============*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
228
	const page_t*	page,	/*!< in: index page */
229
	mtr_t*	mtr __attribute__((unused))) /*!< in: mini-transaction handle */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
230
{
1182.1.3 by Monty Taylor
Fixed solaris build errors in InnoDB
231
	(void)mtr;
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
232
	ut_ad(page && mtr);
233
234
	return(mach_read_from_4(page + FIL_PAGE_PREV));
235
}
236
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
237
/********************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
238
Sets the previous index page field. */
239
UNIV_INLINE
240
void
241
btr_page_set_prev(
242
/*==============*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
243
	page_t*		page,	/*!< in: index page */
244
	page_zip_des_t*	page_zip,/*!< in: compressed page whose uncompressed
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
245
				part will be updated, or NULL */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
246
	ulint		prev,	/*!< in: previous page number */
247
	mtr_t*		mtr)	/*!< in: mini-transaction handle */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
248
{
249
	ut_ad(page && mtr);
250
251
	if (UNIV_LIKELY_NULL(page_zip)) {
252
		mach_write_to_4(page + FIL_PAGE_PREV, prev);
253
		page_zip_write_header(page_zip, page + FIL_PAGE_PREV, 4, mtr);
254
	} else {
255
		mlog_write_ulint(page + FIL_PAGE_PREV, prev, MLOG_4BYTES, mtr);
256
	}
257
}
258
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
259
/**************************************************************//**
260
Gets the child node file address in a node pointer.
261
@return	child node address */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
262
UNIV_INLINE
263
ulint
264
btr_node_ptr_get_child_page_no(
265
/*===========================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
266
	const rec_t*	rec,	/*!< in: node pointer record */
267
	const ulint*	offsets)/*!< in: array returned by rec_get_offsets() */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
268
{
269
	const byte*	field;
270
	ulint		len;
271
	ulint		page_no;
272
273
	ut_ad(!rec_offs_comp(offsets) || rec_get_node_ptr_flag(rec));
274
275
	/* The child address is in the last field */
276
	field = rec_get_nth_field(rec, offsets,
277
				  rec_offs_n_fields(offsets) - 1, &len);
278
279
	ut_ad(len == 4);
280
281
	page_no = mach_read_from_4(field);
282
283
	if (UNIV_UNLIKELY(page_no == 0)) {
284
		fprintf(stderr,
285
			"InnoDB: a nonsensical page number 0"
286
			" in a node ptr record at offset %lu\n",
287
			(ulong) page_offset(rec));
288
		buf_page_print(page_align(rec), 0);
289
	}
290
291
	return(page_no);
292
}
293
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
294
/**************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
295
Releases the latches on a leaf page and bufferunfixes it. */
296
UNIV_INLINE
297
void
298
btr_leaf_page_release(
299
/*==================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
300
	buf_block_t*	block,		/*!< in: buffer block */
301
	ulint		latch_mode,	/*!< in: BTR_SEARCH_LEAF or
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
302
					BTR_MODIFY_LEAF */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
303
	mtr_t*		mtr)		/*!< in: mtr */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
304
{
305
	ut_ad(latch_mode == BTR_SEARCH_LEAF || latch_mode == BTR_MODIFY_LEAF);
306
	ut_ad(!mtr_memo_contains(mtr, block, MTR_MEMO_MODIFY));
307
308
	mtr_memo_release(mtr, block,
309
			 latch_mode == BTR_SEARCH_LEAF
310
			 ? MTR_MEMO_PAGE_S_FIX
311
			 : MTR_MEMO_PAGE_X_FIX);
312
}
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
313
#endif /* !UNIV_HOTBACKUP */