page0page.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:23k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Index page routines
  3. (c) 1994-1996 Innobase Oy
  4. Created 2/2/1994 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef page0page_h
  7. #define page0page_h
  8. #include "univ.i"
  9. #include "page0types.h"
  10. #include "fil0fil.h"
  11. #include "buf0buf.h"
  12. #include "data0data.h"
  13. #include "dict0dict.h"
  14. #include "rem0rec.h"
  15. #include "fsp0fsp.h"
  16. #include "mtr0mtr.h"
  17. #ifdef UNIV_MATERIALIZE
  18. #undef UNIV_INLINE
  19. #define UNIV_INLINE
  20. #endif
  21. /* PAGE HEADER
  22. ===========
  23. Index page header starts at the first offset left free by the FIL-module */
  24. typedef byte page_header_t;
  25. #define PAGE_HEADER FSEG_PAGE_DATA /* index page header starts at this
  26. offset */
  27. /*-----------------------------*/
  28. #define PAGE_N_DIR_SLOTS 0 /* number of slots in page directory */
  29. #define PAGE_HEAP_TOP  2 /* pointer to record heap top */
  30. #define PAGE_N_HEAP  4 /* number of records in the heap */
  31. #define PAGE_FREE  6 /* pointer to start of page free record list */
  32. #define PAGE_GARBAGE  8 /* number of bytes in deleted records */
  33. #define PAGE_LAST_INSERT 10 /* pointer to the last inserted record, or
  34. NULL if this info has been reset by a delete,
  35. for example */
  36. #define PAGE_DIRECTION  12 /* last insert direction: PAGE_LEFT, ... */
  37. #define PAGE_N_DIRECTION 14 /* number of consecutive inserts to the same
  38. direction */
  39. #define PAGE_N_RECS  16 /* number of user records on the page */
  40. #define PAGE_MAX_TRX_ID  18 /* highest id of a trx which may have modified
  41. a record on the page; a dulint; defined only
  42. in secondary indexes; specifically, not in an
  43. ibuf tree; NOTE: this may be modified only
  44. when the thread has an x-latch to the page,
  45. and ALSO an x-latch to btr_search_latch
  46. if there is a hash index to the page! */
  47. #define PAGE_HEADER_PRIV_END 26 /* end of private data structure of the page
  48. header which are set in a page create */
  49. /*----*/
  50. #define PAGE_LEVEL  26 /* level of the node in an index tree; the
  51. leaf level is the level 0 */
  52. #define PAGE_INDEX_ID  28 /* index id where the page belongs */
  53. #define PAGE_BTR_SEG_LEAF 36 /* file segment header for the leaf pages in
  54. a B-tree: defined only on the root page of a
  55. B-tree, but not in the root of an ibuf tree */
  56. #define PAGE_BTR_IBUF_FREE_LIST PAGE_BTR_SEG_LEAF
  57. #define PAGE_BTR_IBUF_FREE_LIST_NODE PAGE_BTR_SEG_LEAF
  58. /* in the place of PAGE_BTR_SEG_LEAF and _TOP
  59. there is a free list base node if the page is
  60. the root page of an ibuf tree, and at the same
  61. place is the free list node if the page is in
  62. a free list */
  63. #define PAGE_BTR_SEG_TOP (36 + FSEG_HEADER_SIZE)
  64. /* file segment header for the non-leaf pages
  65. in a B-tree: defined only on the root page of
  66. a B-tree, but not in the root of an ibuf
  67. tree */
  68. /*----*/
  69. #define PAGE_DATA (PAGE_HEADER + 36 + 2 * FSEG_HEADER_SIZE)
  70. /* start of data on the page */
  71. #define PAGE_INFIMUM (PAGE_DATA + 1 + REC_N_EXTRA_BYTES)
  72. /* offset of the page infimum record on the
  73. page */
  74. #define PAGE_SUPREMUM (PAGE_DATA + 2 + 2 * REC_N_EXTRA_BYTES + 8)
  75. /* offset of the page supremum record on the
  76. page */
  77. #define PAGE_SUPREMUM_END (PAGE_SUPREMUM + 9)
  78. /* offset of the page supremum record end on
  79. the page */
  80. /*-----------------------------*/
  81. /* Directions of cursor movement */
  82. #define PAGE_LEFT 1
  83. #define PAGE_RIGHT 2
  84. #define PAGE_SAME_REC 3
  85. #define PAGE_SAME_PAGE 4
  86. #define PAGE_NO_DIRECTION 5
  87. /* PAGE DIRECTORY
  88. ==============
  89. */
  90. typedef byte page_dir_slot_t;
  91. typedef page_dir_slot_t page_dir_t;
  92. /* Offset of the directory start down from the page end. We call the
  93. slot with the highest file address directory start, as it points to 
  94. the first record in the list of records. */
  95. #define PAGE_DIR FIL_PAGE_DATA_END
  96. /* We define a slot in the page directory as two bytes */
  97. #define PAGE_DIR_SLOT_SIZE 2
  98. /* The offset of the physically lower end of the directory, counted from
  99. page end, when the page is empty */
  100. #define PAGE_EMPTY_DIR_START (PAGE_DIR + 2 * PAGE_DIR_SLOT_SIZE)
  101. /* The maximum and minimum number of records owned by a directory slot. The
  102. number may drop below the minimum in the first and the last slot in the 
  103. directory. */
  104. #define PAGE_DIR_SLOT_MAX_N_OWNED 8
  105. #define PAGE_DIR_SLOT_MIN_N_OWNED 4
  106. /*****************************************************************
  107. Returns the max trx id field value. */
  108. UNIV_INLINE
  109. dulint
  110. page_get_max_trx_id(
  111. /*================*/
  112. page_t* page); /* in: page */
  113. /*****************************************************************
  114. Sets the max trx id field value. */
  115. void
  116. page_set_max_trx_id(
  117. /*================*/
  118. page_t* page, /* in: page */
  119. dulint trx_id);/* in: transaction id */
  120. /*****************************************************************
  121. Sets the max trx id field value if trx_id is bigger than the previous
  122. value. */
  123. UNIV_INLINE
  124. void
  125. page_update_max_trx_id(
  126. /*===================*/
  127. page_t* page, /* in: page */
  128. dulint trx_id); /* in: transaction id */
  129. /*****************************************************************
  130. Reads the given header field. */
  131. UNIV_INLINE
  132. ulint
  133. page_header_get_field(
  134. /*==================*/
  135. page_t* page, /* in: page */
  136. ulint field); /* in: PAGE_N_DIR_SLOTS, ... */
  137. /*****************************************************************
  138. Sets the given header field. */
  139. UNIV_INLINE
  140. void
  141. page_header_set_field(
  142. /*==================*/
  143. page_t* page, /* in: page */
  144. ulint field, /* in: PAGE_N_DIR_SLOTS, ... */
  145. ulint val); /* in: value */
  146. /*****************************************************************
  147. Returns the pointer stored in the given header field. */
  148. UNIV_INLINE
  149. byte*
  150. page_header_get_ptr(
  151. /*================*/
  152. /* out: pointer or NULL */
  153. page_t* page, /* in: page */
  154. ulint field); /* in: PAGE_FREE, ... */
  155. /*****************************************************************
  156. Sets the pointer stored in the given header field. */
  157. UNIV_INLINE
  158. void
  159. page_header_set_ptr(
  160. /*================*/
  161. page_t* page, /* in: page */
  162. ulint field, /* in: PAGE_FREE, ... */
  163. byte* ptr); /* in: pointer or NULL*/
  164. /*****************************************************************
  165. Resets the last insert info field in the page header. Writes to mlog
  166. about this operation. */
  167. UNIV_INLINE
  168. void
  169. page_header_reset_last_insert(
  170. /*==========================*/
  171. page_t* page, /* in: page */
  172. mtr_t* mtr); /* in: mtr */
  173. /****************************************************************
  174. Gets the first record on the page. */
  175. UNIV_INLINE
  176. rec_t*
  177. page_get_infimum_rec(
  178. /*=================*/
  179. /* out: the first record in record list */
  180. page_t* page); /* in: page which must have record(s) */
  181. /****************************************************************
  182. Gets the last record on the page. */
  183. UNIV_INLINE
  184. rec_t*
  185. page_get_supremum_rec(
  186. /*==================*/
  187. /* out: the last record in record list */
  188. page_t* page); /* in: page which must have record(s) */
  189. /****************************************************************
  190. Returns the middle record of record list. If there are an even number
  191. of records in the list, returns the first record of upper half-list. */
  192. rec_t*
  193. page_get_middle_rec(
  194. /*================*/
  195. /* out: middle record */
  196. page_t* page); /* in: page */
  197. /*****************************************************************
  198. Compares a data tuple to a physical record. Differs from the function
  199. cmp_dtuple_rec_with_match in the way that the record must reside on an
  200. index page, and also page infimum and supremum records can be given in
  201. the parameter rec. These are considered as the negative infinity and
  202. the positive infinity in the alphabetical order. */
  203. UNIV_INLINE
  204. int
  205. page_cmp_dtuple_rec_with_match(
  206. /*===========================*/
  207. /* out: 1, 0, -1, if dtuple is greater, equal, 
  208. less than rec, respectively, when only the 
  209. common first fields are compared */
  210. dtuple_t* dtuple, /* in: data tuple */
  211. rec_t* rec, /* in: physical record on a page; may also 
  212. be page infimum or supremum, in which case 
  213. matched-parameter values below are not 
  214. affected */
  215. ulint*   matched_fields, /* in/out: number of already completely 
  216. matched fields; when function returns
  217. contains the value for current comparison */
  218. ulint*    matched_bytes); /* in/out: number of already matched 
  219. bytes within the first field not completely
  220. matched; when function returns contains the
  221. value for current comparison */
  222. /*****************************************************************
  223. Gets the number of user records on page (the infimum and supremum records
  224. are not user records). */
  225. UNIV_INLINE
  226. ulint
  227. page_get_n_recs(
  228. /*============*/
  229. /* out: number of user records */
  230. page_t* page); /* in: index page */
  231. /*******************************************************************
  232. Returns the number of records before the given record in chain.
  233. The number includes infimum and supremum records. */
  234. ulint
  235. page_rec_get_n_recs_before(
  236. /*=======================*/
  237. /* out: number of records */
  238. rec_t* rec); /* in: the physical record */
  239. /*****************************************************************
  240. Gets the number of dir slots in directory. */
  241. UNIV_INLINE
  242. ulint
  243. page_dir_get_n_slots(
  244. /*=================*/
  245. /* out: number of slots */
  246. page_t* page); /* in: index page */
  247. /*****************************************************************
  248. Gets pointer to nth directory slot. */
  249. UNIV_INLINE
  250. page_dir_slot_t*
  251. page_dir_get_nth_slot(
  252. /*==================*/
  253. /* out: pointer to dir slot */
  254. page_t* page, /* in: index page */
  255. ulint n); /* in: position */
  256. /******************************************************************
  257. Used to check the consistency of a record on a page. */
  258. UNIV_INLINE
  259. ibool
  260. page_rec_check(
  261. /*===========*/
  262. /* out: TRUE if succeed */
  263. rec_t* rec); /* in: record */
  264. /*******************************************************************
  265. Gets the record pointed to by a directory slot. */
  266. UNIV_INLINE
  267. rec_t*
  268. page_dir_slot_get_rec(
  269. /*==================*/
  270. /* out: pointer to record */
  271. page_dir_slot_t* slot); /* in: directory slot */
  272. /*******************************************************************
  273. This is used to set the record offset in a directory slot. */
  274. UNIV_INLINE
  275. void
  276. page_dir_slot_set_rec(
  277. /*==================*/
  278. page_dir_slot_t* slot, /* in: directory slot */
  279. rec_t*  rec); /* in: record on the page */
  280. /*******************************************************************
  281. Gets the number of records owned by a directory slot. */
  282. UNIV_INLINE
  283. ulint
  284. page_dir_slot_get_n_owned(
  285. /*======================*/
  286. /* out: number of records */
  287. page_dir_slot_t*  slot); /* in: page directory slot */
  288. /*******************************************************************
  289. This is used to set the owned records field of a directory slot. */
  290. UNIV_INLINE
  291. void
  292. page_dir_slot_set_n_owned(
  293. /*======================*/
  294. page_dir_slot_t* slot, /* in: directory slot */
  295. ulint n); /* in: number of records owned 
  296. by the slot */
  297. /****************************************************************
  298. Calculates the space reserved for directory slots of a given
  299. number of records. The exact value is a fraction number
  300. n * PAGE_DIR_SLOT_SIZE / PAGE_DIR_SLOT_MIN_N_OWNED, and it is
  301. rounded upwards to an integer. */
  302. UNIV_INLINE
  303. ulint
  304. page_dir_calc_reserved_space(
  305. /*=========================*/
  306. ulint n_recs); /* in: number of records */
  307. /*******************************************************************
  308. Looks for the directory slot which owns the given record. */
  309. UNIV_INLINE
  310. ulint
  311. page_dir_find_owner_slot(
  312. /*=====================*/
  313. /* out: the directory slot number */
  314. rec_t* rec); /* in: the physical record */
  315. /****************************************************************
  316. Gets the pointer to the next record on the page. */
  317. UNIV_INLINE
  318. rec_t*
  319. page_rec_get_next(
  320. /*==============*/
  321. /* out: pointer to next record */
  322. rec_t* rec); /* in: pointer to record, must not be page
  323. supremum */
  324. /****************************************************************
  325. Sets the pointer to the next record on the page. */ 
  326. UNIV_INLINE
  327. void
  328. page_rec_set_next(
  329. /*==============*/
  330. rec_t* rec, /* in: pointer to record, must not be
  331. page supremum */
  332. rec_t* next); /* in: pointer to next record, must not
  333. be page infimum */
  334. /****************************************************************
  335. Gets the pointer to the previous record. */
  336. UNIV_INLINE
  337. rec_t*
  338. page_rec_get_prev(
  339. /*==============*/
  340. /* out: pointer to previous record */
  341. rec_t* rec); /* in: pointer to record, must not be page
  342. infimum */
  343. /****************************************************************
  344. TRUE if the record is a user record on the page. */
  345. UNIV_INLINE
  346. ibool
  347. page_rec_is_user_rec(
  348. /*=================*/
  349. /* out: TRUE if a user record */
  350. rec_t* rec); /* in: record */
  351. /****************************************************************
  352. TRUE if the record is the supremum record on a page. */
  353. UNIV_INLINE
  354. ibool
  355. page_rec_is_supremum(
  356. /*=================*/
  357. /* out: TRUE if the supremum record */
  358. rec_t* rec); /* in: record */
  359. /****************************************************************
  360. TRUE if the record is the infimum record on a page. */
  361. UNIV_INLINE
  362. ibool
  363. page_rec_is_infimum(
  364. /*================*/
  365. /* out: TRUE if the infimum record */
  366. rec_t* rec); /* in: record */
  367. /****************************************************************
  368. TRUE if the record is the first user record on the page. */
  369. UNIV_INLINE
  370. ibool
  371. page_rec_is_first_user_rec(
  372. /*=======================*/
  373. /* out: TRUE if first user record */
  374. rec_t* rec); /* in: record */
  375. /****************************************************************
  376. TRUE if the record is the last user record on the page. */
  377. UNIV_INLINE
  378. ibool
  379. page_rec_is_last_user_rec(
  380. /*======================*/
  381. /* out: TRUE if last user record */
  382. rec_t* rec); /* in: record */
  383. /*******************************************************************
  384. Looks for the record which owns the given record. */
  385. UNIV_INLINE
  386. rec_t*
  387. page_rec_find_owner_rec(
  388. /*====================*/
  389. /* out: the owner record */
  390. rec_t* rec); /* in: the physical record */
  391. /***************************************************************************
  392. This is a low-level operation which is used in a database index creation
  393. to update the page number of a created B-tree to a data dictionary
  394. record. */
  395. void
  396. page_rec_write_index_page_no(
  397. /*=========================*/
  398. rec_t* rec, /* in: record to update */
  399. ulint i, /* in: index of the field to update */
  400. ulint page_no,/* in: value to write */
  401. mtr_t* mtr); /* in: mtr */
  402. /****************************************************************
  403. Returns the maximum combined size of records which can be inserted on top
  404. of record heap. */
  405. UNIV_INLINE
  406. ulint
  407. page_get_max_insert_size(
  408. /*=====================*/
  409. /* out: maximum combined size for inserted records */
  410. page_t* page, /* in: index page */
  411. ulint n_recs); /* in: number of records */
  412. /****************************************************************
  413. Returns the maximum combined size of records which can be inserted on top
  414. of record heap if page is first reorganized. */
  415. UNIV_INLINE
  416. ulint
  417. page_get_max_insert_size_after_reorganize(
  418. /*======================================*/
  419. /* out: maximum combined size for inserted records */
  420. page_t* page, /* in: index page */
  421. ulint n_recs);/* in: number of records */
  422. /*****************************************************************
  423. Calculates free space if a page is emptied. */
  424. UNIV_INLINE
  425. ulint
  426. page_get_free_space_of_empty(void);
  427. /*==============================*/
  428. /* out: free space */
  429. /****************************************************************
  430. Returns the sum of the sizes of the records in the record list
  431. excluding the infimum and supremum records. */
  432. UNIV_INLINE
  433. ulint
  434. page_get_data_size(
  435. /*===============*/
  436. /* out: data in bytes */
  437. page_t* page); /* in: index page */
  438. /****************************************************************
  439. Allocates a block of memory from an index page. */
  440. byte*
  441. page_mem_alloc(
  442. /*===========*/
  443. /* out: pointer to start of allocated 
  444. buffer, or NULL if allocation fails */
  445. page_t* page, /* in: index page */
  446. ulint need, /* in: number of bytes needed */
  447. ulint* heap_no);/* out: this contains the heap number
  448. of the allocated record if allocation succeeds */
  449. /****************************************************************
  450. Puts a record to free list. */
  451. UNIV_INLINE
  452. void
  453. page_mem_free(
  454. /*==========*/
  455. page_t* page, /* in: index page */
  456. rec_t* rec); /* in: pointer to the (origin of) record */
  457. /**************************************************************
  458. The index page creation function. */
  459. page_t* 
  460. page_create(
  461. /*========*/
  462. /* out: pointer to the page */
  463. buf_frame_t* frame, /* in: a buffer frame where the page is
  464. created */
  465. mtr_t* mtr); /* in: mini-transaction handle */
  466. /*****************************************************************
  467. Differs from page_copy_rec_list_end, because this function does not
  468. touch the lock table and max trx id on page. */
  469. void
  470. page_copy_rec_list_end_no_locks(
  471. /*============================*/
  472. page_t* new_page, /* in: index page to copy to */
  473. page_t* page, /* in: index page */
  474. rec_t* rec, /* in: record on page */
  475. mtr_t* mtr); /* in: mtr */
  476. /*****************************************************************
  477. Copies records from page to new_page, from the given record onward,
  478. including that record. Infimum and supremum records are not copied.
  479. The records are copied to the start of the record list on new_page. */
  480. void
  481. page_copy_rec_list_end(
  482. /*===================*/
  483. page_t* new_page, /* in: index page to copy to */
  484. page_t* page, /* in: index page */
  485. rec_t* rec, /* in: record on page */
  486. mtr_t* mtr); /* in: mtr */
  487. /*****************************************************************
  488. Copies records from page to new_page, up to the given record, NOT
  489. including that record. Infimum and supremum records are not copied.
  490. The records are copied to the end of the record list on new_page. */
  491. void
  492. page_copy_rec_list_start(
  493. /*=====================*/
  494. page_t* new_page, /* in: index page to copy to */
  495. page_t* page, /* in: index page */
  496. rec_t* rec, /* in: record on page */
  497. mtr_t* mtr); /* in: mtr */
  498. /*****************************************************************
  499. Deletes records from a page from a given record onward, including that record.
  500. The infimum and supremum records are not deleted. */
  501. void
  502. page_delete_rec_list_end(
  503. /*=====================*/
  504. page_t* page, /* in: index page */
  505. rec_t* rec, /* in: record on page */
  506. ulint n_recs, /* in: number of records to delete, or ULINT_UNDEFINED
  507. if not known */
  508. ulint size, /* in: the sum of the sizes of the records in the end
  509. of the chain to delete, or ULINT_UNDEFINED if not
  510. known */
  511. mtr_t* mtr); /* in: mtr */
  512. /*****************************************************************
  513. Deletes records from page, up to the given record, NOT including
  514. that record. Infimum and supremum records are not deleted. */
  515. void
  516. page_delete_rec_list_start(
  517. /*=======================*/
  518. page_t* page, /* in: index page */
  519. rec_t* rec, /* in: record on page */
  520. mtr_t* mtr); /* in: mtr */
  521. /*****************************************************************
  522. Moves record list end to another page. Moved records include
  523. split_rec. */
  524. void
  525. page_move_rec_list_end(
  526. /*===================*/
  527. page_t* new_page, /* in: index page where to move */
  528. page_t* page, /* in: index page */
  529. rec_t* split_rec, /* in: first record to move */
  530. mtr_t* mtr); /* in: mtr */
  531. /*****************************************************************
  532. Moves record list start to another page. Moved records do not include
  533. split_rec. */
  534. void
  535. page_move_rec_list_start(
  536. /*=====================*/
  537. page_t* new_page, /* in: index page where to move */
  538. page_t* page, /* in: index page */
  539. rec_t* split_rec, /* in: first record not to move */
  540. mtr_t* mtr); /* in: mtr */
  541. /********************************************************************
  542. Splits a directory slot which owns too many records. */
  543. void
  544. page_dir_split_slot(
  545. /*================*/
  546. page_t* page,  /* in: the index page in question */
  547. ulint slot_no);  /* in: the directory slot */
  548. /*****************************************************************
  549. Tries to balance the given directory slot with too few records
  550. with the upper neighbor, so that there are at least the minimum number 
  551. of records owned by the slot; this may result in the merging of 
  552. two slots. */
  553. void
  554. page_dir_balance_slot(
  555. /*==================*/
  556. page_t* page, /* in: index page */
  557. ulint slot_no);  /* in: the directory slot */
  558. /**************************************************************
  559. Parses a log record of a record list end or start deletion. */
  560. byte*
  561. page_parse_delete_rec_list(
  562. /*=======================*/
  563. /* out: end of log record or NULL */
  564. byte type, /* in: MLOG_LIST_END_DELETE or MLOG_LIST_START_DELETE */
  565. byte* ptr, /* in: buffer */
  566. byte* end_ptr,/* in: buffer end */
  567. page_t* page, /* in: page or NULL */
  568. mtr_t* mtr); /* in: mtr or NULL */
  569. /***************************************************************
  570. Parses a redo log record of creating a page. */
  571. byte*
  572. page_parse_create(
  573. /*==============*/
  574. /* out: end of log record or NULL */
  575. byte* ptr, /* in: buffer */
  576. byte* end_ptr,/* in: buffer end */
  577. page_t* page, /* in: page or NULL */
  578. mtr_t* mtr); /* in: mtr or NULL */
  579. /****************************************************************
  580. Prints record contents including the data relevant only in
  581. the index page context. */
  582.  
  583. void
  584. page_rec_print(
  585. /*===========*/
  586. rec_t* rec);
  587. /*******************************************************************
  588. This is used to print the contents of the directory for
  589. debugging purposes. */
  590. void
  591. page_dir_print(
  592. /*===========*/
  593. page_t* page, /* in: index page */
  594. ulint pr_n); /* in: print n first and n last entries */
  595. /*******************************************************************
  596. This is used to print the contents of the page record list for
  597. debugging purposes. */
  598. void
  599. page_print_list(
  600. /*============*/
  601. page_t* page, /* in: index page */
  602. ulint pr_n); /* in: print n first and n last entries */
  603. /*******************************************************************
  604. Prints the info in a page header. */
  605. void
  606. page_header_print(
  607. /*==============*/
  608. page_t* page);
  609. /*******************************************************************
  610. This is used to print the contents of the page for
  611. debugging purposes. */
  612. void
  613. page_print(
  614. /*======*/
  615. page_t* page, /* in: index page */
  616. ulint dn, /* in: print dn first and last entries in directory */
  617. ulint rn); /* in: print rn first and last records on page */
  618. /*******************************************************************
  619. The following is used to validate a record on a page. This function
  620. differs from rec_validate as it can also check the n_owned field and
  621. the heap_no field. */
  622. ibool
  623. page_rec_validate(
  624. /*==============*/
  625. /* out: TRUE if ok */
  626. rec_t*  rec); /* in: record on the page */
  627. /*******************************************************************
  628. This function checks the consistency of an index page. */
  629. ibool
  630. page_validate(
  631. /*==========*/
  632. /* out: TRUE if ok */
  633. page_t* page, /* in: index page */
  634. dict_index_t* index); /* in: data dictionary index containing
  635. the page record type definition */
  636. /*******************************************************************
  637. Looks in the page record list for a record with the given heap number. */
  638. rec_t*
  639. page_find_rec_with_heap_no(
  640. /*=======================*/
  641. /* out: record, NULL if not found */
  642. page_t* page, /* in: index page */
  643. ulint heap_no);/* in: heap number */
  644. #ifdef UNIV_MATERIALIZE
  645. #undef UNIV_INLINE
  646. #define UNIV_INLINE  UNIV_INLINE_ORIGINAL
  647. #endif
  648. #ifndef UNIV_NONINL
  649. #include "page0page.ic"
  650. #endif
  651. #endif