btr0pcur.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:19k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. The index tree persistent cursor
  3. (c) 1996 Innobase Oy
  4. Created 2/23/1996 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef btr0pcur_h
  7. #define btr0pcur_h
  8. #include "univ.i"
  9. #include "dict0dict.h"
  10. #include "data0data.h"
  11. #include "mtr0mtr.h"
  12. #include "page0cur.h"
  13. #include "btr0cur.h"
  14. #include "btr0btr.h"
  15. #include "btr0types.h"
  16. /* Relative positions for a stored cursor position */
  17. #define BTR_PCUR_ON 1
  18. #define BTR_PCUR_BEFORE 2
  19. #define BTR_PCUR_AFTER 3
  20. /* Note that if the tree is not empty, btr_pcur_store_position does not
  21. use the following, but only uses the above three alternatives, where the
  22. position is stored relative to a specific record: this makes implementation
  23. of a scroll cursor easier */
  24. #define BTR_PCUR_BEFORE_FIRST_IN_TREE 4 /* in an empty tree */
  25. #define BTR_PCUR_AFTER_LAST_IN_TREE 5 /* in an empty tree */
  26. /******************************************************************
  27. Allocates memory for a persistent cursor object and initializes the cursor. */
  28. btr_pcur_t*
  29. btr_pcur_create_for_mysql(void);
  30. /*============================*/
  31. /* out, own: persistent cursor */
  32. /******************************************************************
  33. Frees the memory for a persistent cursor object. */
  34. void
  35. btr_pcur_free_for_mysql(
  36. /*====================*/
  37. btr_pcur_t* cursor); /* in, own: persistent cursor */
  38. /******************************************************************
  39. Copies the stored position of a pcur to another pcur. */
  40. void
  41. btr_pcur_copy_stored_position(
  42. /*==========================*/
  43. btr_pcur_t* pcur_receive, /* in: pcur which will receive the
  44. position info */
  45. btr_pcur_t* pcur_donate); /* in: pcur from which the info is
  46. copied */
  47. /******************************************************************
  48. Sets the old_rec_buf field to NULL. */
  49. UNIV_INLINE
  50. void
  51. btr_pcur_init(
  52. /*==========*/
  53. btr_pcur_t* pcur); /* in: persistent cursor */
  54. /******************************************************************
  55. Initializes and opens a persistent cursor to an index tree. It should be
  56. closed with btr_pcur_close. */
  57. UNIV_INLINE
  58. void
  59. btr_pcur_open(
  60. /*==========*/
  61. dict_index_t* index, /* in: index */
  62. dtuple_t* tuple, /* in: tuple on which search done */
  63. ulint mode, /* in: PAGE_CUR_L, ...;
  64. NOTE that if the search is made using a unique
  65. prefix of a record, mode should be
  66. PAGE_CUR_LE, not PAGE_CUR_GE, as the latter
  67. may end up on the previous page from the
  68. record! */
  69. ulint latch_mode,/* in: BTR_SEARCH_LEAF, ... */
  70. btr_pcur_t* cursor, /* in: memory buffer for persistent cursor */
  71. mtr_t* mtr); /* in: mtr */
  72. /******************************************************************
  73. Opens an persistent cursor to an index tree without initializing the
  74. cursor. */
  75. UNIV_INLINE
  76. void
  77. btr_pcur_open_with_no_init(
  78. /*=======================*/
  79. dict_index_t* index, /* in: index */
  80. dtuple_t* tuple, /* in: tuple on which search done */
  81. ulint mode, /* in: PAGE_CUR_L, ...;
  82. NOTE that if the search is made using a unique
  83. prefix of a record, mode should be
  84. PAGE_CUR_LE, not PAGE_CUR_GE, as the latter
  85. may end up on the previous page of the
  86. record! */
  87. ulint latch_mode,/* in: BTR_SEARCH_LEAF, ...;
  88. NOTE that if has_search_latch != 0 then
  89. we maybe do not acquire a latch on the cursor
  90. page, but assume that the caller uses his
  91. btr search latch to protect the record! */
  92. btr_pcur_t* cursor, /* in: memory buffer for persistent cursor */
  93. ulint has_search_latch,/* in: latch mode the caller
  94. currently has on btr_search_latch:
  95. RW_S_LATCH, or 0 */
  96. mtr_t* mtr); /* in: mtr */
  97. /*********************************************************************
  98. Opens a persistent cursor at either end of an index. */
  99. UNIV_INLINE
  100. void
  101. btr_pcur_open_at_index_side(
  102. /*========================*/
  103. ibool from_left, /* in: TRUE if open to the low end,
  104. FALSE if to the high end */
  105. dict_index_t* index, /* in: index */
  106. ulint latch_mode, /* in: latch mode */
  107. btr_pcur_t* pcur, /* in: cursor */
  108. ibool do_init, /* in: TRUE if should be initialized */
  109. mtr_t* mtr); /* in: mtr */
  110. /******************************************************************
  111. Gets the up_match value for a pcur after a search. */
  112. UNIV_INLINE
  113. ulint
  114. btr_pcur_get_up_match(
  115. /*==================*/
  116. /* out: number of matched fields at the cursor
  117. or to the right if search mode was PAGE_CUR_GE,
  118. otherwise undefined */
  119. btr_pcur_t* cursor); /* in: memory buffer for persistent cursor */
  120. /******************************************************************
  121. Gets the low_match value for a pcur after a search. */
  122. UNIV_INLINE
  123. ulint
  124. btr_pcur_get_low_match(
  125. /*===================*/
  126. /* out: number of matched fields at the cursor
  127. or to the right if search mode was PAGE_CUR_LE,
  128. otherwise undefined */
  129. btr_pcur_t* cursor); /* in: memory buffer for persistent cursor */
  130. /******************************************************************
  131. If mode is PAGE_CUR_G or PAGE_CUR_GE, opens a persistent cursor on the first
  132. user record satisfying the search condition, in the case PAGE_CUR_L or
  133. PAGE_CUR_LE, on the last user record. If no such user record exists, then
  134. in the first case sets the cursor after last in tree, and in the latter case
  135. before first in tree. The latching mode must be BTR_SEARCH_LEAF or
  136. BTR_MODIFY_LEAF. */
  137. void
  138. btr_pcur_open_on_user_rec(
  139. /*======================*/
  140. dict_index_t* index, /* in: index */
  141. dtuple_t* tuple, /* in: tuple on which search done */
  142. ulint mode, /* in: PAGE_CUR_L, ... */
  143. ulint latch_mode, /* in: BTR_SEARCH_LEAF or
  144. BTR_MODIFY_LEAF */
  145. btr_pcur_t* cursor,  /* in: memory buffer for persistent
  146. cursor */
  147. mtr_t* mtr); /* in: mtr */
  148. /**************************************************************************
  149. Positions a cursor at a randomly chosen position within a B-tree. */
  150. UNIV_INLINE
  151. void
  152. btr_pcur_open_at_rnd_pos(
  153. /*=====================*/
  154. dict_index_t* index, /* in: index */
  155. ulint latch_mode, /* in: BTR_SEARCH_LEAF, ... */
  156. btr_pcur_t* cursor, /* in/out: B-tree pcur */
  157. mtr_t* mtr); /* in: mtr */
  158. /******************************************************************
  159. Frees the possible old_rec_buf buffer of a persistent cursor and sets the
  160. latch mode of the persistent cursor to BTR_NO_LATCHES. */
  161. UNIV_INLINE
  162. void
  163. btr_pcur_close(
  164. /*===========*/
  165. btr_pcur_t* cursor); /* in: persistent cursor */
  166. /******************************************************************
  167. The position of the cursor is stored by taking an initial segment of the
  168. record the cursor is positioned on, before, or after, and copying it to the
  169. cursor data structure, or just setting a flag if the cursor id before the
  170. first in an EMPTY tree, or after the last in an EMPTY tree. NOTE that the
  171. page where the cursor is positioned must not be empty if the index tree is
  172. not totally empty! */
  173. void
  174. btr_pcur_store_position(
  175. /*====================*/
  176. btr_pcur_t* cursor, /* in: persistent cursor */
  177. mtr_t* mtr); /* in: mtr */
  178. /******************************************************************
  179. Restores the stored position of a persistent cursor bufferfixing the page and
  180. obtaining the specified latches. If the cursor position was saved when the
  181. (1) cursor was positioned on a user record: this function restores the position
  182. to the last record LESS OR EQUAL to the stored record;
  183. (2) cursor was positioned on a page infimum record: restores the position to
  184. the last record LESS than the user record which was the successor of the page
  185. infimum;
  186. (3) cursor was positioned on the page supremum: restores to the first record
  187. GREATER than the user record which was the predecessor of the supremum.
  188. (4) cursor was positioned before the first or after the last in an empty tree:
  189. restores to before first or after the last in the tree. */
  190. ibool
  191. btr_pcur_restore_position(
  192. /*======================*/
  193. /* out: TRUE if the cursor position
  194. was stored when it was on a user record
  195. and it can be restored on a user record
  196. whose ordering fields are identical to
  197. the ones of the original user record */
  198. ulint latch_mode, /* in: BTR_SEARCH_LEAF, ... */
  199. btr_pcur_t* cursor,  /* in: detached persistent cursor */
  200. mtr_t* mtr); /* in: mtr */
  201. /******************************************************************
  202. If the latch mode of the cursor is BTR_LEAF_SEARCH or BTR_LEAF_MODIFY,
  203. releases the page latch and bufferfix reserved by the cursor.
  204. NOTE! In the case of BTR_LEAF_MODIFY, there should not exist changes
  205. made by the current mini-transaction to the data protected by the
  206. cursor latch, as then the latch must not be released until mtr_commit. */
  207. void
  208. btr_pcur_release_leaf(
  209. /*==================*/
  210. btr_pcur_t* cursor, /* in: persistent cursor */
  211. mtr_t* mtr); /* in: mtr */
  212. /*************************************************************
  213. Gets the rel_pos field for a cursor whose position has been stored. */
  214. UNIV_INLINE
  215. ulint
  216. btr_pcur_get_rel_pos(
  217. /*=================*/
  218. /* out: BTR_PCUR_ON, ... */
  219. btr_pcur_t* cursor);/* in: persistent cursor */
  220. /*************************************************************
  221. Sets the mtr field for a pcur. */
  222. UNIV_INLINE
  223. void
  224. btr_pcur_set_mtr(
  225. /*=============*/
  226. btr_pcur_t* cursor, /* in: persistent cursor */
  227. mtr_t* mtr); /* in, own: mtr */
  228. /*************************************************************
  229. Gets the mtr field for a pcur. */
  230. UNIV_INLINE
  231. mtr_t*
  232. btr_pcur_get_mtr(
  233. /*=============*/
  234. /* out: mtr */
  235. btr_pcur_t* cursor); /* in: persistent cursor */
  236. /******************************************************************
  237. Commits the pcur mtr and sets the pcur latch mode to BTR_NO_LATCHES,
  238. that is, the cursor becomes detached. If there have been modifications
  239. to the page where pcur is positioned, this can be used instead of
  240. btr_pcur_release_leaf. Function btr_pcur_store_position should be used
  241. before calling this, if restoration of cursor is wanted later. */
  242. UNIV_INLINE
  243. void
  244. btr_pcur_commit(
  245. /*============*/
  246. btr_pcur_t* pcur); /* in: persistent cursor */
  247. /******************************************************************
  248. Differs from btr_pcur_commit in that we can specify the mtr to commit. */
  249. UNIV_INLINE
  250. void
  251. btr_pcur_commit_specify_mtr(
  252. /*========================*/
  253. btr_pcur_t* pcur, /* in: persistent cursor */
  254. mtr_t* mtr); /* in: mtr to commit */
  255. /******************************************************************
  256. Tests if a cursor is detached: that is the latch mode is BTR_NO_LATCHES. */
  257. UNIV_INLINE
  258. ibool
  259. btr_pcur_is_detached(
  260. /*=================*/
  261. /* out: TRUE if detached */
  262. btr_pcur_t* pcur); /* in: persistent cursor */
  263. /*************************************************************
  264. Moves the persistent cursor to the next record in the tree. If no records are
  265. left, the cursor stays 'after last in tree'. */
  266. UNIV_INLINE
  267. ibool
  268. btr_pcur_move_to_next(
  269. /*==================*/
  270. /* out: TRUE if the cursor was not after last
  271. in tree */
  272. btr_pcur_t* cursor, /* in: persistent cursor; NOTE that the
  273. function may release the page latch */
  274. mtr_t* mtr); /* in: mtr */
  275. /*************************************************************
  276. Moves the persistent cursor to the previous record in the tree. If no records
  277. are left, the cursor stays 'before first in tree'. */
  278. ibool
  279. btr_pcur_move_to_prev(
  280. /*==================*/
  281. /* out: TRUE if the cursor was not before first
  282. in tree */
  283. btr_pcur_t* cursor, /* in: persistent cursor; NOTE that the
  284. function may release the page latch */
  285. mtr_t* mtr); /* in: mtr */
  286. /*************************************************************
  287. Moves the persistent cursor to the last record on the same page. */
  288. UNIV_INLINE
  289. void
  290. btr_pcur_move_to_last_on_page(
  291. /*==========================*/
  292. btr_pcur_t* cursor, /* in: persistent cursor */
  293. mtr_t* mtr); /* in: mtr */
  294. /*************************************************************
  295. Moves the persistent cursor to the next user record in the tree. If no user
  296. records are left, the cursor ends up 'after last in tree'. */
  297. UNIV_INLINE
  298. ibool
  299. btr_pcur_move_to_next_user_rec(
  300. /*===========================*/
  301. /* out: TRUE if the cursor moved forward,
  302. ending on a user record */
  303. btr_pcur_t* cursor, /* in: persistent cursor; NOTE that the
  304. function may release the page latch */
  305. mtr_t* mtr); /* in: mtr */
  306. /*************************************************************
  307. Moves the persistent cursor to the first record on the next page.
  308. Releases the latch on the current page, and bufferunfixes it.
  309. Note that there must not be modifications on the current page,
  310. as then the x-latch can be released only in mtr_commit. */
  311. void
  312. btr_pcur_move_to_next_page(
  313. /*=======================*/
  314. btr_pcur_t* cursor, /* in: persistent cursor; must be on the
  315. last record of the current page */
  316. mtr_t* mtr); /* in: mtr */
  317. /*************************************************************
  318. Moves the persistent cursor backward if it is on the first record
  319. of the page. Releases the latch on the current page, and bufferunfixes
  320. it. Note that to prevent a possible deadlock, the operation first
  321. stores the position of the cursor, releases the leaf latch, acquires
  322. necessary latches and restores the cursor position again before returning.
  323. The alphabetical position of the cursor is guaranteed to be sensible
  324. on return, but it may happen that the cursor is not positioned on the
  325. last record of any page, because the structure of the tree may have
  326. changed while the cursor had no latches. */
  327. void
  328. btr_pcur_move_backward_from_page(
  329. /*=============================*/
  330. btr_pcur_t* cursor, /* in: persistent cursor, must be on the
  331. first record of the current page */
  332. mtr_t* mtr); /* in: mtr */
  333. /*************************************************************
  334. Returns the btr cursor component of a persistent cursor. */
  335. UNIV_INLINE
  336. btr_cur_t*
  337. btr_pcur_get_btr_cur(
  338. /*=================*/
  339. /* out: pointer to btr cursor component */
  340. btr_pcur_t* cursor); /* in: persistent cursor */
  341. /*************************************************************
  342. Returns the page cursor component of a persistent cursor. */
  343. UNIV_INLINE
  344. page_cur_t*
  345. btr_pcur_get_page_cur(
  346. /*==================*/
  347. /* out: pointer to page cursor component */
  348. btr_pcur_t* cursor); /* in: persistent cursor */
  349. /*************************************************************
  350. Returns the page of a persistent cursor. */
  351. UNIV_INLINE
  352. page_t*
  353. btr_pcur_get_page(
  354. /*==============*/
  355. /* out: pointer to the page */
  356. btr_pcur_t* cursor);/* in: persistent cursor */
  357. /*************************************************************
  358. Returns the record of a persistent cursor. */
  359. UNIV_INLINE
  360. rec_t*
  361. btr_pcur_get_rec(
  362. /*=============*/
  363. /* out: pointer to the record */
  364. btr_pcur_t* cursor);/* in: persistent cursor */
  365. /*************************************************************
  366. Checks if the persistent cursor is on a user record. */
  367. UNIV_INLINE
  368. ibool
  369. btr_pcur_is_on_user_rec(
  370. /*====================*/
  371. btr_pcur_t* cursor, /* in: persistent cursor */
  372. mtr_t* mtr); /* in: mtr */
  373. /*************************************************************
  374. Checks if the persistent cursor is after the last user record on 
  375. a page. */
  376. UNIV_INLINE
  377. ibool
  378. btr_pcur_is_after_last_on_page(
  379. /*===========================*/
  380. btr_pcur_t* cursor, /* in: persistent cursor */
  381. mtr_t* mtr); /* in: mtr */
  382. /*************************************************************
  383. Checks if the persistent cursor is before the first user record on 
  384. a page. */
  385. UNIV_INLINE
  386. ibool
  387. btr_pcur_is_before_first_on_page(
  388. /*=============================*/
  389. btr_pcur_t* cursor, /* in: persistent cursor */
  390. mtr_t* mtr); /* in: mtr */
  391. /*************************************************************
  392. Checks if the persistent cursor is before the first user record in
  393. the index tree. */
  394. UNIV_INLINE
  395. ibool
  396. btr_pcur_is_before_first_in_tree(
  397. /*=============================*/
  398. btr_pcur_t* cursor, /* in: persistent cursor */
  399. mtr_t* mtr); /* in: mtr */
  400. /*************************************************************
  401. Checks if the persistent cursor is after the last user record in
  402. the index tree. */
  403. UNIV_INLINE
  404. ibool
  405. btr_pcur_is_after_last_in_tree(
  406. /*===========================*/
  407. btr_pcur_t* cursor, /* in: persistent cursor */
  408. mtr_t* mtr); /* in: mtr */
  409. /*************************************************************
  410. Moves the persistent cursor to the next record on the same page. */
  411. UNIV_INLINE
  412. void
  413. btr_pcur_move_to_next_on_page(
  414. /*==========================*/
  415. btr_pcur_t* cursor, /* in: persistent cursor */
  416. mtr_t* mtr); /* in: mtr */
  417. /*************************************************************
  418. Moves the persistent cursor to the previous record on the same page. */
  419. UNIV_INLINE
  420. void
  421. btr_pcur_move_to_prev_on_page(
  422. /*==========================*/
  423. btr_pcur_t* cursor, /* in: persistent cursor */
  424. mtr_t* mtr); /* in: mtr */
  425. /* The persistent B-tree cursor structure. This is used mainly for SQL
  426. selects, updates, and deletes. */
  427. struct btr_pcur_struct{
  428. btr_cur_t btr_cur; /* a B-tree cursor */
  429. ulint latch_mode; /* see FIXME note below!
  430. BTR_SEARCH_LEAF, BTR_MODIFY_LEAF,
  431. BTR_MODIFY_TREE, or BTR_NO_LATCHES,
  432. depending on the latching state of
  433. the page and tree where the cursor is
  434. positioned; the last value means that
  435. the cursor is not currently positioned:
  436. we say then that the cursor is
  437. detached; it can be restored to
  438. attached if the old position was
  439. stored in old_rec */
  440. ulint old_stored; /* BTR_PCUR_OLD_STORED
  441. or BTR_PCUR_OLD_NOT_STORED */
  442. rec_t* old_rec; /* if cursor position is stored,
  443. contains an initial segment of the
  444. latest record cursor was positioned
  445. either on, before, or after */
  446. ulint rel_pos; /* BTR_PCUR_ON, BTR_PCUR_BEFORE, or
  447. BTR_PCUR_AFTER, depending on whether
  448. cursor was on, before, or after the
  449. old_rec record */
  450. buf_block_t* block_when_stored;/* buffer block when the position was
  451. stored; note that if AWE is on, frames
  452. may move */
  453. dulint modify_clock; /* the modify clock value of the
  454. buffer block when the cursor position
  455. was stored */
  456. ulint pos_state; /* see FIXME note below!
  457. BTR_PCUR_IS_POSITIONED,
  458. BTR_PCUR_WAS_POSITIONED,
  459. BTR_PCUR_NOT_POSITIONED */
  460. ulint search_mode; /* PAGE_CUR_G, ... */
  461. trx_t* trx_if_known; /* the transaction, if we know it;
  462. otherwise this field is not defined;
  463. can ONLY BE USED in error prints in
  464. fatal assertion failures! */
  465. /*-----------------------------*/
  466. /* NOTE that the following fields may possess dynamically allocated
  467. memory which should be freed if not needed anymore! */
  468. mtr_t* mtr; /* NULL, or this field may contain
  469. a mini-transaction which holds the
  470. latch on the cursor page */
  471. byte* old_rec_buf; /* NULL, or a dynamically allocated
  472. buffer for old_rec */
  473. ulint buf_size; /* old_rec_buf size if old_rec_buf
  474. is not NULL */
  475. };
  476. #define BTR_PCUR_IS_POSITIONED 1997660512 /* FIXME: currently, the state
  477. can be BTR_PCUR_IS_POSITIONED,
  478. though it really should be
  479. BTR_PCUR_WAS_POSITIONED,
  480. because we have no obligation
  481. to commit the cursor with
  482. mtr; similarly latch_mode may
  483. be out of date */
  484. #define BTR_PCUR_WAS_POSITIONED 1187549791
  485. #define BTR_PCUR_NOT_POSITIONED 1328997689
  486. #define BTR_PCUR_OLD_STORED 908467085
  487. #define BTR_PCUR_OLD_NOT_STORED 122766467
  488. #ifndef UNIV_NONINL
  489. #include "btr0pcur.ic"
  490. #endif
  491. #endif