2009-02-17 09:24:40 +00:00
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
Copyright (c) 1994, 2009, Innobase Oy. All Rights Reserved.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
|
|
the terms of the GNU General Public License as published by the Free Software
|
|
|
|
Foundation; version 2 of the License.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
|
|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
|
|
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
/************************************************************************
|
|
|
|
The page cursor
|
|
|
|
|
|
|
|
Created 10/4/1994 Heikki Tuuri
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
#include "page0page.h"
|
2006-10-20 12:45:53 +00:00
|
|
|
#include "buf0types.h"
|
2005-10-27 07:29:40 +00:00
|
|
|
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
#ifdef UNIV_DEBUG
|
2005-10-27 07:29:40 +00:00
|
|
|
/*************************************************************
|
|
|
|
Gets pointer to the page frame where the cursor is positioned. */
|
|
|
|
UNIV_INLINE
|
|
|
|
page_t*
|
|
|
|
page_cur_get_page(
|
|
|
|
/*==============*/
|
|
|
|
/* out: page */
|
|
|
|
page_cur_t* cur) /* in: page cursor */
|
|
|
|
{
|
|
|
|
ut_ad(cur);
|
2007-10-22 08:16:35 +00:00
|
|
|
ut_ad(page_align(cur->rec) == cur->block->frame);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-10-09 16:22:47 +00:00
|
|
|
return(page_align(cur->rec));
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
2006-10-20 12:45:53 +00:00
|
|
|
/*************************************************************
|
|
|
|
Gets pointer to the buffer block where the cursor is positioned. */
|
|
|
|
UNIV_INLINE
|
|
|
|
buf_block_t*
|
|
|
|
page_cur_get_block(
|
|
|
|
/*===============*/
|
|
|
|
/* out: page */
|
|
|
|
page_cur_t* cur) /* in: page cursor */
|
|
|
|
{
|
|
|
|
ut_ad(cur);
|
|
|
|
ut_ad(page_align(cur->rec) == cur->block->frame);
|
|
|
|
return(cur->block);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************
|
|
|
|
Gets pointer to the page frame where the cursor is positioned. */
|
|
|
|
UNIV_INLINE
|
|
|
|
page_zip_des_t*
|
|
|
|
page_cur_get_page_zip(
|
|
|
|
/*==================*/
|
|
|
|
/* out: page */
|
|
|
|
page_cur_t* cur) /* in: page cursor */
|
|
|
|
{
|
|
|
|
return(buf_block_get_page_zip(page_cur_get_block(cur)));
|
|
|
|
}
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
/*************************************************************
|
|
|
|
Gets the record where the cursor is positioned. */
|
|
|
|
UNIV_INLINE
|
|
|
|
rec_t*
|
|
|
|
page_cur_get_rec(
|
|
|
|
/*=============*/
|
|
|
|
/* out: record */
|
|
|
|
page_cur_t* cur) /* in: page cursor */
|
|
|
|
{
|
|
|
|
ut_ad(cur);
|
2006-10-20 12:45:53 +00:00
|
|
|
ut_ad(page_align(cur->rec) == cur->block->frame);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
return(cur->rec);
|
|
|
|
}
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
#endif /* UNIV_DEBUG */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/*************************************************************
|
2006-02-23 19:25:29 +00:00
|
|
|
Sets the cursor object to point before the first user record
|
2005-10-27 07:29:40 +00:00
|
|
|
on the page. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
page_cur_set_before_first(
|
|
|
|
/*======================*/
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
const buf_block_t* block, /* in: index page */
|
|
|
|
page_cur_t* cur) /* in: cursor */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
cur->block = (buf_block_t*) block;
|
|
|
|
cur->rec = page_get_infimum_rec(buf_block_get_frame(cur->block));
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************
|
2006-02-23 19:25:29 +00:00
|
|
|
Sets the cursor object to point after the last user record on
|
2005-10-27 07:29:40 +00:00
|
|
|
the page. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
page_cur_set_after_last(
|
|
|
|
/*====================*/
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
const buf_block_t* block, /* in: index page */
|
|
|
|
page_cur_t* cur) /* in: cursor */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
cur->block = (buf_block_t*) block;
|
|
|
|
cur->rec = page_get_supremum_rec(buf_block_get_frame(cur->block));
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************
|
|
|
|
Returns TRUE if the cursor is before first user record on page. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ibool
|
|
|
|
page_cur_is_before_first(
|
|
|
|
/*=====================*/
|
|
|
|
/* out: TRUE if at start */
|
|
|
|
const page_cur_t* cur) /* in: cursor */
|
|
|
|
{
|
2007-10-22 08:16:35 +00:00
|
|
|
ut_ad(cur);
|
|
|
|
ut_ad(page_align(cur->rec) == cur->block->frame);
|
2005-10-27 07:29:40 +00:00
|
|
|
return(page_rec_is_infimum(cur->rec));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************
|
|
|
|
Returns TRUE if the cursor is after last user record. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ibool
|
|
|
|
page_cur_is_after_last(
|
|
|
|
/*===================*/
|
|
|
|
/* out: TRUE if at end */
|
|
|
|
const page_cur_t* cur) /* in: cursor */
|
|
|
|
{
|
2007-10-22 08:16:35 +00:00
|
|
|
ut_ad(cur);
|
|
|
|
ut_ad(page_align(cur->rec) == cur->block->frame);
|
2005-10-27 07:29:40 +00:00
|
|
|
return(page_rec_is_supremum(cur->rec));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************
|
|
|
|
Positions the cursor on the given record. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
page_cur_position(
|
|
|
|
/*==============*/
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
const rec_t* rec, /* in: record on a page */
|
|
|
|
const buf_block_t* block, /* in: buffer block containing
|
|
|
|
the record */
|
|
|
|
page_cur_t* cur) /* out: page cursor */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
2006-10-20 12:45:53 +00:00
|
|
|
ut_ad(rec && block && cur);
|
|
|
|
ut_ad(page_align(rec) == block->frame);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
cur->rec = (rec_t*) rec;
|
|
|
|
cur->block = (buf_block_t*) block;
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************
|
|
|
|
Invalidates a page cursor by setting the record pointer NULL. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
page_cur_invalidate(
|
|
|
|
/*================*/
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
page_cur_t* cur) /* out: page cursor */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
ut_ad(cur);
|
|
|
|
|
|
|
|
cur->rec = NULL;
|
2006-10-20 12:45:53 +00:00
|
|
|
cur->block = NULL;
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************
|
|
|
|
Moves the cursor to the next record on page. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
page_cur_move_to_next(
|
|
|
|
/*==================*/
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
page_cur_t* cur) /* in/out: cursor; must not be after last */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
ut_ad(!page_cur_is_after_last(cur));
|
|
|
|
|
|
|
|
cur->rec = page_rec_get_next(cur->rec);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************
|
|
|
|
Moves the cursor to the previous record on page. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
page_cur_move_to_prev(
|
|
|
|
/*==================*/
|
branches/zip: Remove const warnings reported by GCC 4.2.1.
page_cur_set_before_first(), page_cur_set_after_last(),
page_cur_position(): Add const qualifiers to buf_block_t and rec.
A better solution would be to define a const_page_cur_t and a
set of accessors, but it would lead to severe code duplication.
page_rec_get_n_recs_before(): Add const qualifiers.
page_dir_get_nth_slot(): Define as a const-preserving macro.
page_dir_slot_get_rec(), page_dir_slot_get_n_owned(),
page_dir_find_owner_slot(), page_check_dir(): Add const qualifiers.
page_rec_get_next_low(): Add const qualifiers.
page_rec_get_next_const(), page_rec_get_prev_const(): New functions,
based on the const-less page_rec_get_next() and page_rec_get_prev().
page_cur_get_page(), page_cur_get_block(), page_cur_get_page_zip(),
page_cur_get_rec(): Define as const-preserving macros.
page_cur_try_search_shortcut(), page_cur_search_with_match():
Add const qualifiers.
buf_page_get_mutex(): Add a const qualifier to buf_page_t*.
rec_get_next_ptr_const(): Const variant of rec_get_next_ptr().
2007-10-18 07:12:05 +00:00
|
|
|
page_cur_t* cur) /* in/out: page cursor, not before first */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
ut_ad(!page_cur_is_before_first(cur));
|
|
|
|
|
|
|
|
cur->rec = page_rec_get_prev(cur->rec);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
Searches the right position for a page cursor. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
page_cur_search(
|
|
|
|
/*============*/
|
2007-10-22 08:16:35 +00:00
|
|
|
/* out: number of matched
|
|
|
|
fields on the left */
|
|
|
|
const buf_block_t* block, /* in: buffer block */
|
|
|
|
const dict_index_t* index, /* in: record descriptor */
|
|
|
|
const dtuple_t* tuple, /* in: data tuple */
|
|
|
|
ulint mode, /* in: PAGE_CUR_L,
|
|
|
|
PAGE_CUR_LE, PAGE_CUR_G, or
|
|
|
|
PAGE_CUR_GE */
|
|
|
|
page_cur_t* cursor) /* out: page cursor */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
ulint low_matched_fields = 0;
|
|
|
|
ulint low_matched_bytes = 0;
|
|
|
|
ulint up_matched_fields = 0;
|
|
|
|
ulint up_matched_bytes = 0;
|
|
|
|
|
|
|
|
ut_ad(dtuple_check_typed(tuple));
|
|
|
|
|
2006-10-20 12:45:53 +00:00
|
|
|
page_cur_search_with_match(block, index, tuple, mode,
|
2006-08-29 09:30:31 +00:00
|
|
|
&up_matched_fields,
|
|
|
|
&up_matched_bytes,
|
|
|
|
&low_matched_fields,
|
|
|
|
&low_matched_bytes,
|
|
|
|
cursor);
|
2005-10-27 07:29:40 +00:00
|
|
|
return(low_matched_fields);
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************
|
|
|
|
Inserts a record next to page cursor. Returns pointer to inserted record if
|
|
|
|
succeed, i.e., enough space available, NULL otherwise. The cursor stays at
|
2007-05-15 09:31:41 +00:00
|
|
|
the same logical position, but the physical position may change if it is
|
|
|
|
pointing to a compressed page that was reorganized. */
|
2005-10-27 07:29:40 +00:00
|
|
|
UNIV_INLINE
|
|
|
|
rec_t*
|
|
|
|
page_cur_tuple_insert(
|
|
|
|
/*==================*/
|
|
|
|
/* out: pointer to record if succeed, NULL
|
|
|
|
otherwise */
|
2007-05-15 09:31:41 +00:00
|
|
|
page_cur_t* cursor, /* in/out: a page cursor */
|
2006-10-20 08:30:07 +00:00
|
|
|
const dtuple_t* tuple, /* in: pointer to a data tuple */
|
2005-10-27 07:29:40 +00:00
|
|
|
dict_index_t* index, /* in: record descriptor */
|
branches/zip: Make merge sort handle externally stored columns.
Some things still fail in innodb-index.test, and there seems to be
a race condition (data dictionary lock wait) when running with --valgrind.
dfield_t: Add an "external storage" flag, dfield->ext.
dfield_is_null(), dfield_is_ext(), dfield_set_ext(), dfield_set_null():
New functions.
dfield_copy(), dfield_copy_data(): Add const qualifiers, fix in/out comments.
data_write_sql_null(): Use memset().
big_rec_field_t: Replace byte* data with const void* data.
ut_ulint_sort(): Remove.
upd_field_t: Remove extern_storage.
upd_node_t: Replace ext_vec, n_ext_vec with n_ext.
row_merge_copy_blobs(): New function.
row_ins_index_entry(): Add the parameter "ibool foreign" for suppressing
foreign key checks during fast index creation or when inserting into
secondary indexes.
btr_page_insert_fits(): Add const qualifiers.
btr_cur_add_ext(), upd_ext_vec_contains(): Remove.
dfield_print_also_hex(), dfield_print(): Replace if...else if with switch.
Observe dfield_is_ext().
2007-06-21 09:43:15 +00:00
|
|
|
ulint n_ext, /* in: number of externally stored columns */
|
2006-08-17 11:57:51 +00:00
|
|
|
mtr_t* mtr) /* in: mini-transaction handle, or NULL */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
2006-02-23 14:45:12 +00:00
|
|
|
mem_heap_t* heap;
|
|
|
|
ulint* offsets;
|
branches/zip: dtuple_convert_big_rec(): Do not store anything locally
of externally stored columns, and fix bugs introduced in r873. (Bug #22496)
btr_page_get_sure_split_rec(), btr_page_insert_fits(),
rec_get_converted_size(), rec_convert_dtuple_to_rec(),
rec_convert_dtuple_to_rec_old(), rec_convert_dtuple_to_rec_new():
Add parameters ext and n_ext. Flag external fields during the
conversion.
rec_set_field_extern_bits(), rec_set_field_extern_bits_new(),
rec_offs_set_nth_extern(), rec_set_nth_field_extern_bit_old():
Remove. The bits are set by rec_convert_dtuple_to_rec().
page_cur_insert_rec_low(): Remove the parameters ext and n_ext.
btr_cur_add_ext(): New utility function for updating and sorting ext[].
Low-level functions now expect the array to be in ascending order
for performance reasons. Used in btr_cur_optimistic_insert(),
btr_cur_pessimistic_insert(), and btr_cur_pessimistic_update().
btr_cur_optimistic_insert(): Remove some defensive code, because we cannot
compute the added parameters of rec_get_converted_size().
btr_push_update_extern_fields(): Sort the array. Require the array to
be twice the maximum usage, so that ut_ulint_sort() can be used.
dtuple_convert_big_rec(): Allocate new space for the BLOB pointer,
to avoid overwriting prefix indexes to the same column. Adapt
dtuple_convert_back_big_rec().
row_build_index_entry(): Fetch the columns also for prefix indexes of
the clustered index.
page_zip_apply_log(), page_zip_decompress_clust(): Allow externally
stored fields to lack a locally stored part.
2006-09-29 10:40:42 +00:00
|
|
|
ulint size
|
branches/zip: Make merge sort handle externally stored columns.
Some things still fail in innodb-index.test, and there seems to be
a race condition (data dictionary lock wait) when running with --valgrind.
dfield_t: Add an "external storage" flag, dfield->ext.
dfield_is_null(), dfield_is_ext(), dfield_set_ext(), dfield_set_null():
New functions.
dfield_copy(), dfield_copy_data(): Add const qualifiers, fix in/out comments.
data_write_sql_null(): Use memset().
big_rec_field_t: Replace byte* data with const void* data.
ut_ulint_sort(): Remove.
upd_field_t: Remove extern_storage.
upd_node_t: Replace ext_vec, n_ext_vec with n_ext.
row_merge_copy_blobs(): New function.
row_ins_index_entry(): Add the parameter "ibool foreign" for suppressing
foreign key checks during fast index creation or when inserting into
secondary indexes.
btr_page_insert_fits(): Add const qualifiers.
btr_cur_add_ext(), upd_ext_vec_contains(): Remove.
dfield_print_also_hex(), dfield_print(): Replace if...else if with switch.
Observe dfield_is_ext().
2007-06-21 09:43:15 +00:00
|
|
|
= rec_get_converted_size(index, tuple, n_ext);
|
2006-02-23 14:45:12 +00:00
|
|
|
rec_t* rec;
|
|
|
|
|
|
|
|
heap = mem_heap_create(size
|
2006-08-29 09:30:31 +00:00
|
|
|
+ (4 + REC_OFFS_HEADER_SIZE
|
|
|
|
+ dtuple_get_n_fields(tuple))
|
|
|
|
* sizeof *offsets);
|
2007-08-01 10:38:07 +00:00
|
|
|
rec = rec_convert_dtuple_to_rec((byte*) mem_heap_alloc(heap, size),
|
branches/zip: Make merge sort handle externally stored columns.
Some things still fail in innodb-index.test, and there seems to be
a race condition (data dictionary lock wait) when running with --valgrind.
dfield_t: Add an "external storage" flag, dfield->ext.
dfield_is_null(), dfield_is_ext(), dfield_set_ext(), dfield_set_null():
New functions.
dfield_copy(), dfield_copy_data(): Add const qualifiers, fix in/out comments.
data_write_sql_null(): Use memset().
big_rec_field_t: Replace byte* data with const void* data.
ut_ulint_sort(): Remove.
upd_field_t: Remove extern_storage.
upd_node_t: Replace ext_vec, n_ext_vec with n_ext.
row_merge_copy_blobs(): New function.
row_ins_index_entry(): Add the parameter "ibool foreign" for suppressing
foreign key checks during fast index creation or when inserting into
secondary indexes.
btr_page_insert_fits(): Add const qualifiers.
btr_cur_add_ext(), upd_ext_vec_contains(): Remove.
dfield_print_also_hex(), dfield_print(): Replace if...else if with switch.
Observe dfield_is_ext().
2007-06-21 09:43:15 +00:00
|
|
|
index, tuple, n_ext);
|
2006-02-23 14:45:12 +00:00
|
|
|
offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap);
|
|
|
|
|
2007-02-01 09:53:26 +00:00
|
|
|
if (buf_block_get_page_zip(cursor->block)) {
|
|
|
|
rec = page_cur_insert_rec_zip(&cursor->rec, cursor->block,
|
|
|
|
index, rec, offsets, mtr);
|
|
|
|
} else {
|
|
|
|
rec = page_cur_insert_rec_low(cursor->rec,
|
|
|
|
index, rec, offsets, mtr);
|
|
|
|
}
|
|
|
|
|
2006-02-23 14:45:12 +00:00
|
|
|
mem_heap_free(heap);
|
|
|
|
return(rec);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************
|
|
|
|
Inserts a record next to page cursor. Returns pointer to inserted record if
|
|
|
|
succeed, i.e., enough space available, NULL otherwise. The cursor stays at
|
2007-05-15 09:31:41 +00:00
|
|
|
the same logical position, but the physical position may change if it is
|
|
|
|
pointing to a compressed page that was reorganized. */
|
2005-10-27 07:29:40 +00:00
|
|
|
UNIV_INLINE
|
|
|
|
rec_t*
|
|
|
|
page_cur_rec_insert(
|
|
|
|
/*================*/
|
|
|
|
/* out: pointer to record if succeed, NULL
|
|
|
|
otherwise */
|
2007-05-15 09:31:41 +00:00
|
|
|
page_cur_t* cursor, /* in/out: a page cursor */
|
|
|
|
const rec_t* rec, /* in: record to insert */
|
2005-10-27 07:29:40 +00:00
|
|
|
dict_index_t* index, /* in: record descriptor */
|
2006-03-14 14:38:45 +00:00
|
|
|
ulint* offsets,/* in/out: rec_get_offsets(rec, index) */
|
2006-08-17 11:57:51 +00:00
|
|
|
mtr_t* mtr) /* in: mini-transaction handle, or NULL */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
2007-02-01 09:53:26 +00:00
|
|
|
if (buf_block_get_page_zip(cursor->block)) {
|
|
|
|
return(page_cur_insert_rec_zip(&cursor->rec, cursor->block,
|
|
|
|
index, rec, offsets, mtr));
|
|
|
|
} else {
|
|
|
|
return(page_cur_insert_rec_low(cursor->rec,
|
|
|
|
index, rec, offsets, mtr));
|
|
|
|
}
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|