29 #include "btr0pcur.ic"
75 cursor->
pos_state = BTR_PCUR_NOT_POSITIONED;
104 block = btr_pcur_get_block(cursor);
107 page_cursor = btr_pcur_get_page_cur(cursor);
109 rec = page_cur_get_rec(page_cursor);
113 ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_S_FIX)
114 || mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
129 cursor->
rel_pos = BTR_PCUR_AFTER_LAST_IN_TREE;
131 cursor->
rel_pos = BTR_PCUR_BEFORE_FIRST_IN_TREE;
141 cursor->
rel_pos = BTR_PCUR_AFTER;
147 cursor->
rel_pos = BTR_PCUR_BEFORE;
157 cursor->block_when_stored = block;
223 ut_ad(mtr->state == MTR_ACTIVE);
227 if (UNIV_UNLIKELY(cursor->
old_stored != BTR_PCUR_OLD_STORED)
228 || UNIV_UNLIKELY(cursor->
pos_state != BTR_PCUR_WAS_POSITIONED
229 && cursor->
pos_state != BTR_PCUR_IS_POSITIONED)) {
240 (cursor->
rel_pos == BTR_PCUR_AFTER_LAST_IN_TREE
241 || cursor->
rel_pos == BTR_PCUR_BEFORE_FIRST_IN_TREE)) {
246 btr_cur_open_at_index_side(
247 cursor->
rel_pos == BTR_PCUR_BEFORE_FIRST_IN_TREE,
248 index, latch_mode, btr_pcur_get_btr_cur(cursor), mtr);
251 cursor->
pos_state = BTR_PCUR_IS_POSITIONED;
252 cursor->block_when_stored = btr_pcur_get_block(cursor);
266 cursor->block_when_stored,
269 cursor->
pos_state = BTR_PCUR_IS_POSITIONED;
271 buf_block_dbg_add_level(btr_pcur_get_block(cursor),
274 if (cursor->
rel_pos == BTR_PCUR_ON) {
277 const ulint* offsets1;
278 const ulint* offsets2;
282 rec = btr_pcur_get_rec(cursor);
285 offsets1 = rec_get_offsets(
288 offsets2 = rec_get_offsets(
293 rec, offsets1, offsets2,
314 if (UNIV_LIKELY(cursor->
rel_pos == BTR_PCUR_ON)) {
316 }
else if (cursor->
rel_pos == BTR_PCUR_AFTER) {
324 cursor, 0, file, line, mtr);
329 if (cursor->
rel_pos == BTR_PCUR_ON
333 btr_pcur_get_rec(cursor), index,
334 NULL, ULINT_UNDEFINED, &heap))) {
340 cursor->block_when_stored = btr_pcur_get_block(cursor);
342 cursor->block_when_stored);
379 block = btr_pcur_get_block(cursor);
385 cursor->
pos_state = BTR_PCUR_WAS_POSITIONED;
414 page = btr_pcur_get_page(cursor);
423 next_page = buf_block_get_frame(next_block);
424 #ifdef UNIV_BTR_DEBUG
487 btr_pcur_restore_position(latch_mode2, cursor, mtr);
489 page = btr_pcur_get_page(cursor);
496 prev_block = btr_pcur_get_btr_cur(cursor)->left_block;
502 btr_pcur_get_page_cur(cursor));
509 prev_block = btr_pcur_get_btr_cur(cursor)->left_block;
578 if ((mode == PAGE_CUR_GE) || (mode == PAGE_CUR_G)) {
585 ut_ad((mode == PAGE_CUR_LE) || (mode == PAGE_CUR_L));
UNIV_INLINE ulint page_is_comp(const page_t *page)
UNIV_INLINE void btr_pcur_open_with_no_init_func(dict_index_t *index, const dtuple_t *tuple, ulint mode, ulint latch_mode, btr_pcur_t *cursor, ulint has_search_latch, const char *file, ulint line, mtr_t *mtr)
UNIV_INLINE void btr_leaf_page_release(buf_block_t *block, ulint latch_mode, mtr_t *mtr)
UNIV_INTERN dtuple_t * dict_index_build_data_tuple(dict_index_t *index, rec_t *rec, ulint n_fields, mem_heap_t *heap)
UNIV_INLINE ibool btr_pcur_is_on_user_rec(const btr_pcur_t *cursor)
UNIV_INLINE int cmp_rec_rec(const rec_t *rec1, const rec_t *rec2, const ulint *offsets1, const ulint *offsets2, dict_index_t *index)
UNIV_INLINE page_t * page_align(const void *ptr) __attribute__((const ))
UNIV_INTERN ibool buf_page_optimistic_get(ulint rw_latch, buf_block_t *block, ib_uint64_t modify_clock, const char *file, ulint line, mtr_t *mtr)
UNIV_INLINE ulint buf_block_get_zip_size(const buf_block_t *block) __attribute__((pure))
UNIV_INTERN int cmp_dtuple_rec(const dtuple_t *dtuple, const rec_t *rec, const ulint *offsets)
UNIV_INLINE ulint page_get_n_recs(const page_t *page)
UNIV_INLINE void * ut_memcpy(void *dest, const void *sour, ulint n)
UNIV_INTERN void ut_print_buf(FILE *file, const void *buf, ulint len)
UNIV_INTERN void btr_pcur_open_on_user_rec_func(dict_index_t *index, const dtuple_t *tuple, ulint mode, ulint latch_mode, btr_pcur_t *cursor, const char *file, ulint line, mtr_t *mtr)
UNIV_INLINE rec_t * page_rec_get_next(rec_t *rec)
UNIV_INLINE void page_cur_set_before_first(const buf_block_t *block, page_cur_t *cur)
UNIV_INLINE ibool btr_pcur_is_before_first_on_page(const btr_pcur_t *cursor)
#define mem_heap_free(heap)
#define btr_block_get(space, zip_size, page_no, mode, mtr)
UNIV_INLINE ulint btr_page_get_prev(const page_t *page, mtr_t *mtr)
ibool check_index_page_at_flush
UNIV_INLINE ibool btr_pcur_is_before_first_in_tree(btr_pcur_t *cursor, mtr_t *mtr)
UNIV_INLINE ulint btr_page_get_next(const page_t *page, mtr_t *mtr)
UNIV_INLINE rec_t * page_rec_get_prev(rec_t *rec)
UNIV_INTERN void btr_pcur_move_backward_from_page(btr_pcur_t *cursor, mtr_t *mtr)
UNIV_INLINE ulint buf_block_get_page_no(const buf_block_t *block) __attribute__((pure))
UNIV_INTERN void mtr_commit(mtr_t *mtr) __attribute__((nonnull))
UNIV_INLINE void btr_pcur_init(btr_pcur_t *pcur)
UNIV_INTERN void trx_print(FILE *f, trx_t *trx, ulint max_query_len)
UNIV_INTERN void btr_pcur_copy_stored_position(btr_pcur_t *pcur_receive, btr_pcur_t *pcur_donate)
UNIV_INLINE ulint page_offset(const void *ptr) __attribute__((const ))
UNIV_INTERN void btr_pcur_store_position(btr_pcur_t *cursor, mtr_t *mtr)
UNIV_INLINE void btr_pcur_move_to_prev_on_page(btr_pcur_t *cursor)
UNIV_INTERN void page_check_dir(const page_t *page)
#define mem_heap_create(N)
UNIV_INLINE dict_index_t * btr_cur_get_index(btr_cur_t *cursor)
UNIV_INTERN ibool btr_pcur_restore_position_func(ulint latch_mode, btr_pcur_t *cursor, const char *file, ulint line, mtr_t *mtr)
UNIV_INLINE ulint buf_block_get_space(const buf_block_t *block) __attribute__((pure))
UNIV_INLINE void page_cur_set_after_last(const buf_block_t *block, page_cur_t *cur)
UNIV_INLINE ibool page_rec_is_supremum_low(ulint offset) __attribute__((const ))
UNIV_INLINE void mtr_start(mtr_t *mtr) __attribute__((nonnull))
UNIV_INLINE ibool btr_pcur_move_to_next_user_rec(btr_pcur_t *cursor, mtr_t *mtr)
UNIV_INTERN void btr_pcur_free_for_mysql(btr_pcur_t *cursor)
UNIV_INLINE ibool btr_pcur_is_after_last_on_page(const btr_pcur_t *cursor)
UNIV_INLINE ib_uint64_t buf_block_get_modify_clock(buf_block_t *block)
UNIV_INTERN rec_t * dict_index_copy_rec_order_prefix(const dict_index_t *index, const rec_t *rec, ulint *n_fields, byte **buf, ulint *buf_size)
UNIV_INTERN btr_pcur_t * btr_pcur_create_for_mysql(void)
UNIV_INTERN void btr_pcur_move_to_next_page(btr_pcur_t *cursor, mtr_t *mtr)
UNIV_INTERN ibool btr_pcur_move_to_prev(btr_pcur_t *cursor, mtr_t *mtr)
UNIV_INTERN void btr_pcur_release_leaf(btr_pcur_t *cursor, mtr_t *mtr)
UNIV_INLINE ibool page_rec_is_infimum_low(ulint offset) __attribute__((const ))
UNIV_INLINE void btr_pcur_open_func(dict_index_t *index, const dtuple_t *tuple, ulint mode, ulint latch_mode, btr_pcur_t *cursor, const char *file, ulint line, mtr_t *mtr)